Создание своего сайта на 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, которую в дальнейшем используем для распечатки найденных страниц.

Вот таким нехитрым образом мы реализовали простой поиск по сайту. На тот случай, если вы запутались в вёрстке, прикладываю архив со всеми файлами шаблонов.