Как оказалось, одинаковые (или очень похожие) названия материалов - это частое явление.
Ок, попробуем сделать мир лучше.
Далее мы будем обсуждать как сделать так, чтобы вот эта форма поиска, могла найти что-нибудь не только в имени материала, но и в свойствах. По умолчанию, компонент 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. А жаль...













