Вопросы и ответы
Вебмастеру
Type_foreach-файлы
Поскольку за вывод данных отвечает type-файл, то часто возникает ситуация, когда нужно изменить вывод какого-то блока, например поменять формат заголовков записей. Очевидно, что править большой type-файл не лучшая идея, поэтому в MaxSite CMS используются type_foreach-файлы.
Изначально type_foreach-файлы предназначались только для изменения внутри цикла foreach в type-файлах. Отсюда и их название. Но постепенно область действия type_foreach-файлов расширилась и они стали использоваться повсеместно, поскольку предлагают простой и удобный способ заменять и дополнять функциональность любых модулей системы.
В шаблоне используется предопределённый каталог type_foreach
, куда и помещаются все type_foreach-файлы. В последних версиях MaxSite CMS можно использовать альтернативный каталог take
, который работает практически так же как и type_foreach.
В MaxSite CMS type_foreach-файлы используются для решения двух основных задач. Первая — для внедрения своих блоков в другой модуль, например в цикл вывода type-файла. Вторая задача — это возможность замены какой-то функциональности своей.
Например, если нужно добавить какой-то свой блок в type-файл, может использоваться такой вариант:
...
if ($f = mso_page_foreach('page-do-page-only')) require($f);
...
Функция произведёт поиск файла шаблон/type_foreach/page-do-page-only.php
и если он есть, то выполнит подключение с помощью require()
. Данный пример — типовой и очень часто встречается в коде системы. Особенность здесь в том, что подключение выполняется обычным require()
, а значит type_foreach-файлу будут доступны все переменные и данные целевого файла.
Такой подход позволяет с помощью type_foreach-файла изменить какие-то предопределённые данные для дальнейшего выполнения. Рассмотрим простой пример.
...
$par = array(
'cut' => false,
'cat_order' => 'category_id_parent',
'cat_order_asc' => 'asc',
'type' => false);
if ($f = mso_page_foreach('page-mso-get-pages')) require($f);
$pages = mso_get_pages($par, $pagination);
...
Массив $par
содержит данные для функции mso_get_pages()
. Если стоит задача добавить или изменить эти данные, то достаточно создать файл, где можно переопределить параметры шаблон/type_foreach/page-mso-get-pages.php
:
$par['limit'] = 3;
Таким образом нет необходимости копировать type-файл в свой шаблон, чтобы изменить такую мелочь.
С помощью type_foreach-файлов также решается задача полной замены функциональности определенного участка кода.
if ($f = mso_page_foreach('page-other-pages'))
require($f);
else
mso_page_other_pages($p->val('page_id'), $p->val('page_categories'));
В данном примере используется вывод похожих записей с помощью функции mso_page_other_pages()
. Если необходимо заменить или даже отключить этот блок, то создаётся файл шаблон/type_foreach/page-other-pages.php
, где и размещается свой вариант вывода.
В MaxSite CMS очень много разных type_foreach-файлов, поскольку за время развития системы возникали самые разные задачи. Понять назначение type_foreach-файла гораздо проще по исходному коду type-файла. Описывать же каждый type_foreach-файл будет крайне затруднительно, поскольку их много в самых разных частях системы. Поэтому, если у вас возникнет желание изменить поведение какой-то части type-файла, то проверьте: скорее всего для этого уже предусмотрен type_foreach-файл.
Следует отметить, что такое обилие файлов никак не сказывается на производительности системы, поскольку считывание списка файлов производится один раз, после чего отдается уже готовый файл без дополнительных файловых операций поиска.