Функция «Компонент»
К текущему моменту Smarty ничего не знает о каких-либо компонентах, и нам нам
надо научить его работать с ними. Для этого мы добавляем к синтаксису шаблонов
новый тег – {component}. Чтобы Smarty научился обрабатывать этот тег – пишем
простую функцию:
<?php
// Smarty function Component
//
// @author Feskov Kuzma
function smarty_function_component($params, &$smarty) {
$adodb = &$smarty->get_registered_object('adodb');
$vars = &$smarty->get_registered_object('vars');
$errors = &$smarty->get_registered_object('errors');
$security = &$smarty->get_registered_object('security');
if (empty($params['name'])) {
$params['name'] = 'site_view';
}
if (is_file(ADMIN_LIBS_PATH . '/' . $params['name'] . '.component.php')) {
require(ADMIN_LIBS_PATH . '/' . $params['name'] . '.component.php');
} else {
echo 'Component <strong>' . $params['name'] . '</strong> not found';
}
unset($adodb, $errors, $security, $vars);
}
?>
Давайте разберемся, что делает данная функция. Во-первых, она создает обработчик
для нового тега – {component}, во-вторых, достает (get_registered_object()) и
делает доступными вызванному компоненту зарегистрированные ранее общие объекты.
Немножко теории. Чтобы вызвать данную функцию к жизни, необходимо в любом
шаблоне написать тэг {component}. Поскольку функция не выполняет никаких
продуктивных действий, и служит исключительно диспетчером компонентов, просто
написать {component} недостаточно, поскольку эта команда неинформативна.
Конечно, функция не даст сбоя, и запустит принятый по умолчанию компонент 'site_view'.
Каким образом уточнить, какой именно компонент вам требуется и как передать ему
дополнительные параметры? Все очень просто, мы несколько измени вызов компонента
в шаблоне:
{component name='имя требуемого компонента' var1='значение параметра'
var2='значение другого параметра'}
И так далее, как вы понимаете, name, var1, var2 – это дополнительные параметры
для нашего компонента. Name, например, указывает имя компонента, который мы
хотим вызвать, а остальные параметры – это дополнительные данные для вызываемого
компонента, их количество может быть любым, ровно как и их имена. После того,
как в шаблоне встретится указанный выше тег, произойдет вызов нашей функции,
которая, в свою очередь, вызовет нужный вам компонент. Все дополнительные
параметры будут доступны как в нашей функции так и в вызываемом компоненте, они
будут содержаться в массиве $params, где ключ – это название параметра, а
значение – соответственно – его значение.
Мы приняли, что файлы наших компонентов именуются следующим образом:
name.component.php
где name – это наш параметр name.
Функция ищет в указанной папке файл с именем, сформированным указанным образом и
исполняет его. В случае отсутствия параметра name запускает компонент,
назначенный по умолчанию, в противном случае – выдает ошибку.
Помимо зарегистрированных ранее общих объектов, нашим компонентам полностью
доступна вся мощь шаблонизатора Smarty – у вас есть объект $smarty. Обращаю
также внимание, что все что вы ассигните (assign) в объект $smarty, будет также
доступно не только вашему компоненту, но и общему (вызывающему) шаблону, а это
значит, что компоненты вовсе не обязаны всегда выводить что-либо на экран, они
вполне могут передавать подготовленные данные в общий шаблон, а он, в свою
очередь, может передать их другому компоненту, который на основе их может
что-либо вывести на экран.
Дополнительным преимуществом такого подхода оказывается возможность
моделирования сайта путем нехитрого изменения его шаблонов – то есть получается
интересная взаимосвязь дизайна и логики. Мы привыкли, что логика управляет
выводом, а здесь, отчасти, вывод управляет логикой.
Также отмечу, что вложенность компонентов может быть бесконечной. То есть
компонент в своей работе может запустить какой-то свой шаблон, который, в свою
очередь, может вызвать другой компонент.