Учимся работать с шаблоном MF. Настраиваем заголовки записей
07-07-2021Время чтения ~ 5 мин.Шаблоны для MaxSite CMS 3118
Часто стоит задача изменить вывод заголовков записей. В основном это требование дизайна или пожелания клиента. Например кто-то не хочет видеть в заголовках записей метки и автора записи. Также может понадобиться поменять расположение элементов: скажем вначале дату, а потом рубрики, или наоборот. Или использовать другие иконки. Понятно, что очень сложно учесть все возможные варианты — их будет сотни, поэтому такие вещи в MaxSite CMS принято всё-таки решать индивидуально в каждом шаблоне.
Сегодняшняя статья пригодится не только клиентам MF, но и всем пользователям MaxSite CMS — файлы шаблонов заголовков у них одинаковые. Эти файлы находятся в каталоге type_foreach в подкаталоге info-top. Здесь размещены файлы для full-записей (рубрик, меток, главная и т.д.), а в подкаталоге page файлы для одиночных записей. Такое разделение используется только для удобства выбора файла в админ-панели.
Для начала расскажу что такое type_foreach-файлы.
Когда нужно вывести какую-то запись (или записи), то вначале MaxSite CMS делает запрос к базе данных и получает их массив. После этого запускается цикл вывода foreach (это стандартный цикл в PHP). Внутри него происходит вывод данных каждой записи. Схематично это происходит примерно так:
$pages = mso_get_pages(); // получили записи для вывода foreach ($pages as $page) { // здесь выводим каждую записи echo '<h1>' . $page['page_title'] . '</h1>'; ... и т.д. }
Чтобы поменять вывод записи когда-то давно нужно было редактировать каждый такой php-файл: для одиночной записи, вывод рубрик, вывод меток и т.д. На самом деле эта задача ещё сложней, поскольку часто используются условия вывода: например для одиночной записи не нужно выводить ссылку-заголовок, а при выводе рубрики она нужна. Или проверять наличие меток у записи и если они есть, то оборачивать все метки каким-то дизайнерским div-блоком. Такой вывод происходит в type-файле: page, home, category, tag и т.д.
Поскольку это достаточно сложный php-код, то это под силу только вебмастеру. Ну и кроме того, это позволяло получить в шаблоне только один вариант вывода.
Чтобы обойти это ограничение я придумал вариант, когда непосредственный вывод данных записи (внутри type-файла) выносится в отдельный php-файл. Такие файлы называются type_foreach-файлами. Эти файлы как раз и подключаются в цикле foreach — отсюда и их название.
$pages = mso_get_pages(); // получили записи для вывода foreach ($pages as $page) { // здесь выводим каждую записи if ($fn = mso_page_foreach('page')) { require $fn; } else { // стандартный вывод echo '<h1>' . $page['page_title'] . '</h1>'; ... и т.д. } }
В данном примере будет подключен type_foreach-файл page.php, где размещается вывод одиночной записи.
Однако чаще всего стоит задача поменять не весь вывод (он всё-таки достаточно сложный), а только вывод заголовков. Для этого в рамках type_foreach-файлов выделена группа info-top-файлов, которая подключается в зависимости от выбора в админ-панели:
То есть когда вы здесь выбираете шаблон заголовков, то MaxSite CMS автоматом подключит info-top-файл в цикле вывода. Теперь вам не нужно разбираться в сложном type-файле: если стоит задача поменять формат вывода, то мы будем работать с достаточно простым php-файлом.
Кроме того, такой подход позволяет создавать множество заголовков для одного шаблона. Например вы хотите сделать запись, где задать какой-то особый вариант вывода заголовка, например с другим размером шрифта и иконками. Достаточно будет сделать новый info-top-файл и потом выбрать его при редактировании записи.
Что представляет из себя info-top-файл?
Это обычный php-код, что в свою очередь делает их более сложными для новичков. С другой стороны, в них используется вывод через шаблонизатор Page_Out, который вы уже используете в юнитах только в виде php-функций. Рассмотрим для примера info-top-файл page.php:
$p->format('edit', '<i class="im-edit t-gray600 hover-t-gray950" title="Edit page"></i>', '<div class="b-right mar10-t">', '</div>'); $p->format('title', '<h1 class="t-gray800 t220 mar10-b">', '</h1>', false); $p->format('date', 'j F Y г.', '<time class="mar10-l b-right im-calendar" datetime="[page_date_publish_iso]">', '</time>'); $p->format('cat', ', ', '<span class="im-bookmark mar20-r" title="' . tf('Рубрика записи') . '">', '</span>'); $p->format('view_count', '<span class="im-chart-bar mar20-r">' . tf('Просмотров') . ': ', '</span>'); $p->format('comments_count', '<span class="im-comments mar20-r">' . tf('Комментарии') . ': ', '</span>'); $p->format('tag', ' / ', '<div class="im-tags mar5-t" title="' . tf('Метка записи') . '">', '</div>'); $p->html('<header class="mar30-t mar20-b">'); $p->line('[edit][title]'); $p->div_start('t-gray600 t90 b-clearfix'); $p->line('[cat][view_count][comments_count][date]'); $p->line('[tag]'); $p->div_end(''); $p->html('</header>');
Здесь $p
— готовый объект Page_Out — поэтому мы сразу используем его методы. Вывод данных происходит в методе line
, где в аргументе передаётся строка с нужным форматом вывода. Например [cat]
заменится на рубрики записи, [view_count]
выведет количество просмотров записи, [title]
— это заголовок, а [edit]
сформирует ссылку на редактирование записи (если вы автор).
Метод html
используется для вывода произвольного HTML-кода. Методы div_start
и div_end
формируют обычные тэги DIV.
Формально нам совершенно не обязательно использовать эти методы, поскольку они легко могут быть заменены обычным echo
. Но мы их используем ради более понятного кода, чтобы не смешивать PHP и HTML в одну кучу.
С помощью метода format
задаётся формат вывода каждого элемента. Первым аргументом мы указываем для какого элемента задаётся формат, а потом уже непосредственно сам формат вывода.
Например для количества просмотров view_count
можно указать текст ДО и ПОСЛЕ:
$p->format('view_count', '<span class="im-chart-bar mar20-r">' . tf('Просмотров') . ': ', '</span>');
Если стоит задача поменять иконку этого элемента, то это можно сделать в этом коде. Таким образом настраивается формат всех элементов.
В целом я согласен, что работа с php-кодом требует некоторой подготовки, но по другому это просто не работает. Я оставлю ссылку на документацию, где приведено более полное описание.
Шаблоны заголовков могут быть достаточно сложными, особенно, если используется формирование миниатюры. Также есть некоторые тонкости формирования колоночного вывода: здесь выводится и часть текста записи, а также есть завязка на css-класс контейнера — он используется, чтобы организовать flex-сетку. Для новичков это достаточно сложные вещи, поэтому лучшим вариантом будет использовать уже существующий файл и подредактировать его под свою задачу.