Создание своего сайта на Processwire по шагам. Реализуем удобную структуру блога и выводим верхнее меню. Урок 5

Теперь пришло время создать удобную структуру для блога. Предположим, что мы в этом смысле будем всё делать с оглядкой на Wordpress. Там есть две сущности – это «Страницы» и «Записи», которые находятся в двух разных местах админки. У нас же, в Processwire, всё будет находиться в дереве, с той лишь разницей, что все страницы первого уровня будут являться обычными страницами, а записи блога будут лежать в корневой странице «Блог». То есть будем таким образом придерживаться концепции WP, но в рамках PW. Итак, давайте приступим к реализации.

Создание корневой страницы блога

Сперва давайте создадим шаблон, который будет называться «blog». Шаблон у нас будет пустым, поэтому ни с каким файлом его связывать не надо. Возможно, вы спросите, почему мы не будем связывать его ни с каким файлом. Объяснение этому есть, но к этому я вернусь немного позже. Сейчас же нам необходимо создать страницу «Блог» и связать её с шаблоном «blog».

Если взглянуть на исходный шаблон HTML, то можно заметить, что там нет отдельной страницы для блога, потому что все записи находятся на главной. И это логично, потому что зачем нам нужна промежуточная страница, которая будет дублировать один и тот же функционал. Более того, эта страница создаёт ненужную вложенность, добавляя в адресную строку псевдоним родительской страницы – /blog/. Но с точки зрения административной части она несомненно удобна – можно группировать записи блога, не смешивая их с обычными страницами. В общем, нужно как-то избавиться от этой вложенности в адресной строке браузера, но при этом не отказываться от этой страницы в самой админке. К счастью, существует модуль, который как раз и решает данную проблему. Называется он Virtual Parents

 

Установка модуля

Для его установки заходим на страничку «Модули» в меню, переходим на вкладку «Добавить новый» и в соответствующей секции вбиваем адрес ZIP-файла модуля: https://github.com/Toutouwai/VirtualParents/archive/refs/heads/master.zip

И нажимаем кнопку «Скачать».

После чего не забываем нажать кнопку «Установить», чтобы, собственно, установить модуль. Далее вас должно перекинуть на страничку настроек модуля. Однако, на тот случай, если вы успели уже с неё уйти, то настройки можно найти по следующему пути: «Модули -> Сайт -> Virtual Parents».

Нам нужно этот модуль настроить – указать шаблон виртуального родителя (в данном случае это шаблон blog) и его дочерний шаблон - post. То есть в итого должно получиться:

blog=post

А вот так это будет выглядеть:

Нажимаем кнопку «Отправить», чтобы изменения применились. На этом с настройками модуля всё.

Создание шаблона записи блога

Теперь нам потребуется создать шаблон записи. В вёрстке шаблона за это отвечает файл post.html А это значит что по следующему пути /site/templates/ мы создаём файл post.php и копируем в него из файла post.html тэг article вместе со всем его содержимым. Только оборачиваем это всё в div c атрибутом id="main-content". В итоге всё это будет выглядеть так:

Далее как обычно создаём шаблон и отмечаем галочкой файл, который будет к нему привязан. После чего уже можно будет создать дочернюю страницу - для этого переходим на, собственно, саму страницу «Блог» и там во вкладке «Дочерние страницы» нажимаем кнопку «Добавить новую страницу здесь».

Вводим название страницы:

При этом, как вы могли заметить, в url страницы отсутствует адрес родительской страницы, и при этом к ней автоматически применяется новый шаблон. А сама страница по-прежнему находится там, где нам и нужно.

Собственно, таким образом, с помощью различных модулей, мы можем решать различные нестандартные задачи.

Реализация меню

Теперь пришло время реализовать вывод верхнего меню. Сделать это просто и с помощью jquery подобного синтаксиса, интуитивно понятно. Давайте приступим.

Благодаря использованию продвинутой шаблонизации, править мы будем только один файл - _main.php На всякий случай, если вы забыли, то я напомню для чего он – в этом файле находятся общие для всех шаблонов блоки, к коим относится и верхнее меню.

Открываем файл и между тэгами ul вставляем вот такой нехитрый код:

<?
$homepage = $pages->get("/");
$navItems = $homepage->and($homepage->children("template!=post"));
foreach ($navItems as $navItem):?>
  <li class="nav-item">
    <a class="nav-link" href="<?php echo $navItem->url; ?>"><?php echo $navItem->title; ?></a>
  </li>
<? endforeach; ?>

Как этот код работает?

В переменную $homepage мы получаем объект главной страницы (которая же и является корневой).

$homepage->children("template!=post") – эта строка возвращает массив дочерних элементов корневой страницы, где:

"template!=post" - это фильтр, в котором мы указываем что нам не нужны страницы, у которых назначен шаблон post.

А дальше просто проходимся по массиву из объектов и обращаемся к свойствам, в которых хранится название страницы и её URL.