Объекты
Smarty позволяет использовать в шаблонах объекты PHP.
Существуют два способа их вызова. Первый - зарегистрировать объект для
шаблона, затем вызвать его примерно так же, как и пользовательскую
функцию. Второй - присвоить объект шаблону и использовать его,
как любую другую присвоенную переменную. Первый метод гораздо аккуратнее
и безопаснее, так как у зарегистрированного объекта можно ограничить
свойства и методы. Но, в тоже время, зарегистрированный объект
нельзя использовать в циклах, нельзя помещать в массив объектов
и так далее. Выбор способа за вами, но используйте по
возможности первый, чтобы максимально упростить синтаксис шаблона.
В безопасном режиме недоступны приватные методы и
функции (имена которых начинаются с "_").
Если существует и метод, и свойство с одинаковыми именами,
то будет использован метод.
Вы можете ограничить использование объекта только некоторыми
методами и свойствами. Для этого перечислите их в массиве и укажите
этот массив третьим параметром при регистрации объекта.
По умолчанию, параметры из шаблона передаются объекту точно так же,
как и пользовательской функции. Первым параметром передаётся
ассоциативный массив, вторым - объект Smarty. Если вы хотите передавать
параметры по одному, как при традиционном обращении с объектами, установите
четвёртый параметр вызова в false.
использование зарегистрированного или присвоенного объекта
register_object("foobar",$myobj);
// если мы хотим ограничиться определёнными методами или свойствами, перечисляем их при регистрации
$smarty->register_object("foobar",$myobj,array('meth1','meth2','prop1'));
// если мы хотим использовать традиционный способ передачи параметров объекту, регистрируем объект с соответствующим
// флагом, установленным в false
$smarty->register_object("foobar",$myobj,null,false);
// Так же мы можем присвоить объект. Желательно присваивать объект по ссылке.
$smarty->assign_by_ref("myobj", $myobj);
$smarty->display("index.tpl");
?>
]]>
Вот так нужно обращаться к вашим объектам в index.tpl:
meth1 p1="foo" p2=$bar}
{* результат можно поместить в переменную *}
{foobar->meth1 p1="foo" p2=$bar assign="output"}
в результате получаем {$output}
{* вызываем присвоенный объект *}
{$myobj->meth1("foo",$bar)}
]]>