<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Chapter 15. Расширенные возможности</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.75.1">
<link rel="home" href="index.html" title="Руководство по Smarty">
<link rel="up" href="smarty.for.programmers.html" title="Part III. Smarty для программистов">
<link rel="prev" href="caching.cacheable.html" title="Управление кэшированием результатов работы плагинов">
<link rel="next" href="advanced.features.prefilters.html" title="Префильтры">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<div class="navheader">
<table width="100%" summary="Navigation header">
<tr><th colspan="3" align="center">Chapter 15. Расширенные возможности</th></tr>
<tr>
<td width="20%" align="left">
<a accesskey="p" href="caching.cacheable.html">Prev</a> </td>
<th width="60%" align="center">Part III. Smarty для программистов</th>
<td width="20%" align="right"> <a accesskey="n" href="advanced.features.prefilters.html">Next</a>
</td>
</tr>
</table>
<hr>
</div>
<div class="chapter" title="Chapter 15. Расширенные возможности">
<div class="titlepage"><div><div><h2 class="title">
<a name="advanced.features"></a>Chapter 15. Расширенные возможности</h2></div></div></div>
<div class="toc">
<p><b>Table of Contents</b></p>
<dl>
<dt><span class="sect1"><a href="advanced.features.html#advanced.features.objects">Объекты</a></span></dt>
<dt><span class="sect1"><a href="advanced.features.prefilters.html">Префильтры</a></span></dt>
<dt><span class="sect1"><a href="advanced.features.postfilters.html">Постфильтры</a></span></dt>
<dt><span class="sect1"><a href="advanced.features.outputfilters.html">Фильтры вывода</a></span></dt>
<dt><span class="sect1"><a href="section.template.cache.handler.func.html">Управление кэшированием</a></span></dt>
<dt><span class="sect1"><a href="template.resources.html">Ресурсы</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="template.resources.html#templates.from.template.dir">Шаблоны из папки $template_dir</a></span></dt>
<dt><span class="sect2"><a href="template.resources.html#templates.from.any.dir">Шаблоны из произвольной папки</a></span></dt>
<dt><span class="sect2"><a href="template.resources.html#templates.from.elsewhere">Шаблоны из прочих источников</a></span></dt>
<dt><span class="sect2"><a href="template.resources.html#default.template.handler.function">Функция для обработки шаблона по умолчанию</a></span></dt>
</dl></dd>
</dl>
</div>
<div class="sect1" title="Объекты">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="advanced.features.objects"></a>Объекты</h2></div></div></div>
<p>
Smarty позволяет использовать в шаблонах
<a class="ulink" href="http://php.net/object" target="_top">объекты</a> PHP.
Существуют два способа их вызова. Первый -
<a class="link" href="api.register.object.html" title="register_object">зарегистрировать объект</a> для
шаблона, затем вызвать его примерно так же, как и
<a class="link" href="language.custom.functions.html" title="Chapter 8. Пользовательские Функции">пользовательские функции</a>.
Второй - <a class="link" href="api.assign.html" title="assign()">назначить</a> объект шаблону и использовать его,
как любую другую присвоенную переменную. Первый метод гораздо аккуратнее
и безопаснее, так как у зарегистрированного объекта можно ограничить
свойства и методы. Но, в тоже время, <span class="bold"><strong>зарегистрированный объект
нельзя использовать в циклах, нельзя помещать в массив объектов</strong></span>,
и так далее. Выбор способа за вами, но используйте по
возможности первый, чтобы максимально упростить синтаксис шаблона.
</p>
<p>
В <a class="link" href="variable.security.html" title="$security">безопасном режиме</a>
недоступны приватные методы и функции (имена которых начинаются с "_").
Если существует и метод, и свойство с одинаковыми именами,
то будет использован метод.
</p>
<p>
Вы можете ограничить использование объекта только некоторыми
методами и свойствами. Для этого перечислите их в массиве и укажите
этот массив третьим параметром при регистрации объекта.
</p>
<p>
По умолчанию, параметры из шаблона передаются объекту точно так же,
как и
<a class="link" href="language.custom.functions.html" title="Chapter 8. Пользовательские Функции">пользовательской функции</a>.
Первым параметром передаётся
ассоциативный массив, вторым - объект Smarty. Если вы хотите передавать
параметры по одному, как при традиционном обращении с объектами, установите
четвёртый параметр вызова в false.
</p>
<p>
Необязательный пятый параметр вступает в силу только в том случае, если
свойство <em class="parameter"><code>format</code></em> равно <code class="literal">true</code>.
Он содержит список методов, которые должны обрабатываться как блоки.
Это означает, что в шаблоне у методы будут иметь закрывающие тэги
(<code class="literal">{foobar->meth2}...{/foobar->meth2}</code>) и параметры
методов будут иметь такие же синопсисы, как и параметры для
<a class="link" href="plugins.block.functions.html" title="Блоковые функции">block-function-plugins</a>:
<em class="parameter"><code>$params</code></em>,
<em class="parameter"><code>$content</code></em>,
<em class="parameter"><code>&$smarty</code></em>
и
<em class="parameter"><code>&$repeat</code></em>. Кроме того, они ведут себя так же, как и
block-function-plugins.
</p>
<div class="example">
<a name="id2735636"></a><p class="title"><b>Example 15.1. использование зарегистрированного или присвоенного объекта</b></p>
<div class="example-contents">
<pre class="programlisting">
<?php
// сам объект
class My_Object {
function meth1($params, &$smarty_obj) {
return 'this is my meth1';
}
}
$myobj = new My_Object;
// регистрация объекта (по ссылке)
$smarty->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');
?>
</pre>
<p>
А вот так можно получить доступ к объекту в index.tpl:
</p>
<pre class="programlisting">
{* обращаемся к нашему зарегистрированному объекту *}
{foobar->meth1 p1='foo' p2=$bar}
{* вывод объекта можно сохранить в переменную *}
{foobar->meth1 p1='foo' p2=$bar assign='output'}
the output was {$output}
{* обращаемся к нашему назначенному объекту *}
{$myobj->meth1('foo',$bar)}
</pre>
</div>
</div>
<br class="example-break"><p>
См. также
<a class="link" href="api.register.object.html" title="register_object">register_object()</a>
и
<a class="link" href="api.assign.html" title="assign()">assign()</a>
</p>
</div>
</div>
<div class="navfooter">
<hr>
<table width="100%" summary="Navigation footer">
<tr>
<td width="40%" align="left">
<a accesskey="p" href="caching.cacheable.html">Prev</a> </td>
<td width="20%" align="center"><a accesskey="u" href="smarty.for.programmers.html">Up</a></td>
<td width="40%" align="right"> <a accesskey="n" href="advanced.features.prefilters.html">Next</a>
</td>
</tr>
<tr>
<td width="40%" align="left" valign="top">Управление кэшированием результатов работы плагинов </td>
<td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td>
<td width="40%" align="right" valign="top"> Префильтры</td>
</tr>
</table>
</div>
</body>
</html>