Доработка компонента JA K2 Extra fields Filter and Search (CMS Joomla)

  • Создано 18.12.2014 09:42

Наверняка, все, кто сталкивался с созданием каталога товаров на CMS Joomla знают о существовании такого замечательного компонента каталога товаров, как K2. Для этого компонента имеется дополнительное расширение для организации поиска по каталогу, в том числе, и по дополнительным полям каталога - JA K2 Extra fields Filter and Search. С простыми задачами поиска расширение справляется "на ура", но если Вы будете создавать сложный поиск, то столкнетесь с существенными недочетами и недоработками JA K2 Extra fields Filter and Search. Как это исправить, я расскажу Вам в этой статье.

В JA K2 Extra fields Filter and Search есть возможность ограничить поиск по определенным категориям. В модуле JAK2 Extra fields Filter and Search устанавливаем переключатель "Фильтр по категории" в положение "Включено" и в списке выбираем нужные нам категории. Если выбрать пункт "Все категории", то поиск будет работать корректно, но если выбрать лишь несколько категорий, то поисковый запрос строится неверно.

К примеру, в форме поиска у нас есть два поля - "Категория" (выпадающий список) и "Год выпуска" (дополнительное поле). Если при поиске мы не выберем одну категорию, а лишь укажем искомый год выпуска, то запрос будет выглядеть следующим образом:

... i.catid = '3' OR i.catid = '18' OR i.catid = '19' AND i.extra_fields...

В данном запросе для того, чтобы указанный год был найден в одной из перечисленных категорий, не хватает скобок:

... (i.catid = '3' OR i.catid = '18' OR i.catid = '19') AND (i.extra_fields...

В файле /components/com_jak2filter/models/itemlist.php находим строку:

$sql .= " AND ".implode('OR ',$wherecate);

Добавляем скобки:

$sql .= " AND (".implode('OR ',$wherecate).")";

Ещё одна пробема JA K2 Extra fields Filter and Search - поиск по дополнительным полям русскоязычных слов. С русским языком поиск по дополнительным полям не дружит, но это можно исправить. В компоненте реализован поиск по полю extra_fields, в этом поле русскоязычные слова храняться в переконвертированном виде, но ведь есть поле extra_fields_search, в котором значения дополнительных полей хранятся в том виде, в котором они поступили из компонента K2.

В файле /components/com_jak2filter/models/itemlist.php находим блок:

case 'txt':
$value = $this->convert_string_non_latin($this->rgEscapse($value));
$searchPattern = $prefix.'"[^"]*'.$value.'[^"]*"';// ~ LIKE '%string%'
$where[] = "(i.extra_fields REGEXP '".$searchPattern."')";
break;

Строку $value = $this->convert_string_non_latin($this->rgEscapse($value)); нужно закомментировать, либо вовсе удалить.

Строка $searchPattern = $prefix.'"[^"]*'.$value.'[^"]*"';// ~ LIKE '%string%' нам тоже не нужна.

Строку:

$where[] = "(i.extra_fields REGEXP '".$searchPattern."')";

нужно заменить на:

$where[] = "(i.extra_fields_search LIKE '%".$value."%')";

Таким образом мы перенаправили поиск текста в дополнительных полях в поле extra_fields_search, в котором хранятся значения дополнительных полей в исходном виде.

ICH BIN KAKAI_I_IKA