0 Пользователей и 1 Гость просматривают эту тему.
  • 4 Ответов
  • 1342 Просмотров
*

CyberPsy

  • Осваиваюсь на форуме
  • 20
  • 0 / 0
Возможно ли переделать стандартный поиск в к2, чтобы он искал по точным фразам, либо хотя бы по двум словам сразу, а не как обычно он ищет - по одному слову? Суть вопроса в том, что если к примеру ввести название фильма, состоящее из двух слов, то он выводит все материалы в которых встречаетмя и первое и второе слово, а нужно, чтобы находил сразу оба. Например, если ввести фразу "Том Круз", то поиск находит все материалы в которых встречается слово Том или слово Круз. А необходимо, чтобы искал только фразу. Надеюсь понятно объяснил. Тему уже такую создавал, но никто так и не дал ответа.
*

kisBoss

  • Захожу иногда
  • 449
  • 36 / 0
  • ник Tobol
Поиск переделать возможно. Я давно что-то типа такого делал, но не помню для вашей проблемы или нет. Помоему, это делалось для точного поиска по поисковым меткам. Может будет работать. Попробуйте.
В файле ..\components\com_k2\models\itemlist.php
Заменить function prepareSearch($search)
Цитировать
function prepareSearch($search)
    {
   jimport('joomla.filesystem.file');
   $db = JFactory::getDBO();
   $language = JFactory::getLanguage();
   $defaultLang = $language->getDefault();
   $currentLang = $language->getTag();
   $length = JString::strlen($search);
   $sql = '';
   if (JRequest::getVar('categories'))
   {
   $categories = @explode(',', JRequest::getVar('categories'));
   JArrayHelper::toInteger($categories);
   $sql .= " AND i.catid IN (".@implode(',', $categories).") ";
   }
   if (empty($search))
   {
   return $sql;
   }
   if (JString::substr($search, 0, 1) == '"' && JString::substr($search, $length - 1, 1) == '"')
   {
   $type = 'exact';
   }
   else
   {
   $type = 'any';
   }
   if (JFile::exists(JPATH_ADMINISTRATOR.DS.'components'.DS.'com_joomfish'.DS.'joomfish.php') && $currentLang != $defaultLang)
   {
   $conditions = array();
   $search_ignore = array();
   $ignoreFile = $language->getLanguagePath().DS.$currentLang.DS.$currentLang.'.ignore.php';
   if (JFile::exists($ignoreFile))
   {
   include $ignoreFile;
   }
   if ($type == 'exact')
   {
   $word = JString::substr($search, 1, $length - 2);
   if (JString::strlen($word) > 3 && !in_array($word, $search_ignore))
   {
   $escaped = K2_JVERSION == '15' ? $db->getEscaped($word, true) : $db->escape($word, true);
   $word = $db->Quote('%'.$escaped.'%', false);
   $jfQuery = " SELECT reference_id FROM #__jf_content as jfc LEFT JOIN #__languages as jfl ON jfc.language_id = jfl.".K2_JF_ID;
   $jfQuery .= " WHERE jfc.reference_table = 'k2_items'";
   $jfQuery .= " AND jfl.code=".$db->Quote($currentLang);
   $jfQuery .= " AND jfc.published=1";
   $jfQuery .= " AND jfc.value LIKE ".$word;
   $jfQuery .= " AND (jfc.reference_field = 'extra_fields_search'
   )";
   $db->setQuery($jfQuery);
   $result = K2_JVERSION == '30' ? $db->loadColumn() : $db->loadResultArray();
   $result = @array_unique($result);
   JArrayHelper::toInteger($result);
   if (count($result))
   {
   $conditions[] = "i.id IN(".implode(',', $result).")";
   }
   }
   }
   else
   {
   //$search = explode(' ', JString::strtolower($search));
   //foreach ($search as $searchword)
   // {
   $searchword=$search;
   if (JString::strlen($searchword) > 3 && !in_array($searchword, $search_ignore))
   {
   $escaped = K2_JVERSION == '15' ? $db->getEscaped($searchword, true) : $db->escape($searchword, true);
   $word = $db->Quote('%'.$escaped.'%', false);
   $jfQuery = " SELECT reference_id FROM #__jf_content as jfc LEFT JOIN #__languages as jfl ON jfc.language_id = jfl.".K2_JF_ID;
   $jfQuery .= " WHERE jfc.reference_table = 'k2_items'";
   $jfQuery .= " AND jfl.code=".$db->Quote($currentLang);
   $jfQuery .= " AND jfc.published=1";
   $jfQuery .= " AND jfc.value LIKE ".$word;
   $jfQuery .= " AND (jfc.reference_field = 'extra_fields_search'
   )";
   $db->setQuery($jfQuery);
   $result = K2_JVERSION == '30' ? $db->loadColumn() : $db->loadResultArray();
   $result = @array_unique($result);
   foreach ($result as $id)
   {
   $allIDs[] = $id;
   }
   if (JFile::exists(JPATH_ADMINISTRATOR.DS.'components'.DS.'com_joomfish'.DS.'joomfish.php') && $currentLang != $defaultLang)
   {
   if (isset($allIDs) && count($allIDs))
   {
   JArrayHelper::toInteger($allIDs);
   $conditions[] = "i.id IN(".implode(',', $allIDs).")";
   }
   }
   }   
   // }
   } 
   if (count($conditions))
   {
   $sql .= " AND (".implode(" OR ", $conditions).")";
   }
   }
   else 
   { 
   //$sql .= " AND MATCH(i.extra_fields_search) ";
   //if ($type == 'exact')
   //{
   //    $text = JString::trim($search, '"');
   //    $escaped = K2_JVERSION == '15' ? $db->getEscaped($text, true) : $db->escape($text, true);
   //    $text = $db->Quote('"'.$db->getEscaped($text, true).'"', false);
   //}
   //else
   //{
   //    $search = JString::str_ireplace('*', '', $search);
   //    $words = explode(' ', $search);
   //    for ($i = 0; $i < count($words); $i++)
   //    {
   //        $words[$i] .= '*';
   //    }
   //    $search = implode(' ', $words);
   //    $escaped = K2_JVERSION == '15' ? $db->getEscaped($search, true) : $db->escape($search, true);
   //    $text = $db->Quote($escaped, false);
   //}
   $search = JString::strtolower($search);
   $escaped = K2_JVERSION == '15' ? $db->getEscaped($search, true) : $db->escape($search, true);
   $word = $db->Quote('%'.$escaped.'%', false);
   $sql .= " AND i.extra_fields_search LIKE ".$word;
   }
   return $sql;
Если помог - поставте "плюс". Вам ничего не стоит, а мне приятно.
*

kisBoss

  • Захожу иногда
  • 449
  • 36 / 0
  • ник Tobol
И еще советую оптимизировать код, чтобы в поиск не выводились результаты из описаний фильмов, а только из названия фильма, доп. полей, например.
Если помог - поставте "плюс". Вам ничего не стоит, а мне приятно.
*

CyberPsy

  • Осваиваюсь на форуме
  • 20
  • 0 / 0
И еще советую оптимизировать код, чтобы в поиск не выводились результаты из описаний фильмов, а только из названия фильма, доп. полей, например.
Попробовал. Работает замечательно, только в поисковых метках, а сами названия материалов не находит. Теперь просто поиск отсеивает материалы, в которых только точная фраза поисковых меток, но на названия фильмов это не распространяется. То есть если я введу в поиске слова Том Круз, то мне найдет фильмы/материалы, в которых в поисковых метках эти слова указаны. Но, если введу название фильма, то не находит. Можно ли это как-то изменить, чтобы искал еще и в названиях? За решение готов отблагодарить материально! :)
*

CyberPsy

  • Осваиваюсь на форуме
  • 20
  • 0 / 0
Решил проблему, установив обычный умный поиск, а не из модуля к2 tools. Огромнейшее спасибо и плюс в карму kisBoss! очень помог решить давно мучащую проблему. :))))))
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Точный поиск JA K2 Filter and Search Module

Автор Abez

Ответов: 1
Просмотров: 693
Последний ответ 25.02.2020, 19:58:47
от Abez
Поиск К2 + в результаты Категории

Автор jurassik

Ответов: 1
Просмотров: 1173
Последний ответ 28.11.2017, 20:06:03
от kisBoss
[Решено] Не работает поиск а админке по К2 на кирилице

Автор WinssLioN29

Ответов: 0
Просмотров: 1026
Последний ответ 09.07.2017, 23:15:07
от WinssLioN29
K2 v2.7.1 поломался поиск в админке

Автор d0ublezer0

Ответов: 7
Просмотров: 3959
Последний ответ 17.03.2017, 01:57:59
от RivalNoX
Поиск в категории

Автор imnotafake

Ответов: 0
Просмотров: 670
Последний ответ 12.03.2017, 20:57:48
от imnotafake