Создание своего сайта на Processwire по шагам. Реализация поиска. Урок 9
В этом уроке мы реализуем поиск по сайту. Но сперва нам будет необходимо немного изменить вёрстку, так как в текущей явно не хватает боковой колонки. Как мы будем это делать? Открываем файл _main.php и заменим эту строку:
<div class="container" id="main-content"></div>
на эту:
<div class="container"> <div class="row"> <div class="col-lg-9" id="main-content"></div> <div class="col-lg-3"> <form action="/search/"> <div class="form-group"> <input class="form-control" name="q" /> </div> <button class="btn btn-info">Отправить</button> </form> </div> </div> </div>
На этом моменте подробно останавливаться не буду, потому что данный цикл уроков всё-таки не про вёрстку. Однако, если вам это интересно, то рекомендую обратиться к документации Bootstrap, поскольку данный шаблон использует именно этот CSS фреймворк.
Следующий шаг, который нужно сделать – пройтись по всем шаблонам, и внутри контейнера с id="main-content" удалить все классы вида "col-lg-", "col-md-", "mx-auto" и "row"; потому что они создают нежелательные отступы, необходимости которых внутри данного div, просто нет.
Теперь создадим страничку, на которой, собственно, и будут отображаться результаты поиска.
Но сперва создадим шаблон, который будет предназначен специально для поиска. Для этих целей я создал файл search.php со следующим содержимым:
<!-- Post Content --> <div id="main-content"> <article> <div class="container"> </div> </article> </div>
Ну и вслед за этим создаём шаблон в админке и привязываем к нему сам файл.
Затем создаём страничку (я назвал её search, потому что именно такой адрес прописан в атрибуте action) и привязываем к ней шаблон.
Поскольку в меню она отображаться не будет, поставим соответствующую галочку:
Теперь напишем код для самого файла search.php У меня получилось следующее:
<? $q = input()->get('q'); $q = sanitizer()->text($q); if($q) { $q = sanitizer()->selectorValue($q); $selector = "title|content~=$q"; $matches = pages()->find($selector); } else { $matches = array(); } ?> <!-- Post Content --> <div id="main-content"> <article> <div class="container"> <? if(count($matches)) { echo "Найдено $matches->count совпадений"; foreach($matches as $item): ?> <div> <h3><a href="<?=$item->url?>"><?=$item->title;?></a></h3> </div> <? endforeach; ?> <? } else { echo "Результатов не найдено"; } ?> </div> </article> </div>
В нём мы получаем переменную q из массива GET и с помощью объекта класса Sanitizer и его метода text приводим её к строке, тем самым удаляя из неё различные HTML тэги. С помощью того же объекта, но уже метода selectorValue, подготавливаем переменную q для последующего её использования в селекторе Processwire.
Ну а дальше с помощью метода find объекта класса Pages производим поиск по всем страницам с помощью следующего селектора:
title|content~=$q
где $q, это как вы догадались то, что было забито в поисковой строке.
По итогу получаем результаты в переменную $matches, которую в дальнейшем используем для распечатки найденных страниц.
Вот таким нехитрым образом мы реализовали простой поиск по сайту. На тот случай, если вы запутались в вёрстке, прикладываю архив со всеми файлами шаблонов.