Разработка сайтов и создание интернет магазинов.

Функция «Компонент»

К текущему моменту 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, будет также доступно не только вашему компоненту, но и общему (вызывающему) шаблону, а это значит, что компоненты вовсе не обязаны всегда выводить что-либо на экран, они вполне могут передавать подготовленные данные в общий шаблон, а он, в свою очередь, может передать их другому компоненту, который на основе их может что-либо вывести на экран.

Дополнительным преимуществом такого подхода оказывается возможность моделирования сайта путем нехитрого изменения его шаблонов – то есть получается интересная взаимосвязь дизайна и логики. Мы привыкли, что логика управляет выводом, а здесь, отчасти, вывод управляет логикой.

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