Фильтровать коллекцию страниц CMS по названию или содержанию


Я работаю над модулем, чтобы сделать некоторые страницы CMS доступными для поиска в интерфейсе. Прямо сейчас у меня небольшие проблемы с фильтрацией страниц. Я получаю коллекцию, фильтрую ее по добавленному полю "is_searchable", которое работает нормально. Когда я пытаюсь отфильтровать его по названию или содержимому, используя оператор , подобный , он либо не возвращает результатов, либо каждый результат, независимо от того, соответствует ли это названию/содержимому вообще или нет. Вот что я использую, так что далеко:

$results = Mage::getModel('cms/page')->getCollection()
               ->addFieldToFilter('title', array('like'=> '%' . $search . '%'))
               ->addFieldToFilter('content', array('like'=>'%' . $search . '%'))
               ->addFieldToFilter('is_searchable', 1);

Я также попытался использовать addAttributeToFilter(), но получил сообщение об ошибке, что эта функция не существует в этой модели. Не уверен, что я здесь делаю неправильно, но любая помощь или направление будут оценены. Спасибо!

Author: Fabian Schmengler, 2016-01-22

2 answers

Ответ @Mauronigrele близок, но фактический синтаксис для объединения нескольких условий для разных полей с OR отличается.

Должно работать следующее:

$results = Mage::getModel('cms/page')->getCollection()
    ->addFieldToFilter(
        ['title', 'content'],
        [['like' => "%{$search}%"], ['like' => "%{$search}%"]]
     )
     ->addFieldToFilter('is_searchable', 1);

Вы можете найти более подробную документацию addFieldToFilter() в этом ответе: addFilter vs addFieldToFilter

 2
Author: Fabian Schmengler, 2017-04-13 12:54:58

В этом запросе вы ищете страницы как с заголовком, так и с содержимым, например, я имею в виду $search, А не ИЛИ.

Если вам нужно построить оператор OR, правильный синтаксис:

$results = Mage::getModel('cms/page')->getCollection()
     ->addFieldToFilter(array(
        array('field'=> 'title','like' => "%{$search}%"),
        array('field'=> 'content','like' => "%{$search}%"),
     ))
     ->addFieldToFilter('is_searchable', 1);

Вы всегда можете просмотреть свой запрос, регистрирующий выбор:

Mage::log($results->getSelectSql(true),7,'my-sql.log');

Помните, что метод addAttributeToFilter() доступен только для объектов EAV, и это: каталог_продукт, каталог_категория, клиент_кастомер и адрес_пользователя

 2
Author: MauroNigrele, 2016-01-22 00:47:17