Современная, быстрая и удобная система управления сайтом

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-файл, может использоваться такой вариант:

<?php

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

Функция произведёт поиск файла шаблон/type_foreach/page-do-page-only.php и если он есть, то выполнит подключение с помощью require(). Данный пример — типовой и очень часто встречается в коде системы. Особенность здесь в том, что подключение выполняется обычным require(), а значит type_foreach-файлу будут доступны все переменные и данные целевого файла.

Такой подход позволяет с помощью type_foreach-файла изменить какие-то предопределённые данные для дальнейшего выполнения. Рассмотрим простой пример.

<?php

...
$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:

<?php

$par
['limit'] = 3;

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

С помощью type_foreach-файлов также решается задача полной замены функциональности определенного участка кода.

<?php

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-файл.

Следует отметить, что такое обилие файлов никак не сказывается на производительности системы, поскольку считывание списка файлов производится один раз, после чего отдается уже готовый файл без дополнительных файловых операций поиска.