CakePHP cakedc search найти все товары по категориям и категориям для детей

Я использую поисковый плагин CakeDC. У меня есть простая корзина с продуктами, которые относятся исключительно к подкатегориям. например, подкатегориями продуктов питания могут быть фрукты, овощи, мясо и т. д., поэтому груша относится только к категории фруктов.

Итак, у меня есть раскрывающийся список со всеми категориями, если я выберу еду из родительской категории, ничего не появится, если я выберу фрукты, то фрукты появятся.

Поведение, которое я хочу, состоит в том, чтобы сначала показывать только родительские категории, поэтому еда, спортивные товары и т. д., а затем, когда они выбирают еду, я хочу, чтобы произошло несколько разных вещей:

1) показать все продукты, связанные с этой категорией, а также все дочерние категории

2) отобразить еще один раскрывающийся список с фруктами, овощами, мясом и т. д. для дальнейшей фильтрации

3) если в этой подкатегории есть подкатегории, показывать и их дочерние элементы, пока не будет отфильтровано больше.

Мой код прямо сейчас позволяет мне находить только прямые ассоциации с категорией

Вот код моей модели Product.php

 public $actsAs = array('Search.Searchable');

    public $filterArgs = array(
        array('name' => 'cid', 'field' => 'category_id', 'type' => 'value', 'method' => 'query', 'method' => 'query', 'allowEmpty' => true);


    public function filterCat($data, $field = null) {
        if (empty($data['cid'])) {
            return array();
        }
        $cat = $data['cid'];
        return array(
            'OR' => array(
                $this->alias . '.category_id' => $cat,
                ));
    }

Я искал повсюду решение, которое, как мне кажется, было бы простым, но ничего не нашел. Любая помощь высоко ценится!


person CertifiedGeek    schedule 22.09.2013    source источник
comment
Является ли ваша модель категории деревом? (действует как Дерево). Примечание. Вы всегда должны указывать точную версию cakephp, которую вы используете.   -  person mark    schedule 22.09.2013
comment
Да, это дерево, и версия где-то около 2.3, я отправлю точную версию, когда вернусь домой сегодня позже.   -  person CertifiedGeek    schedule 23.09.2013
comment
Тогда может быть проще сначала получить все дочерние идентификаторы, а затем использовать поиск IN здесь с ними.   -  person mark    schedule 23.09.2013


Ответы (1)


Мне удалось добиться желаемой функциональности, изменив функцию filterCat(), как показано ниже.

public function filterCat($data, $field = null) {
    if (empty($data['cid'])) {
        return array();
    }
    $cat[] = $data['cid'];
    // Get child categories
    $children = $this->Category->children($cat['0'],false,'id');
    // extract the ids of the child categories
    $children = Hash::extract($children, '{n}.Category.id');
    // if no child categories, return requested category id
    if(empty($children)){
        return array(                
           $this->alias . '.category_id' => $cat);
    }else{
    // else merge array of child category ids with parent category id
    // and create SQL string to match the list of category ids
        $children = array_merge($cat,$children);
        return array(                
            $this->alias . '.category_id IN ' => $children);    
    }
}

Функция ищет дочерние категории, если дочерних категорий нет, возвращает строку поиска с идентификатором категории. Если есть дочерние категории, он возвращает строку поиска с идентификаторами родительской и дочерней категорий в списке.

Я знаю, что это старый вопрос, но, надеюсь, это может помочь другим.

CakePHP версии 2.2.3 и плагин поиска CakeDC версии 2.1

person CertifiedGeek    schedule 29.07.2014