Как оказалось, одинаковые (или очень похожие) названия материалов - это частое явление.
Ок, попробуем сделать мир лучше.
Далее мы будем обсуждать как сделать так, чтобы вот эта форма поиска, могла найти что-нибудь не только в имени материала, но и в свойствах. По умолчанию, компонент Zoo будет искать только в Названии, псевдониме и теге, причем ищет текст "как есть".
Какова наша цель?
- Хотим искать во всех дополнительных полях.
- "Аддон" - если указываем несколько слов через пробел, то поиск будет работать по каждому слово отдельно и покажет общий результат. Например, фраза "Nexus 1Gb" сможет найти материал у которого в названии есть Nexus и одно из полей заполнено "1Gb". Штуковина экспериментальная, далеко не всем пригодится.
Поисковый запрос создается прямо в одном из системных файлов и я не могу повлиять на него никаким расширением через API. Поэтому берем и аккуратно меняем как написано ниже.
Что делать?
Открываем файл administrator\components\com_zoo\controllers\item.php
И находим этот кусок кода (строки могут не совпадать, это не страшно)
Меняем выделенное красным на один из следующих вариантов:
1 вариант - ищет фразу "как есть" во всех полях материалов
if ($search) { $from .= ' LEFT JOIN ' . ZOO_TABLE_TAG . ' AS t ON a.id = t.item_id'; $from .= ' LEFT JOIN ' . ZOO_TABLE_SEARCH . ' AS s ON a.id = s.item_id'; $where[] = '(LOWER(a.name) LIKE ' . $this->db->Quote('%' . $this->db->escape($search, true) . '%', false) . ' OR LOWER(t.name) LIKE ' . $this->db->Quote('%' . $this->db->escape($search, true) . '%', false) . ' OR LOWER(s.value) LIKE ' . $this->db->Quote('%' . $this->db->escape($search, true) . '%', false) . ' OR LOWER(a.alias) LIKE ' . $this->db->Quote('%' . $this->db->escape($search, true) . '%', false) . ')'; }2 вариант - делит фразу по пробелам и ищет любые совпадения искомых строк
if ($search) { $searchData = explode(' ', $search); $searchWhere = array(); $from .= ' LEFT JOIN ' . ZOO_TABLE_TAG . ' AS t ON a.id = t.item_id'; $from .= ' LEFT JOIN ' . ZOO_TABLE_SEARCH . ' AS s ON a.id = s.item_id'; foreach ($searchData as $searchWord) { $searchWord = JString::trim($searchWord); $searchWhere[] = implode(' OR ', array( 'LOWER(a.name) LIKE ' . $this->db->Quote('%' . $this->db->escape($searchWord, true) . '%', false), 'LOWER(t.name) LIKE ' . $this->db->Quote('%' . $this->db->escape($searchWord, true) . '%', false), 'LOWER(a.alias) LIKE ' . $this->db->Quote('%' . $this->db->escape($searchWord, true) . '%', false), 'LOWER(s.value) LIKE ' . $this->db->Quote('%' . $this->db->escape($searchWord, true) . '%', false) )); } $where[] = '((' . implode(') OR (', $searchWhere) . '))'; }3 вариант - Так же делит по пробелам, но поиск более точный
if ($search) { $searchData = explode(' ', $search); $searchWhere = array(); $from .= ' LEFT JOIN ' . ZOO_TABLE_SEARCH . ' AS s ON a.id = s.item_id'; foreach ($searchData as $searchWord) { $searchWord = JString::trim($searchWord); $searchWhere[] = implode(' AND ', array( 'LOWER(a.name) LIKE ' . $this->db->Quote('%' . $this->db->escape($searchWord, true) . '%', false), 'LOWER(s.value) LIKE ' . $this->db->Quote('%' . $this->db->escape($searchWord, true) . '%', false) )); } $where[] = '((' . implode(') OR (', $searchWhere) . '))'; }4 вариант - поиск только по кастомным полям
if ($search) { $searchData = explode(' ', $search); $searchWhere = array(); $from .= ' LEFT JOIN ' . ZOO_TABLE_SEARCH . ' AS s ON a.id = s.item_id'; foreach ($searchData as $searchWord) { $searchWord = JString::trim($searchWord); $searchWhere[] = implode(' AND ', array( 'LOWER(s.value) LIKE ' . $this->db->Quote('%' . $this->db->escape($searchWord, true) . '%', false) )); } $where[] = '((' . implode(') OR (', $searchWhere) . '))'; }Дисклаймер
- Это хак со всеми вытекающими, т.е после обновления Zoo затрется.
- Должен подходить практически любым версиям Zoo.
- Если сломается, то заметно будет только в админке.
- Я привел лишь несколько примеров для модификации SQL, если есть со-щие знания, то вы сможете сделать для себя более подходящий вариант.
- На очень больших сайтах будет тормозить. Надеюсь причины объяснять не нужно =)
- В JBZoo это не попадет, т.к нет нужного API Zoo. А жаль...