[EVO] AjaxMegaSearch — живой поиск по сайту, по выбранным полям (заготовка)
Живой поиск по сайту, в последнее время всё чаще и чаще становится востребованным как для пользователей так и для заказчиков. С последними, труднее всего договориться о логике поиска))).
По наводке Dmi3yy на третий метод ajax в MODX от bumkaka, сразу получилось простое решение поиска, которое можно расширить под свои требования.
Итак, по порядку.
Создаёте плагин AJAX на событие OnPageNotFound с кодом
switch($_GET['q']){
case 'ajaxmegasearch':
echo $modx->runSnippet('ajaxMegaSearch');
die();
break;
}
как видно по коду, плагин выводит содержимое сниппета ajaxMegaSearch.
Дальше создаём сниппет ajaxMegaSearch с кодом
<?php
$out = '';
$text = isset($_POST['text']) ? $_POST['text'] : ''; // текст запроса
$fields = isset($_POST['fields']) ? $_POST['fields'] : 'pagetitle'; // поля для поиска через запятую - pagetitle,longtitle
$length = isset($_POST['text']) ? strlen($_POST['text']) : 0; // количество символов в запросе
$minlength = isset($_POST['minlength']) ? (int) $_POST['minlength'] : 3; // минимальное количество в запросе
$maxlength = isset($_POST['maxlength']) ? (int) $_POST['maxlength'] : 50; // максимальное количество в запросе
$limit = isset($_POST['limit']) ? (int) $_POST['limit'] : 50; // количество выводимых результатов поиска
$empty = '<span>ничего не нашлось</span>'; // вывод пустого ответа поиска
$template = 'template=4 AND'; // шаблон документов для поиска // 4 - можно поменять на свой шаблон либо весь $template удалить.
$like = addcslashes($text, '\%_');
$like = $modx->db->escape($like);
$like = '%' . $like . '%';
$fields = explode(',', $fields);
$fields_array = explode(',', 'pagetitle,longtitle,description,alias,introtext,content'); // разрешённые поля через запятую
$fields = array_intersect($fields_array, $fields);
$fields_where = array();
foreach($fields as $v) {
$fields_where[] = $v . " LIKE '" . $like . "'";
}
$fields_where = implode(' OR ', $fields_where);
if($minlength <= $length && $maxlength >= $length) {
$res = $modx->db->query("
SELECT * FROM modx_site_content
WHERE " . $template . " (" . $fields_where . ")
ORDER BY pagetitle ASC
LIMIT " . $limit . "
");
foreach($modx->db->makeArray($res) as $doc) {
if(!$modx->config['use_alias_path']) {
$url = $modx->config['friendly_url_prefix'] . $doc['alias'] . $modx->config['friendly_url_suffix'];
} else {
$url = $modx->makeUrl($doc['id']);
}
$out .= '<a href="' . $url . '">' . str_ireplace($text, '<b>'.$text.'</b>', $doc['pagetitle']) . '</a>';
}
$out = $out ? $out : $empty;
}
return $out;
Обработка запросов готова!
Далее, ставим поле ввода и вывода результата поиска на странице сайта.
<input type="text" id="search" name="search" value="" placeholder="поиск по сайту">
<div id="search-result"><div class="search-inner"></div></div>
и далее добавляем код js в теге HEAD на странице
<script type="text/javascript">
$(document).ready(function() {
function LiveAjaxMegaSearch(as) {
if (as['minlength'] > as['text'].length) {
$('#search-result .search-inner').empty();
$('#search-result').hide();
return false;
}
$.ajax({
url: 'ajaxmegasearch',
type: 'post',
data: {
text: as['text'],
minlength: as['minlength'],
fields: as['fields']
},
success: function(data) {
if (data) {
$('#search-result .search-inner').html(data);
$('#search-result').show();
}
}
});
}
var as = [];
as['minlength'] = 3;
as['fields'] = 'pagetitle,longtitle';
as['text'] = $('input#search').val();
$('#search').keyup(function() {
as['text'] = $(this).val();
LiveAjaxMegaSearch(as);
});
});
</script>
Потом уже меняете под себя css для поля ввода поиска и показа результатов.
Вот собственно и всё))