Обсуждение k2 tools модификация поиска

a777d2

Создатель
Регистрация
17 Сен 2012
Сообщения
31
Реакции
10
Добрый день, в продолжении темы Для просмотра ссылки Войди или Зарегистрируйся
Мы добавили 2 новых поля в компонент k2 и нам нужно сделать поиск по этим полям, есть стандарный модуль k2 tools search, его то мы и будем править!

Начнем...
К примеру мы создали 2 поля, это artikul и vincode (для автомобильного сайта)

Нужно править всего 2 файла:
Первое идем в плагин /plugins/search/k2/k2.php

Номер строчки 104, и добавляем в запрос наши значения
Код:
 if ($phrase == 'exact')
            {
                $text = JString::trim($text, '"');
                $escaped = K2_JVERSION == '15' ? $db->getEscaped($text, true) : $db->escape($text, true);
                $quoted = $db->Quote($escaped);
                $where = " ( LOWER(i.title) = ".$quoted." OR LOWER(i.artikul) = ".$quoted." OR LOWER(i.vincode) = ".$quoted." OR LOWER(i.introtext) = ".$quoted." OR LOWER(i.`fulltext`) = ".$quoted." OR LOWER(i.extra_fields_search) = ".$quoted." OR LOWER(i.image_caption) = ".$quoted." OR LOWER(i.image_credits) = ".$quoted." OR LOWER(i.video_caption) = ".$quoted." OR LOWER(i.video_credits) = ".$quoted." OR LOWER(i.metadesc) = ".$quoted." OR LOWER(i.metakey) = ".$quoted.") ";
            }
            else
            {
                $escaped = K2_JVERSION == '15' ? $db->getEscaped($text, true) : $db->escape($text, true);
                $quoted = $db->Quote('%'.$escaped.'%', false);
                $where = " ( LOWER(i.title) LIKE ".$quoted." OR LOWER(i.artikul) LIKE ".$quoted." OR LOWER(i.vincode) LIKE ".$quoted." OR LOWER(i.introtext) LIKE ".$quoted." OR LOWER(i.`fulltext`) LIKE ".$quoted." OR LOWER(i.extra_fields_search) LIKE ".$quoted." OR LOWER(i.image_caption) LIKE ".$quoted." OR LOWER(i.image_credits) LIKE ".$quoted." OR LOWER(i.video_caption) LIKE ".$quoted." OR LOWER(i.video_credits) LIKE ".$quoted." OR LOWER(i.metadesc) LIKE ".$quoted." OR LOWER(i.metakey) LIKE ".$quoted.") ";
            }

Номер строчки 123, добавляем в запрос наши значения
Код:
$query = "
        SELECT i.title AS title,
        i.metadesc,
        i.metakey,
        c.name as section,
        i.image_caption,
        i.artikul,
        i.vincode,
        i.image_credits,
        i.video_caption,
        i.video_credits,
        i.extra_fields_search,
        i.created,
        CONCAT(i.introtext, i.fulltext) AS text,
        CASE WHEN CHAR_LENGTH(i.alias) THEN CONCAT_WS(':', i.id, i.alias) ELSE i.id END as slug,
        CASE WHEN CHAR_LENGTH(c.alias) THEN CONCAT_WS(':', c.id, c.alias) ELSE c.id END as catslug
        FROM #__k2_items AS i
        INNER JOIN #__k2_categories AS c ON c.id=i.catid AND c.access {$accessCheck}
        WHERE (".$where.")
        AND i.trash = 0
        AND i.published = 1
        AND i.access {$accessCheck}
        AND c.published = 1
        AND c.access {$accessCheck}
        AND c.trash = 0
        AND ( i.publish_up = ".$db->Quote($nullDate)." OR i.publish_up <= ".$db->Quote($now)." )
        AND ( i.publish_down = ".$db->Quote($nullDate)." OR i.publish_down >= ".$db->Quote($now)." )";

Номер строчки 195, добавляем в запрос наши значения
Код:
$results = array();
        if (count($rows))
        {
            foreach ($rows as $row)
            {
                $new_row = array();
                foreach ($row as $key => $item)
                {
                    $item->browsernav = '';
                    $item->tag = $searchText;
                    if (searchHelper::checkNoHTML($item, $searchText, array('text', 'title', 'artikul', 'vincode', 'metakey', 'metadesc', 'section', 'image_caption', 'image_credits', 'video_caption', 'video_credits', 'extra_fields_search', 'tag')))
                    {
                        $new_row[] = $item;
                    }
                }
                $results = array_merge($results, (array)$new_row);
            }
        }


Далее идем править файл k2: /components/com_k2/models/itemlist.php

Номер строчки 1050, добавляем в запрос наши значения
Код:
$jfQuery .= " AND (jfc.reference_field = 'title'
                                OR jfc.reference_field = 'artikul'
                                OR jfc.reference_field = 'vincode'
                                OR jfc.reference_field = 'introtext'
                                OR jfc.reference_field = 'fulltext'
                                OR jfc.reference_field = 'image_caption'
                                OR jfc.reference_field = 'image_credits'
                                OR jfc.reference_field = 'video_caption'
                                OR jfc.reference_field = 'video_credits'
                                OR jfc.reference_field = 'extra_fields_search'
                                OR jfc.reference_field = 'metadesc'
                                OR jfc.reference_field = 'metakey'
                    )";

Номер строчки 1093, добавляем в запрос наши значения
Код:
$jfQuery .= " AND (jfc.reference_field = 'title'
                                    OR jfc.reference_field = 'artikul'
                                    OR jfc.reference_field = 'vincode'
                                    OR jfc.reference_field = 'introtext'
                                    OR jfc.reference_field = 'fulltext'
                                    OR jfc.reference_field = 'image_caption'
                                    OR jfc.reference_field = 'image_credits'
                                    OR jfc.reference_field = 'video_caption'
                                    OR jfc.reference_field = 'video_credits'
                                    OR jfc.reference_field = 'extra_fields_search'
                                    OR jfc.reference_field = 'metadesc'
                                    OR jfc.reference_field = 'metakey'
                        )";

Номер строчки 1143, добавляем в запрос наши значения
Код:
if ($type == 'exact')
            {
                $text = JString::trim($search, '"');
                $escaped = K2_JVERSION == '15' ? $db->getEscaped($text, true) : $db->escape($text, true);
                $quoted = $db->Quote('%'.$escaped.'%', false);
                $sql .= " AND ( LOWER(i.title) = ".$quoted." OR LOWER(i.artikul) = ".$quoted." OR LOWER(i.vincode) = ".$quoted." OR LOWER(i.introtext) = ".$quoted." OR LOWER(i.`fulltext`) = ".$quoted." OR LOWER(i.extra_fields_search) = ".$quoted." OR LOWER(i.image_caption) = ".$quoted." OR LOWER(i.image_credits) = ".$quoted." OR LOWER(i.video_caption) = ".$quoted." OR LOWER(i.video_credits) = ".$quoted." OR LOWER(i.metadesc) = ".$quoted." OR LOWER(i.metakey) = ".$quoted.") ";
            }
            else
            {
                $escaped = K2_JVERSION == '15' ? $db->getEscaped($search, true) : $db->escape($search, true);
                $text = $db->Quote($escaped);
                $sql .= " AND ( LOWER(i.title) LIKE ".$quoted." OR LOWER(i.artikul) LIKE ".$quoted." OR LOWER(i.vincode) LIKE ".$quoted." OR LOWER(i.introtext) LIKE ".$quoted." OR LOWER(i.`fulltext`) LIKE ".$quoted." OR LOWER(i.extra_fields_search) LIKE ".$quoted." OR LOWER(i.image_caption) LIKE ".$quoted." OR LOWER(i.image_credits) LIKE ".$quoted." OR LOWER(i.video_caption) LIKE ".$quoted." OR LOWER(i.video_credits) LIKE ".$quoted." OR LOWER(i.metadesc) LIKE ".$quoted." OR LOWER(i.metakey) LIKE ".$quoted.") ";
            }

Вот и все, всем спасибо) Если возникнут вопросы, с радостью отвечу!
 
Вопрос как сделать что бы поиск проходи по ново добавленным полям в двух базах? ( к примеру есть база партнеров и своя база)
 
Вопрос как сделать что бы поиск проходи по ново добавленным полям в двух базах? ( к примеру есть база партнеров и своя база)

Ты имеешь ввиду, чтобы поиск искал с 2 баз, 2 разных сайтов Joomla?
 
Ты имеешь ввиду, чтобы поиск искал с 2 баз, 2 разных сайтов Joomla?
1 база сайт джумла, а вторая база приложения. (она на msql, и находится на другом сервере).
Вопрос таков как сделать поиск по этим двум базам.
а) при условии что поиск выполняется по двум одинаковым названием полей (тот же артикул и винкод есть в обеих базах)
б) при условии что название полей в базах разные (артикул и винкод в джумле, и артикул-1 и винкод-1 во второй базе)
 
1 база сайт джумла, а вторая база приложения. (она на msql, и находится на другом сервере).
Вопрос таков как сделать поиск по этим двум базам.
а) при условии что поиск выполняется по двум одинаковым названием полей (тот же артикул и винкод есть в обеих базах)
б) при условии что название полей в базах разные (артикул и винкод в джумле, и артикул-1 и винкод-1 во второй базе)

Стандартный модуль врятли получиться переделать под это, так как плагин поиска подключается к базе Joomla, проще написать свой модуль поиска, и уже в нем указать подключение к 2 базам, и запросом выводить данные!
Первое что приходит, это из первой базы вывести значения и поместить в массив, и после делать вывод значений из второй базы по массиву!

Запрос по массиву может выглядеть таким образом
Код:
$array = array(1, 2, 3, 4, 5);
$result=mysql_query('SELECT * FROM basejoomla WHERE artikul IN (' . implode(',', array_map('intval', $array)) . ')');
 
Последнее редактирование модератором:
Назад
Сверху