Исправляем поиск по сайту

Автор: Антон Матвейчук


poisk_1


Поиск на сайте, созданном в LinkorCMS 1.4.1-3, изначально имеет несколько недостатков — регистрозависим, при наличии в строке поиска двух пробелов подряд выдаёт ошибку, отсутствует подсветка в результатах поиска искомых слов. Исправим эти недочёты.


poisk_2


Идём в хостинг сайта в файл base\inc\system\search.php .


poisk_3


В этом файле нам нужно заменить функцию SSearch(..). Найти её в коде можно с помощью строки поиска, вызываемой клавишами CTRL+F. Функция находится в самом низу кода.


Заменяем функцию SSearch(..) на этот код (как показано на скрине выше):

 

function SSearch($text, $search){ 
if($search == ''){ 
return false; 
} 
$search = preg_replace('/ +/', ' ', $search); // Удаляем двойные пробелы 
$swords = explode(' ', $search); 
$text = preg_replace('/\\[[^\\]]*\\]/s', '', $text); // Удаляем BBCode 
$text = strip_tags($text); 
foreach($swords as $search){ 
if(mb_stristr($text, $search) === false){ 
return false; 
} 
} 
return true; 
}


Этой заменой исправляем ошибку, если в поле поиска присутствуют 2 пробела подряд — сыпались ошибки, и заодно делаем поиск регистронезависимым.


poisk_4


Далее идём в modules\search\index.php .


poisk_5


Здесь надо найти код:

 

if(isset($_GET['searchstr'])){ // Поисковый запрос 
$searchstr = $_GET['searchstr']; 
}else{ 
System::site()->AddTextBox('', '<div style="text-align: center;">По вашему запросу ничего не найдено.</div>'); 
return; 
}


И заменить его на этот код (как показано на скрине выше):

 

if(isset($_GET['searchstr']) && $_GET['searchstr'] != ''){ // Поисковый запрос 
if (strlen(trim($_GET['searchstr'])) > 2){ 
$searchstr = trim($_GET['searchstr']); 
} else { 
System::site()->AddTextBox('', '<div style="text-align: center;" class="errors_message">Минимальная длина слова для поиска 3 символа.</div>'); 
return; 
} 
}else{ 
return; 
}


Этой заменой мы добавили обрезание пробелов в начале и конце, а также проверку на минимальную длину (3 символа). При пустом запросе возвращаем форму без каких-либо сообщений.


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


poisk_6


poisk_7


poisk_8


Заменяем всё содержимое в файлах plugins/search/.../index.php на:
articles

 

if(!defined('VALID_RUN')){ 
header("HTTP/1.1 404 Not Found"); 
exit; 
}




global $search_results, $searchstr;




$objects = System::database()->Select('articles', GetWhereByAccess('view', "`active`='1'"));




foreach($objects as $object){ 
$result = array(); 
$result['mod'] = $plugin_info['mod_title']; // Имя модуля 
$result['coincidence'] = ''; // Показывает где было совпадение 
$result['title'] = SafeDB($object['title'], 255, str); // Заголовок 
$result['public'] = TimeRender(SafeDB($object['public'], 11, int));// Дата публикации 
// Ссылка на просмотр обьекта 
$result['link'] = Ufu('index.php?name=articles&op=read&art='.SafeDB($object['id'], 11, int).'&cat='.SafeDB($object['cat_id'], 11, int), 'articles/{cat}/{art}/'); 
$result['text'] = SafeDB($object['description'], 0, str, false, false); // Текст (описание)




if(strlen($result['text']) > 255){ 
$result['text'] = substr($result['text'], 0, 255).'&nbsp; ...'; 
} 




$trueres_stitle = SSearch($object['seo_title'], $searchstr); 
$trueres_skey = SSearch($object['seo_keywords'], $searchstr); 
$trueres_sdesc = SSearch($object['seo_description'], $searchstr); 
$trueres_title = SSearch($object['title'], $searchstr); 
$trueres_desc = SSearch($object['description'], $searchstr); 
$trueres_art = SSearch($object['article'], $searchstr); 




if($trueres_stitle != false || $trueres_skey != false || $trueres_sdesc != false || $trueres_title != false || $trueres_desc != false || $trueres_art != false) { 
$result['coincidence'] = 'Совпадения в'; 




if($trueres_stitle != false || $trueres_skey != false || $trueres_sdesc != false){ 
$result['coincidence'] .= ' ключевых словах'; 
} 
if($trueres_title != false){ 
$result['title'] = SCoincidence($object['title'], $searchstr); 
if (strlen($result['coincidence']) > 13) {$result['coincidence'] .= ',';} 
$result['coincidence'] .= ' заголовке'; 
} 
if($trueres_desc != false || $trueres_art != false) { 
if (strlen($result['coincidence']) > 13) {$result['coincidence'] .= ',';} 
$result['coincidence'] .= ' тексте статьи'; 
if($trueres_desc != false){ 
$result['text'] = SCoincidence($object['description'], $searchstr); 
}else{ 
$result['text'] = SCoincidence($object['article'], $searchstr); 
} 
} 




$search_results[] = $result; 
} 
}


downloads

 

if(!defined('VALID_RUN')){ 
header("HTTP/1.1 404 Not Found"); 
exit; 
}




global $search_results, $searchstr;




$objects = System::database()->Select('downloads', GetWhereByAccess('view', "`active`='1'"));




foreach($objects as $object){ 
$result = array(); 
$result['mod'] = $plugin_info['mod_title']; //'Архив файлов'; // Имя модуля 
$result['coincidence'] = ''; // Показывает где было совпадение 
$result['title'] = SafeDB($object['title'], 255, str); // Заголовок 
$result['public'] = TimeRender(SafeDB($object['public'], 11, int)); // Дата публикации 
// Ссылка на просмотр обьекта 
$result['link'] = Ufu('index.php?name=downloads&op=full&cat='.SafeDB($object['category'], 11, int).'&file='.SafeDB($object['id'], 11, int), 'downloads/{cat}/{file}/'); 
$result['text'] = SafeDB($object['shortdesc'], 0, str); // Текст (описание) 




if(strlen($result['text']) > 255){ 
$result['text'] = substr($result['text'], 0, 255).'&nbsp; ...'; 
} 




$trueres_title = SSearch($object['title'], $searchstr); 
$trueres_shortdesc = SSearch($object['shortdesc'], $searchstr); 
$trueres_desc = SSearch($object['description'], $searchstr); 




if($trueres_title != false || $trueres_shortdesc != false || $trueres_desc != false) { 
$result['coincidence'] = 'Совпадения в'; 




if($trueres_title != false){ 
$result['title'] = SCoincidence($object['title'], $searchstr); 
$result['coincidence'] .= ' заголовке'; 
} 
if($trueres_shortdesc != false || $trueres_desc != false){ 
if (strlen($result['coincidence']) > 13) {$result['coincidence'] .= ' и';} 
$result['coincidence'] .= ' описании'; 




if($trueres_shortdesc != false) { 
$result['text'] = SCoincidence($object['shortdesc'], $searchstr); 
}else{ 
$result['text'] = SCoincidence($object['description'], $searchstr); 
} 
} 
$search_results[] = $result; 
} 
}


gallery

 

if(!defined('VALID_RUN')){ 
header("HTTP/1.1 404 Not Found"); 
exit; 
}




global $search_results, $searchstr;




$objects = System::database()->Select('gallery', GetWhereByAccess('view', "`show`='1'"));




foreach($objects as $object){ 
$result = array(); 
$result['mod'] = $plugin_info['mod_title']; // Имя модуля 
$result['coincidence'] = ''; // Показывает где было совпадение 
$result['title'] = SafeDB($object['title'], 255, str); // Заголовок 
$result['public'] = TimeRender(SafeDB($object['public'], 11, int)); // Дата публикации 
// Ссылка на просмотр обьекта 
$result['link'] = Ufu('index.php?name=gallery&op=view&img='.SafeDB($object['id'], 11, int).'&cat='.SafeDB($object['cat_id'], 11, int), 'gallery/{cat}/{img}/'); 
$result['text'] = SafeDB($object['description'], 0, str, false, false); // Текст (описание) 




if(strlen($result['text']) > 255){ 
$result['text'] = substr($result['text'], 0, 255).'&nbsp; ...'; 
} 




$trueres_title = SSearch($object['title'], $searchstr); 
$trueres_desc = SSearch($object['description'], $searchstr); 




if($trueres_title != false || $trueres_desc != false){ 
$result['coincidence'] = 'Совпадения в'; 




if($trueres_title != false){ 
$result['title'] = SCoincidence($object['title'], $searchstr); 
$result['coincidence'] .= ' заголовке'; 
} 
if($trueres_desc != false){ 
$result['text'] = SCoincidence($object['description'], $searchstr); 
if (strlen($result['coincidence']) > 13) {$result['coincidence'] .= ' и';} 
$result['coincidence'] .= ' описании'; 




} 




$search_results[] = $result; 
} 
}


news

 

if(!defined('VALID_RUN')){ 
header("HTTP/1.1 404 Not Found"); 
exit; 
}




global $search_results, $searchstr;




$objects = System::database()->Select('news', GetWhereByAccess('view', "`enabled`='1'"));




foreach($objects as $news){ 
$result = array(); 
$result['mod'] = $plugin_info['mod_title']; // Имя модуля 
$result['coincidence'] = ''; // Показывает где было совпадение 
$result['title'] = SafeDB($news['title'], 255, str); // Заголовок 
$result['public'] = TimeRender(SafeDB($news['date'], 11, int)); // Дата публикации 
// Ссылка на просмотр обьекта 
$result['link'] = Ufu('index.php?name=news&op=readfull&news='.SafeDB($news['id'], 11, int).'&topic='.SafeDB($news['topic_id'], 11, int), 'news/{topic}/{news}/'); 
$result['text'] = SafeDB($news['start_text'], 0, str); // Текст (описание) 
if($news['auto_br'] == '1'){ 
$result['text'] = SafeDB(nl2br($result['text']), 0, str, false, false); 
}else{ 
$result['text'] = SafeDB($result['text'], 0, str, false, false); 
} 
if(strlen($result['text']) > 255){ 
$result['text'] = substr($result['text'], 0, 255).'&nbsp; ...'; 
} 




$trueres_stitle = SSearch($news['seo_title'], $searchstr); 
$trueres_skey = SSearch($news['seo_keywords'], $searchstr); 
$trueres_sdesc = SSearch($news['seo_description'], $searchstr); 
$trueres_title = SSearch($news['title'], $searchstr); 
$trueres_start_txt = SSearch($news['start_text'], $searchstr); 
$trueres_end_txt = SSearch($news['end_text'], $searchstr); 




if($trueres_stitle != false || $trueres_skey != false || $trueres_sdesc != false || $trueres_title != false || $trueres_start_txt != false || $trueres_end_txt != false) { 
$result['coincidence'] = 'Совпадения в'; 




if($trueres_stitle != false || $trueres_skey != false || $trueres_sdesc != false){ 
$result['coincidence'] .= ' ключевых словах'; 
} 
if($trueres_title != false){ 
$result['title'] = SCoincidence($news['title'], $searchstr); 
if (strlen($result['coincidence']) > 13) {$result['coincidence'] .= ',';} 
$result['coincidence'] .= ' заголовке'; 
} 
if($trueres_start_txt != false || $trueres_end_txt != false) { 
if (strlen($result['coincidence']) > 13) {$result['coincidence'] .= ',';} 
$result['coincidence'] .= ' тексте новости'; 
if($trueres_start_txt != false){ 
$result['text'] = SCoincidence($news['start_text'], $searchstr); 
}else{ 
$result['text'] = SCoincidence($news['end_text'], $searchstr); 
} 
} 




$search_results[] = $result; 
} 
}


pages

 

if(!defined('VALID_RUN')){ 
header("HTTP/1.1 404 Not Found"); 
exit; 
}




global $search_results, $searchstr;




$objects = System::database()->Select('pages', GetWhereByAccess('view', "`enabled`='1' and `type`='page'"));




foreach($objects as $object){ 
$result = array(); 
$result['mod'] = $plugin_info['mod_title']; // Имя модуля 
$result['coincidence'] = ''; // Показывает где было совпадение 
$result['title'] = SafeDB($object['title'], 255, str); // Заголовок 
$result['public'] = TimeRender(SafeDB($object['modified'], 11, int)); // Дата публикации 
// Ссылка на просмотр обьекта 
$result['link'] = Ufu('index.php?name=pages&file='.SafeDB($object['link'], 255, str), 'pages/{file}.html'); 
$result['text'] = SafeDB($object['text'], 0, str); // Текст (описание) 




if($object['auto_br'] == '1'){ 
$result['text'] = SafeDB(nl2br($result['text']), 0, str, false, false); 
}else{ 
$result['text'] = SafeDB($result['text'], 0, str, false, false); 
} 
if(strlen($result['text']) > 255){ 
$result['text'] = substr($result['text'], 0, 255).'&nbsp; ...'; 
} 




$trueres_stitle = SSearch($object['seo_title'], $searchstr); 
$trueres_skey = SSearch($object['seo_keywords'], $searchstr); 
$trueres_sdesc = SSearch($object['seo_description'], $searchstr); 
$trueres_title = SSearch($object['title'], $searchstr); 
$trueres_text = SSearch($object['text'], $searchstr); 




if($trueres_stitle != false || $trueres_skey != false || $trueres_sdesc != false || $trueres_title != false || $trueres_text != false) { 
$result['coincidence'] = 'Совпадения в'; 




if($trueres_stitle != false || $trueres_skey != false || $trueres_sdesc != false){ 
$result['coincidence'] .= ' ключевых словах'; 
} 
if($trueres_title != false){ 
$result['title'] = SCoincidence($object['title'], $searchstr); 
if (strlen($result['coincidence']) > 13) {$result['coincidence'] .= ',';} 
$result['coincidence'] .= ' заголовке'; 
} 
if($trueres_text != false){ 
$result['text'] = SCoincidence($object['text'], $searchstr); 
if (strlen($result['coincidence']) > 13) {$result['coincidence'] .= ',';} 
$result['coincidence'] .= ' тексте страницы'; 
} 




$search_results[] = $result; 
} 
}


Удаляем config/system_build.php.cache и получаем удовольствие от полноценной работы поиска на сайте.


Написать статью мне помогла вот эта тема в форуме LinkorCMS.

 

 

В предыдущей статье: Переход к странице файла из Админ-панели.


В следующей статье: Обновление статистики пользователей.

 

 


Вы можете отблагодарить меня за эту статью, положив денюжку на Яндекс.Деньги — 41001946245208; Webmoney — RUB - R228675470677, USD - Z403380463613, EUR - E114430860179; моб.тел. 8-985-301-51-80 (МТС).


Также я буду благодарен вам, если вы зарегистрируетесь в хостинге по ссылкам в моей статье — вам ничего не убудет, а я получу хоть какое, но вознаграждение ;-)

 

Опубликована: 17.05.2016
Просмотров 652



Комментарии

Гости не могут добавлять комментарии, войдите или зарегистрируйтесь.