Второй type-foreach-file, который срабатывает в случае отсутствия type_foreach-файла в шаблоне. Он также принимает вызываемый type_foreach-файл и возвращает либо полный путь к файлу, либо false.
Например мы хотим подключить для всех шаблонов info-bottom. Разместили его в своем плагине. Далее цепляемся на хук type-foreach-file. Он срабатывает и вы отдаем путь к своему файлу.
Если же в шаблоне уже есть свой info-bottom, то наш хук не сработает. Однако, если мы хотим заменить шаблонный type_foreach-файл, то в хуке type-foreach-file-general мы его переименовываем на свой вариант и отлавливаем уже в своем type-foreach-file.
Таким образом через плагин можно управлять произвольным type_foreach-файлом. Менять скажем оформительские блоки, вроде info не очень хорошая идея, а вот ...-mso-get-pages, ...-head-meta и т.п. в принципе можно. В теории можно написать плагин, который будет опционально перехватывать вызовы всех type_foreach-файлов и подставлять вместо них свой вариант из опций, которые формируются в админ-панели. Грубо говоря менять код type_foreach-файлов можно прямо из админ-панели.
Для тех кто хочет потестировать новую возможность следует заменить mso_page_foreach():
Код: Выбрать все
function mso_page_foreach($type_foreach_file = false)
{
global $MSO;
# при первом обращении занесем сюда все файлы из шаблонного type_foreach
# чтобы потом результат считывать из масива, а не по file_exists
static $files = false;
$MSO->data['type_foreach_file'] = $type_foreach_file; // помещаем в $MSO вызываемый тип
// описание см. default/type_foreach/_general.php
if (file_exists(getinfo('template_dir') . 'type_foreach/general.php'))
include(getinfo('template_dir') . 'type_foreach/general.php');
// можно поменять type_foreach-файл через хук
$type_foreach_file = mso_hook('type-foreach-file-general', $type_foreach_file);
if ($type_foreach_file)
{
if ($files === false)
{
$CI = & get_instance();
$CI->load->helper('directory');
$files = directory_map(getinfo('template_dir') . 'type_foreach/', true); // только в type_foreach
if (!$files) $files = array();
}
if (in_array($type_foreach_file . '.php', $files)) // есть файл в шаблоне
return getinfo('template_dir') . 'type_foreach/' . $type_foreach_file . '.php';
else
{
// файла нет
// если есть хук type-foreach-file
if (mso_hook_present('type-foreach-file'))
{
// получим его значение
// он должен возвращать либо полный путь к файлу, либо false
if ($out = mso_hook('type-foreach-file', $type_foreach_file))
return $out; // указан путь
else
return false; // вернул false
}
else // нет хука type-foreach-file
return false;
}
}
return false;
}
Для демонстрации возможностей код плагина «_test2»:
Код: Выбрать все
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
* MaxSite CMS
* (c) http://max-3000.com/
*/
function _test2_autoload()
{
mso_hook_add('type-foreach-file-general', '_test2_f0'); // перебивает стандартные type_foreach-файлы
mso_hook_add('type-foreach-file', '_test2_f1'); // type_foreach-файлы
}
function _test2_f0($tff = false)
{
// меняем некоторые type_foreach-файл на свои
if ($tff == 'info-top') return 'my-info-top';
elseif ($tff == 'info-bottom') return 'my-info-bottom';
return $tff;
}
function _test2_f1($tff = false)
{
// смотрим какие type_foreach-файлы и от этого подключаем свои
if ($tff == 'my-info-top') return getinfo('plugins_dir') . '_test2/type_foreach/info-top.php';
elseif ($tff == 'my-info-bottom') return getinfo('plugins_dir') . '_test2/type_foreach/info-bottom.php';
elseif ($tff == 'page_404') return getinfo('plugins_dir') . '_test2/type_foreach/page_404.php';
return false;
}
# end file
Файлы в type_foreach плагина уже по своему усмотрению.