Type-файлы

Работа MaxSite CMS базируется на типах данных, которые совпадают с первым сегментом URL. Например сайт/page — соответствует типу page, а сайт/category — типу category.

Существуют и специальные типы данных, например ajax — используется для отправки AJAX/POST-данных.

После того, как управление передано в index.php шаблона, выполняется функция диспетчера, которая определит тип данных и подключит соответствующий type-файл.

Type-файл определяется на основе существующих типов данных, который совпадает с type-каталогом. Каталог для type-файлов может располагаться как в самом шаблоне (он приоритетный), но в случае его отсутствия, будет использован shared-каталог.

Например. Адрес сайт/page — соответствует типу page. Диспетчер будет искать файл шаблон/type/page/page.php. Если в шаблоне этого файла нет, то будет подключен файл shared/type/page/page.php.

В type-файле происходит получение данных и их вывод в зависимости от своего типа, например page — это вывод одиночной записи, а category — список записей.

Если диспетчер не смог определить тип данных из предопределённых (см. shared/type), то он попытается найти type-файл на основе первого сегмента URL в каталоге шаблона.

Такой алгоритм позволяет без труда создавать произвольные типы данных для своего сайта. Например, для того, чтобы сделать страницу Корзины по адресу сайт/cart достаточно лишь в своём шаблоне разместить файл шаблон/type/cart/cart.php.

Если тип данных не был определен, то ему присваивается тип page_404.

Структура вывода в type-файле

Type-файл должен взять на себя всю работу по формированию HTML-кода страницы. Если нужно, то в type-файле размещается весь код, все зависимости и т.д. С практической точки зрения, лучше использовать вывод основанный на дизайне и структуре самого шаблона. То есть оставить в type-файле получение и вывод только той части данных, которые имеют непосредственное отношение к данному типу. Например для cart сформировать только саму Корзину, а остальная часть html-кода будет выведена автоматически.

Такой вариант предполагает вывод данных между двумя файлами, которые обеспечивают подключение начальной и конечной части шаблона. Например type/cart/cart.php

<?php
mso_head_meta('title', 'Корзина'); // meta title страницы

# ... получение данных ...

# начальная часть шаблона
if ($fn = mso_find_ts_file('main/main-start.php')) require($fn);

echo '<h1>Корзина</h1>';

# ... вывод данных ...

# конечная часть шаблона
if ($fn = mso_find_ts_file('main/main-end.php')) require($fn);

# end of file

Файл main-start.php определяет main-файл — модульную сетку сайта, которая располагаются в каталоге шаблон/main, а также включается буферизация вывода. При этом, обратите внимание, сам main-файл здесь не подключается.

После этого type-файл выполняет свою работу, но поскольку включена буферизация вывода, то в браузер ничего не выводится. Подключается конечная часть шаблона — main-end.php. В этом файле буфер вывода сохраняется в глобальной переменной $CONTENT_OUT (буфер при этом обнуляется) и только после этого подключается main-файл. Вывод же контента происходит уже в самом main-файле в виде обычного echo $CONTENT_OUT.

То есть main-файл подключается в самом конце, после того, как type-файл по сути выполнил всю свою работу.

Всё это работает в фоновом режиме и вебмастеру нет необходимости что-то менять. Но при этом достигается высокая гибкость настройки шаблона.

Сложность type-файлов

Type-файлы могут быть разными по сложности. Есть файлы, которые довольно простые по коду. Например comments представляет собой единственный файл с выводом последних комментариев. Или contact, который является выводом формы с помощью плагина forms.

Другие типы требуют сложного php-кода, в котором используются многочисленные вставки, опции, set/get-переменные и т.п.

Если необходимо изменить вывод type-файла в своём шаблоне, то простые варианты можно скопировать в каталог шаблона и отредактировать под свою задачу. Это нормальная практика для простых типов.

Но если type-файл сложный, то его лучше не перемещать в свой шаблон, а использовать другие средства кастомизации. Если переместить такой тип в свой шаблон, и если он будет изменён в новых версиях MaxSite CMS, шаблон останется без обновления (это происходит довольно часто). Поэтому сложные типы не рекомендуется перемещать на уровень шаблона.

Type_foreach-файлы

Для того, чтобы управлять type-файлами разработано сразу несколько возможностей.

В первую очередь это type_foreach-файлы. Эти файлы располагаются в каталоге шаблон/type_foreach или шаблон/take. В type-файлах прописаны специальные условия, которые подключают type_foreach-файл вместо какого-то типового блока.

Например в page есть такой код:

if ($f = mso_page_foreach('page-head-meta')) 
{
	require($f);
}
else
{ 
	mso_head_meta('title', $pages, '%page_title%'); // meta title страницы
	mso_head_meta('description', $pages); // meta description страницы
	mso_head_meta('keywords', $pages); // meta keywords страницы
}

Если нужно изменить формирование title страниц (например по какому-то шаблону), то достаточно сделать это в файле шаблон/type_foreach/page-head-meta.php.

В процессе развития MaxSite CMS было придумано множество type_foreach-файлов, которые покрывают почти все потребности вебмастера.

Иногда встречаются простые вставки:

if ($f = mso_page_foreach('page-do-page-only')) require($f);

Они позволяют подключать свой код до или после определённого блока. Это может использоваться например для вывода рекламы или каких-то дополнительных блоков.

Таким образом, если стоит задача изменить типовой вывод type-файла, то в первую очередь нужно проверить наличие нужного type_foreach-файла.

Ушки

В некоторых случаях можно использовать плагин Ушки. Например для того, чтобы указать дополнительное описание рубрики можно использовать ушку category_ССЫЛКА. Например для рубрики news, нужно сделать ушку category_news.

Использование ушек позволяет настраивать шаблон прямо из админ-панели без правки php-файлов.

Set/get-переменные

Для «динамического» управления в некоторых случаях применяются Set/get-переменные. Например для того, чтобы отключить вывод info-top-секции для одиночной страницы можно использовать переменную show-info-top

mso_set_val('show-info-top', false);

Подробнее см. Set/get-переменные.

Файлы-юниты

В некоторых случаях часть кода выносится в отдельные unit-файлы, которые располагаются в подкаталоге типа units. Например для loginform может потребоваться изменить html-разметку формы логина. Вместо того, чтобы менять весь тип, достаточно изменить только unit-файлы, содержащие непосредственный html-код.

Такой юнит файл нужно скопировать в шаблон по тому же пути: shared/type/ТИП/units/файл.php в шаблон/type/ТИП/units/файл.php.

Обратите внимание, что часто в unit-файлах используется php-шаблонизатор. Это сделано как раз для упрощения кода.

Главная страница

За вывод главной страницы отвечает тип home. Он довольно сложный в силу исторических причин. Работа home аналогична работе других типов и если нужен типовой вариант вывода, то главная отлично настраивается с помощью опций в админ-панели.

Если стоит задача вывести произвольный вариант главной, то лучше всего использовать шаблон/type/home/units.php. Этот файл имеет особое назначение и состоит из секций [unit] через которые и задаётся варианты вывода (см. Юниты главной).