WEXAR

Живой поиск по сайту, в последнее время всё чаще и чаще становится востребованным как для пользователей так и для заказчиков. С последними, труднее всего договориться о логике поиска))).

По наводке 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 для поля ввода поиска и показа результатов.
Вот собственно и всё))