Сайт вебмастера

Учимся работать с шаблоном MF. Настраиваем заголовки записей

07-07-2021Время чтения ~ 5 мин.Шаблоны для MaxSite CMS 2958

Часто стоит задача изменить вывод заголовков записей. В основном это требование дизайна или пожелания клиента. Например кто-то не хочет видеть в заголовках записей метки и автора записи. Также может понадобиться поменять расположение элементов: скажем вначале дату, а потом рубрики, или наоборот. Или использовать другие иконки. Понятно, что очень сложно учесть все возможные варианты — их будет сотни, поэтому такие вещи в 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-сетку. Для новичков это достаточно сложные вещи, поэтому лучшим вариантом будет использовать уже существующий файл и подредактировать его под свою задачу.

Похожие записи