<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
	<title>Хабрахабр / Комментарии к посту «Наследование шаблонов в Smarty» в блоге «PHP»</title>
	<link>http://habrahabr.ru/rss/post/37962/</link>
	<description><![CDATA[Новые комментарии к посту «Наследование шаблонов в Smarty» в блоге «PHP»]]></description>
	<language>ru</language>
	<managingEditor>editor@habrahabr.ru</managingEditor>
	<generator>habrahabr.ru</generator>
	<pubDate>Sat, 11 Feb 2012 11:58:28 GMT</pubDate>
	<lastBuildDate></lastBuildDate>
	<image>
		<link>http://habrahabr.ru/</link>
		<url>http://habrahabr.ru/i/logo.gif</url>
		<title>Хабрахабр</title>
	</image>
	

	
	
	
	
	
		
	
		<item>
			<title>25.06.2010 14:08:58 col</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/37962/#comment_2992997</guid>
			<link>http://habrahabr.ru/blogs/php/37962/#comment_2992997</link>
			<description><![CDATA[Попробовал, понравилось. <br/>
Всё было хорошо пока не включил кэширование в Smarty.<br/>
Наследование тут же отвалилось, пробую понять что к чему, но изнутри Samarty знаю плохо.<br/>
 <br/>
Сталкивались с подобным?<br/>
]]></description>
			<pubDate>Fri, 25 Jun 2010 14:08:58 GMT</pubDate>
			<author>col</author>
		</item>
	

	
		<item>
			<title>15.06.2010 12:12:47 kid</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/37962/#comment_2954310</guid>
			<link>http://habrahabr.ru/blogs/php/37962/#comment_2954310</link>
			<description><![CDATA[Вариант решения проблемы с output фильтрами:<br/>
<br/>
0. Добавляете в свой унаследованный класс smarty поле is_page<br/>
 public $is_page = false;<br/>
<br/>
1. создаёте smarty-функцию {eop}<br/>
 /**<br/>
 * End Of Page<br/>
 * @return <br/>
 * @param object $params<br/>
 * @param object $smarty<br/>
 */<br/>
 function smarty_function_eop($params, &$smarty)<br/>
 {<br/>
 $smarty-&gt;is_page = true;<br/>
 }<br/>
<br/>
2. В конце главного шаблона вызываете функцию:<br/>
 &lt;/body&gt;<br/>
&lt;/html&gt;<br/>
{eop}<br/>
<br/>
3. В самом начале output фильтра проверяете, а не конец ли страницы<br/>
function smarty_outputfilter_head($tpl_output, &$smarty)<br/>
 {<br/>
 if (!$smarty-&gt;is_page)<br/>
 return $tpl_output;<br/>
…<br/>
 }<br/>
<br/>
4. Правите smarty_block_extends:<br/>
function smarty_block_extends($params, $content, $smarty, $repeat)<br/>
{<br/>
 /** Никому не доверяйте. Даже себе! */<br/>
 if (false === array_key_exists('template', $params)) {<br/>
 $smarty-&gt;trigger_error('Укажите шаблон, от которого наследуетесь!');<br/>
 }<br/>
<br/>
if (!$repeat)<br/>
 return $smarty-&gt;fetch('pages/'.$params['template']);<br/>
}]]></description>
			<pubDate>Tue, 15 Jun 2010 12:12:47 GMT</pubDate>
			<author>kid</author>
		</item>
	

	
		<item>
			<title>15.06.2010 12:11:01 kid</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/37962/#comment_2954296</guid>
			<link>http://habrahabr.ru/blogs/php/37962/#comment_2954296</link>
			<description><![CDATA[Вариант решения проблемы с output фильтрами:<br/>
<br/>
0. Добавляете в свой унаследованный класс smarty поле is_page<br/>
 public $is_page = false;<br/>
<br/>
1. создаёте smarty-функцию {eop}<br/>
 /**<br/>
 * End Of Page<br/>
 * @return <br/>
 * @param object $params<br/>
 * @param object $smarty<br/>
 */<br/>
 function smarty_function_eop($params, &$smarty)<br/>
 {<br/>
 $smarty-&gt;is_page = true;<br/>
 }<br/>
<br/>
2. В конце главного шаблона вызываете функцию:<br/>
 <br/>
<br/>
{eop}<br/>
<br/>
3. В самом начале output фильтра проверяете, а не конец ли страницы<br/>
function smarty_outputfilter_head($tpl_output, &$smarty)<br/>
 {<br/>
 if (!$smarty-&gt;is_page)<br/>
 return $tpl_output;<br/>
…<br/>
 }<br/>
<br/>
4. Правите smarty_block_extends:<br/>
function smarty_block_extends($params, $content, $smarty, $repeat)<br/>
{<br/>
 /** Никому не доверяйте. Даже себе! */<br/>
 if (false === array_key_exists('template', $params)) {<br/>
 $smarty-&gt;trigger_error('Укажите шаблон, от которого наследуетесь!');<br/>
 }<br/>
<br/>
if (!$repeat)<br/>
 return $smarty-&gt;fetch('pages/'.$params['template']);<br/>
}]]></description>
			<pubDate>Tue, 15 Jun 2010 12:11:01 GMT</pubDate>
			<author>kid</author>
		</item>
	

	
		<item>
			<title>14.08.2009 22:56:13 Arsenichev</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/37962/#comment_1894202</guid>
			<link>http://habrahabr.ru/blogs/php/37962/#comment_1894202</link>
			<description><![CDATA[Данный подход вызывает проблемы при использовании фильтров вывода, например сжатия страницы перед вызовом функции display:<br/>
<code>$this-&gt;register_outputfilter( array(&$this, 'gz_compress') );</code><br/>
<br/>
Проблема заключается в том что обвертываемый шаблон проходит дважды через фильтр вывода (первый раз при вызове функции <code>$smarty-&gt;fetch($params['template']);</code> а второй уже при выводе шаблона display()).<br/>
<br/>
Решения проблемы пока не нашел :(]]></description>
			<pubDate>Fri, 14 Aug 2009 22:56:13 GMT</pubDate>
			<author>Arsenichev</author>
		</item>
	

	
		<item>
			<title>29.06.2009 13:05:51 crYpt</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/37962/#comment_1750356</guid>
			<link>http://habrahabr.ru/blogs/php/37962/#comment_1750356</link>
			<description><![CDATA[При использовании вашего плагина для наследования шаблонов обнаружил несколько проблем:<br/>
1. базовый шаблон загружается дважды (при открывающем теге extends и при закрывающем)<br/>
2. если вставляю два наследуемых блока, а внутренний блок расширяю только для одного, то для второго будет подставлено содержимое первого вставленного блока. напрмер:<br/>
<pre>
a.tpl
----
{block name=head}parent{/block}
----

b.tpl
----
{extends template=&quot;a.tpl&quot;}
{block name=&quot;head&quot;}child{/block}
{/extends}

{extends template=&quot;a.tpl&quot;}{/extends}
---
</pre><br/>
<br/>
при отображении b.tpl будет выведено:<br/>
<pre>
child

child
</pre><br/>
<br/>
Следующий код позволяет решить эту проблему:<br/>
<br/>
плагины:<br/>
<pre>
&lt;?php

function smarty_block_block($params, $content, $smarty)
{
    if ( !array_key_exists('name', $params) )
    {
        $smarty-&gt;trigger_error('Block name is not set');
    }

    $name = $params['name'];

    if ( !$smarty-&gt;isBlockSet($name) && !is_null($content) )
    {
        $smarty-&gt;setBlock($name, $content);
    }

    if ( !is_null($content) )
    {
        return $smarty-&gt;getBlock($name);
    }
}

?&gt;

&lt;?php

function smarty_block_extends($params, $content, $smarty)
{
    if ( !array_key_exists('template', $params) )
    {
        $smarty-&gt;trigger_error('Plese set extending template name!');
    }
    
    // if open tag
    if ( is_null($content) )
    {
        $smarty-&gt;openBlocksScope();
    }
    else
    {
        $content = $smarty-&gt;fetch($params['template']);
        $smarty-&gt;closeBlocksScope();
        return $content;
    }
    return '';
}

?&gt;
</pre><br/>
<br/>
поля и методы класса SmartyX (extends Smarty)<br/>
<br/>
<pre>

    protected $_blocks = array(array());
    protected $_blocksScope = 0;

...

    public function openBlocksScope()
    {
        $this-&gt;_blocksScope++;
        $this-&gt;_blocks[$this-&gt;_blocksScope] = array();
    }
    
    public function closeBlocksScope()
    {
        if ( $this-&gt;_blocksScope &gt; 0 )
        {
            $this-&gt;_blocks[$this-&gt;_blocksScope] = array();
            $this-&gt;_blocksScope--;
        }
    }
    
    public function isBlockSet($key)
    {
        return array_key_exists($key, $this-&gt;_blocks[$this-&gt;_blocksScope]) !== false;
    }

    public function setBlock($key, $value)
    {
        $this-&gt;_blocks[$this-&gt;_blocksScope][$key] = $value;
    }

    public function getBlock($key)
    {
        if (array_key_exists($key, $this-&gt;_blocks[$this-&gt;_blocksScope]))
        {
            return $this-&gt;_blocks[$this-&gt;_blocksScope][$key];
        }
        return '';
    }

</pre><br/>
]]></description>
			<pubDate>Mon, 29 Jun 2009 13:05:51 GMT</pubDate>
			<author>crYpt</author>
		</item>
	

	
		<item>
			<title>29.06.2009 12:54:41 crYpt</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/37962/#comment_1750326</guid>
			<link>http://habrahabr.ru/blogs/php/37962/#comment_1750326</link>
			<description><![CDATA[При использовании вашего плагина для наследования шаблонов обнаружил несколько проблем:<br/>
1. базовый шаблон загружается дважды (при открывающем теге extends и при закрывающем)]]></description>
			<pubDate>Mon, 29 Jun 2009 12:54:41 GMT</pubDate>
			<author>crYpt</author>
		</item>
	

	
		<item>
			<title>10.01.2009 16:22:38 K1N6</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/37962/#comment_1265580</guid>
			<link>http://habrahabr.ru/blogs/php/37962/#comment_1265580</link>
			<description><![CDATA[$this-&gt;_blocks[$key][count($this-&gt;_blocks[$key])-1] <br/>
лучше заменить на <br/>
end($this-&gt;_blocks[$key]) <br/>
наверное]]></description>
			<pubDate>Sat, 10 Jan 2009 16:22:38 GMT</pubDate>
			<author>K1N6</author>
		</item>
	

	
		<item>
			<title>09.12.2008 23:50:00 roller</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/37962/#comment_1187295</guid>
			<link>http://habrahabr.ru/blogs/php/37962/#comment_1187295</link>
			<description><![CDATA[ну в том же ZF вроде как можно из шаблона вызывать другие контроллеры (а не тот который отрабатывается сейчас). И основной контроллер совершенно не обязан о них думать. В шаблон добавляем $this-&gt;action() и понеслась]]></description>
			<pubDate>Tue, 09 Dec 2008 23:50:00 GMT</pubDate>
			<author>roller</author>
		</item>
	

	
		<item>
			<title>03.12.2008 08:53:56 lexabug</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/37962/#comment_1169706</guid>
			<link>http://habrahabr.ru/blogs/php/37962/#comment_1169706</link>
			<description><![CDATA[нашел еще пару интересных особенностей этого решения.<br/>
Приведу реальный пример из своей практики.<br/>
<br/>
У меня есть класс Application. Он хранит сообщения об ошибках (например неправильно заполнена форма) во внутреннем массиве $_messages. Сообщения добавляются в массив следующим методом:<br/>
<pre>
    public function addMessage($text, $type = 'Error') {
        if (empty($text)) return true;
        
        if (empty($type))
        $type = 'Error';
        $this-&gt;_messages[$type][] = $text;
        return true;
    }
</pre><br/>
А извлекаются следующим методом:<br/>
<pre>
    public function getMessages($type = 'Error') {
        if (empty($type)) {
            $type = 'Error';
        }
        $aMessages = isset($this-&gt;_messages[$type]) ? $this-&gt;_messages[$type] : false;
        $this-&gt;_messages[$type] = null;
        return $aMessages;

    }
</pre><br/>
<br/>
А выводятся эти сообщения в шаблоне _errors.tpl, который инклудится в основном шаблоне layout.tpl, таким вот образом:<br/>
<pre>
{assign var=&quot;aFailureMessages&quot; value=$Application-&gt;getMessages('Error')}
{assign var=&quot;aSuccessfulMessages&quot; value=$Application-&gt;getMessages('Success')}
{assign var=&quot;aInformativeMessages&quot; value=$Application-&gt;getMessages('Informative')}

{if $aFailureMessages || $aSuccessfulMessages || $aInformativeMessages}
    &lt;table width=&quot;100%&quot; cellspacing=&quot;0&quot; cellspacing=&quot;0&quot; border=&quot;0&quot;&gt;
        {if $aFailureMessages}
        &lt;tr&gt;
            &lt;td class=&quot;error_box_red&quot;&gt;
                {section name=failure loop=$aFailureMessages}
                    {$aFailureMessages[failure]}
                {/section}
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;&nbsp;&lt;/td&gt;&lt;/tr&gt;
        {/if}

        {if $aSuccessfulMessages}
        &lt;tr&gt;
            &lt;td class=&quot;error_box_green&quot;&gt;
                {section name=success loop=$aSuccessfulMessages}
                    {$aSuccessfulMessages[success]}
                {/section}
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;&nbsp;&lt;/td&gt;&lt;/tr&gt;
        {/if}

        {if $aInformativeMessages}
        &lt;tr&gt;
            &lt;td class=&quot;error_box_blue&quot;&gt;
                {section name=informative loop=$aInformativeMessages}
                    {$aInformativeMessages[informative]}
                {/section}
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;&nbsp;&lt;/td&gt;&lt;/tr&gt;
        {/if}
    &lt;/table&gt;
{/if}
</pre><br/>
<br/>
Т.е. логика работы этого механизма такова, что если сообщение было выведено для просмотра значит его уже не нужно выводить.<br/>
<br/>
Но каково было мое удивление, когда применяя приведенный здесь механизм наследования шаблонов, я не увидел ни единого сообщения, добавленного в Application.<br/>
<br/>
В ходе отладки выяснилось, что метод getMessage вызывается по 2 раза на каждый тип сообщений, т.е. шаблон рендерится дважды!!!<br/>
Если посмотреть документацию smarty по блоковым функциям, коими являются smarty_block_extends и smarty_block_block, то они вызываются по два раза, при открытии и закрытии соответствующих тегов smarty {extends} и {block}. <br/>
<br/>
В случае с smarty_block_extends дважды вызовется метод $smarty-&gt;fetch!!! вот тут собака и порылась. Таким образом, родительский шаблон рендерится дважды. Но это не оптимально — раз, и приводит к печальному результату с моими сообщениями — два. <br/>
<br/>
Чтобы этого избежать, нужно рендерить родительский шаблон всего лишь один раз, когда у нас имеются данные для подстановки в теги {block}, когда был обработан шаблон-потомок, а именно во время второго вызова smarty_block_extends. <br/>
<br/>
Внутри функции smarty_block_extends ставим проверку вида:<br/>
<pre>
    if (!is_null($content)) {
        return $smarty-&gt;fetch($params['template'], ...);
    }
    return false;
</pre><br/>
<br/>
Казалось бы, проблема решена, но! Во время переназначения содержимого блоков в таком случае данные push'атся в обратном порядке, т.е. содержимое блока из шаблона-наследника будет не на ВЕРШИНЕ стека, а на его ДНЕ. Т.е при получении содержимого блока при помощи метода getBlock, мы получим значение блока из родительского шаблона. <br/>
<br/>
Решение: заменить в методе setBlock <br/>
<pre>
array_push($this-&gt;_blocks[$key], $value);
</pre><br/>
на <br/>
<pre>
array_unshift($this-&gt;_blocks[$key], $value);
</pre>]]></description>
			<pubDate>Wed, 03 Dec 2008 08:53:56 GMT</pubDate>
			<author>lexabug</author>
		</item>
	

	
		<item>
			<title>30.11.2008 09:37:13 developer</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/37962/#comment_1162218</guid>
			<link>http://habrahabr.ru/blogs/php/37962/#comment_1162218</link>
			<description><![CDATA[решение проблеммы {$item-&gt;getColorById(1)-&gt;getSizeById(2)-&gt;name}<br/>
для смарти здесь:<br/>
<a href="http://habrahabr.ru/blogs/php/45651/#comment_1159897">habrahabr.ru/blogs/php/45651/#comment_1159897</a>]]></description>
			<pubDate>Sun, 30 Nov 2008 09:37:13 GMT</pubDate>
			<author>developer</author>
		</item>
	

	
		<item>
			<title>12.09.2008 13:31:55 BasilSnowman</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/37962/#comment_953070</guid>
			<link>http://habrahabr.ru/blogs/php/37962/#comment_953070</link>
			<description><![CDATA[извиняюсь, что вторгаюсь в беседу, но уж очень любопытно глянуть на исправленную версию Smarty…]]></description>
			<pubDate>Fri, 12 Sep 2008 13:31:55 GMT</pubDate>
			<author>BasilSnowman</author>
		</item>
	

	
		<item>
			<title>28.08.2008 21:33:20 faeton</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/37962/#comment_908605</guid>
			<link>http://habrahabr.ru/blogs/php/37962/#comment_908605</link>
			<description><![CDATA[Подробнее-подробнее!]]></description>
			<pubDate>Thu, 28 Aug 2008 21:33:20 GMT</pubDate>
			<author>faeton</author>
		</item>
	

	
		<item>
			<title>26.08.2008 19:46:15 tenshi</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/37962/#comment_901552</guid>
			<link>http://habrahabr.ru/blogs/php/37962/#comment_901552</link>
			<description><![CDATA[xslt. и не только на пхп…]]></description>
			<pubDate>Tue, 26 Aug 2008 19:46:15 GMT</pubDate>
			<author>tenshi</author>
		</item>
	

	
		<item>
			<title>26.08.2008 14:13:09 sEXEcutor</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/37962/#comment_900453</guid>
			<link>http://habrahabr.ru/blogs/php/37962/#comment_900453</link>
			<description><![CDATA[Это не наследование, как вы это понимаете, а немного другой метод подстановки — контейнер, когда любой кусок кода может быть обернут в другой шаблон.<br/>
<br/>
А простой пример залупления :) — если вы напишете в файле index.tpl:<br/>
{include file=«index.tpl»}<br/>
<br/>
В плагине наследования/контейнера может быть так, что в каком-то из родительских шаблонов обрабатывается снова какой-то из подшаблонов. Например, если в вашем parent.tpl написать:<br/>
<br/>
{extends template=«child.tpl»}bla-bla-bla{/extends}<br/>
<br/>
всё закончится очень печально. Цепочка подключений может быть длиннее, что затруднит поиск повторного инклуда. Ситуация смоделированная, но вполне реальная в условиях по-другому спроектированной обширной системы.]]></description>
			<pubDate>Tue, 26 Aug 2008 14:13:09 GMT</pubDate>
			<author>sEXEcutor</author>
		</item>
	

	
		<item>
			<title>26.08.2008 14:08:14 develop7</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/37962/#comment_900393</guid>
			<link>http://habrahabr.ru/blogs/php/37962/#comment_900393</link>
			<description><![CDATA[Разве только в виде патча. И то, интерес чисто академический, т.к. Smarty не пользую уже давно. И, если всё будет хорошо, не буду и в дальнейшем.]]></description>
			<pubDate>Tue, 26 Aug 2008 14:08:14 GMT</pubDate>
			<author>develop7</author>
		</item>
	

	
		<item>
			<title>26.08.2008 14:01:58 marazmiki</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/37962/#comment_900327</guid>
			<link>http://habrahabr.ru/blogs/php/37962/#comment_900327</link>
			<description><![CDATA[Хотите увидеть эту приватную версию? :))]]></description>
			<pubDate>Tue, 26 Aug 2008 14:01:58 GMT</pubDate>
			<author>marazmiki</author>
		</item>
	

	
		<item>
			<title>26.08.2008 14:00:51 marazmiki</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/37962/#comment_900321</guid>
			<link>http://habrahabr.ru/blogs/php/37962/#comment_900321</link>
			<description><![CDATA[Да, нужно исправить одно регулярное выражение для разыменования объектов и методов и второе — для доступа к публичным свойствам класса. Если интересно, ближе к вечеру выложу]]></description>
			<pubDate>Tue, 26 Aug 2008 14:00:51 GMT</pubDate>
			<author>marazmiki</author>
		</item>
	

	
		<item>
			<title>26.08.2008 13:31:20 develop7</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/37962/#comment_900134</guid>
			<link>http://habrahabr.ru/blogs/php/37962/#comment_900134</link>
			<description><![CDATA[А мои бывшие коллеги до сих пор его используют. Изобретая чудовищные костыли для обхода вот таких вот недоработок.<br/>
Хотя ходят слухи, что где-то существует приватная версия смарти, которая позволяет вызывать методы объектов цепочкой… ;)]]></description>
			<pubDate>Tue, 26 Aug 2008 13:31:20 GMT</pubDate>
			<author>develop7</author>
		</item>
	

	
		<item>
			<title>26.08.2008 13:27:16 vitali</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/37962/#comment_900111</guid>
			<link>http://habrahabr.ru/blogs/php/37962/#comment_900111</link>
			<description><![CDATA[подскажите?<br/>
знаю только что нужно регекспы патчить, но они там такие, что чёрт ногу сломит…]]></description>
			<pubDate>Tue, 26 Aug 2008 13:27:16 GMT</pubDate>
			<author>vitali</author>
		</item>
	

	
		<item>
			<title>26.08.2008 13:20:25 marazmiki</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/37962/#comment_900081</guid>
			<link>http://habrahabr.ru/blogs/php/37962/#comment_900081</link>
			<description><![CDATA[Это элементарно исправляется.]]></description>
			<pubDate>Tue, 26 Aug 2008 13:20:25 GMT</pubDate>
			<author>marazmiki</author>
		</item>
	

	
		<item>
			<title>26.08.2008 13:14:51 vitali</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/37962/#comment_900055</guid>
			<link>http://habrahabr.ru/blogs/php/37962/#comment_900055</link>
			<description><![CDATA[Я отказался от смарти когда стал использовать больше ООП.<br/>
ведь конструкция типа<br/>
{$item-&gt;getColorById(1)-&gt;getSizeById(2)-&gt;name}<br/>
не работала :-(]]></description>
			<pubDate>Tue, 26 Aug 2008 13:14:51 GMT</pubDate>
			<author>vitali</author>
		</item>
	

	
		<item>
			<title>26.08.2008 11:49:03 svetko</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/37962/#comment_899706</guid>
			<link>http://habrahabr.ru/blogs/php/37962/#comment_899706</link>
			<description><![CDATA[эм… а если для страницы нужен не один child?]]></description>
			<pubDate>Tue, 26 Aug 2008 11:49:03 GMT</pubDate>
			<author>svetko</author>
		</item>
	

	
		<item>
			<title>26.08.2008 11:06:40 akzhan</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/37962/#comment_899536</guid>
			<link>http://habrahabr.ru/blogs/php/37962/#comment_899536</link>
			<description><![CDATA[хранить кэши блоков и страниц можно и не в файловой системе.<br/>
<br/>
правда, обычно это делается не на уровне шаблонизатора.<br/>
<br/>
например, для Drupal есть модуль cache router, который позволяет распределять кэшируемые объекты по разным хранилищам (файловая система, БД, memcached.]]></description>
			<pubDate>Tue, 26 Aug 2008 11:06:40 GMT</pubDate>
			<author>akzhan</author>
		</item>
	

	
		<item>
			<title>26.08.2008 10:39:27 marazmiki</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/37962/#comment_899361</guid>
			<link>http://habrahabr.ru/blogs/php/37962/#comment_899361</link>
			<description><![CDATA[Про «не пригодится» не соглашусь.<br/>
<br/>
Жёсткой необходимости нет почти ни в чём. Можно ведь и не заморачиваться на ООП в целом и Смарти в частности, а просто писать код линейно и потоком, не заморачиваясь на такие мелочи, как разделение логик приложения и отображения :). Вопрос в том, насколько потом ЭТО будет легко поддерживаться.<br/>
<br/>
То же самое и с шаблонами. Я уже на собственном опыте убедился, что подобный подход проще в дальнейшем расширении. Особенно актуально для создания новых шаблонов на основе уже существующих :)]]></description>
			<pubDate>Tue, 26 Aug 2008 10:39:27 GMT</pubDate>
			<author>marazmiki</author>
		</item>
	

	
		<item>
			<title>26.08.2008 10:32:37 Urevic</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/37962/#comment_899329</guid>
			<link>http://habrahabr.ru/blogs/php/37962/#comment_899329</link>
			<description><![CDATA[Такими темпами функциональность smarty доведут до уровня самого php и таки напишут шаблонизатор на шаблонизаторе, написанном на языке, который сам в свою очередь изначально был шаблонизатором. Прямо дух захватывает от такой многоуровневости ;) ]]></description>
			<pubDate>Tue, 26 Aug 2008 10:32:37 GMT</pubDate>
			<author>Urevic</author>
		</item>
	

	
		<item>
			<title>26.08.2008 10:27:09 marazmiki</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/37962/#comment_899313</guid>
			<link>http://habrahabr.ru/blogs/php/37962/#comment_899313</link>
			<description><![CDATA[Если честно, не совсем понял, где в Вашем случае наследование… Расскажите поподробнее, пожалуйста.<br/>
<br/>
А насчёт «ЗЫ»: что такое за*loop*ленные включения шаблонов? Если это просто инклюд шаблона внутри <code>{loop}{/loop}</code> или <code>{foreach}{/foreach}</code>, то, как мне кажется, проблем возникнуть не должно. Если ошибся — поправьте. Желательно с примерами :)]]></description>
			<pubDate>Tue, 26 Aug 2008 10:27:09 GMT</pubDate>
			<author>marazmiki</author>
		</item>
	

	
		<item>
			<title>26.08.2008 10:22:00 marazmiki</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/37962/#comment_899289</guid>
			<link>http://habrahabr.ru/blogs/php/37962/#comment_899289</link>
			<description><![CDATA[Если честно, я боялся этого вопроса и вероломно о нём умолчал. С другой стороны приятно, что я заставил кого-то задуматься :)<br/>
<br/>
Дело тут в том, что если эту проверку убрать, то в массив будет дампаться всё дерево наследования. И последним элементом, разумеется, будет «корень». Если непонятно, просто сделайте var_dump($template), увидите, что я имею в виду.<br/>
<br/>
Я пошёл на это ограничение, исходя именно из тех соображений, что случаи, когда «внук» будет точно таким же, как его «дедушка», довольно редки и ими можно пренебречь :)]]></description>
			<pubDate>Tue, 26 Aug 2008 10:22:00 GMT</pubDate>
			<author>marazmiki</author>
		</item>
	

	
		<item>
			<title>26.08.2008 10:03:14 DeadMoroz</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/37962/#comment_899197</guid>
			<link>http://habrahabr.ru/blogs/php/37962/#comment_899197</link>
			<description><![CDATA[А чем хуже вынести содержимое блока, который нужно подменить во внешний файл (в несколько внешних файлов) и в зависимости от параметров эти файлы подключать? Получится композиция вместо наследования, что по сути есть более гибкое решение.]]></description>
			<pubDate>Tue, 26 Aug 2008 10:03:14 GMT</pubDate>
			<author>DeadMoroz</author>
		</item>
	

	
		<item>
			<title>26.08.2008 09:58:05 fxposter</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/37962/#comment_899165</guid>
			<link>http://habrahabr.ru/blogs/php/37962/#comment_899165</link>
			<description><![CDATA[А вообще — спасибо за статью, коротко и ясно. Мне этого, честно говоря, не хватало! :)]]></description>
			<pubDate>Tue, 26 Aug 2008 09:58:05 GMT</pubDate>
			<author>fxposter</author>
		</item>
	

	
		<item>
			<title>26.08.2008 09:57:35 fxposter</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/37962/#comment_899162</guid>
			<link>http://habrahabr.ru/blogs/php/37962/#comment_899162</link>
			<description><![CDATA[Мдя… И что делать если я не дописал комментарий, он вставился непонятно с какой радости, да еще и при попытке его дописать — хабрахабр опять его вставил… :(]]></description>
			<pubDate>Tue, 26 Aug 2008 09:57:35 GMT</pubDate>
			<author>fxposter</author>
		</item>
	

	
		<item>
			<title>26.08.2008 09:54:44 fxposter</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/37962/#comment_899155</guid>
			<link>http://habrahabr.ru/blogs/php/37962/#comment_899155</link>
			<description><![CDATA[if (in_array($value, $this-&gt;_blocks[$key]) === false) { array_push($this-&gt;_blocks[$key], $value); }<br/>
<br/>
Вот этот момент, по-моему, лишний. Если я присвоил блоку значение, потом его переопределил, а потом хочу переопределить на предыдущее (хоть я этого, наверное, ни разу и не делал), то я хочу всё же получить последнее переопределенное значение. А так получается, что я могу написать:<br/>
<br/>
<pre>&lt;code&gt;{block name=«foo»}It's a parent{/block}&lt;/code&gt;</pre><br/>
<br/>
<pre>&lt;code&gt;{extends template=«parent.tpl»}
{block name=«foo»}It's a child{/block}
{/extends}&lt;/code&gt;</pre><br/>
<br/>
<pre>&lt;code&gt;{extends template=«parent.tpl»}
{block name=«foo»}It's a child{/block}
{/extends}&lt;/code&gt;</pre>]]></description>
			<pubDate>Tue, 26 Aug 2008 09:54:44 GMT</pubDate>
			<author>fxposter</author>
		</item>
	

	
		<item>
			<title>26.08.2008 09:53:54 fxposter</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/37962/#comment_899149</guid>
			<link>http://habrahabr.ru/blogs/php/37962/#comment_899149</link>
			<description><![CDATA[<code>if (in_array($value, $this-&gt;_blocks[$key]) === false) {
            array_push($this-&gt;_blocks[$key], $value);
        }</code><br/>
<br/>
Вот этот момент, по-моему, лишний. Если я присвоил блоку значение, потом его переопределил, а потом хочу переопределить на предыдущее (хоть я этого, наверное, ни разу и не делал), то я хочу всё же получить последнее переопределенное значение. А так получается, что я могу написать:<br/>
<br/>
parent.tpl:<br/>
<br/>
Inherit it! <br/>
<br/>
Just a paragraph<br/>
{block name=«foo»}It's a parent{/block}<br/>
<br/>
{extends template=«parent.tpl»}<br/>
{block name=«foo»}It's a child{/block}<br/>
{/extends}<br/>
]]></description>
			<pubDate>Tue, 26 Aug 2008 09:53:54 GMT</pubDate>
			<author>fxposter</author>
		</item>
	

	
		<item>
			<title>26.08.2008 09:53:46 akira</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/37962/#comment_899148</guid>
			<link>http://habrahabr.ru/blogs/php/37962/#comment_899148</link>
			<description><![CDATA[Спасибо.]]></description>
			<pubDate>Tue, 26 Aug 2008 09:53:46 GMT</pubDate>
			<author>akira</author>
		</item>
	

	
		<item>
			<title>26.08.2008 09:52:10 dasbot</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/37962/#comment_899142</guid>
			<link>http://habrahabr.ru/blogs/php/37962/#comment_899142</link>
			<description><![CDATA[он есть в посте. Там два файла parent.tpl и child.tpl в случае инклуда вам бы понадобились хидер и футер, вместо парента. Добавьте еще блок и вам понадобится хидер, футер и миддлер (гыгы).]]></description>
			<pubDate>Tue, 26 Aug 2008 09:52:10 GMT</pubDate>
			<author>dasbot</author>
		</item>
	

	
		<item>
			<title>26.08.2008 09:47:40 sEXEcutor</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/37962/#comment_899127</guid>
			<link>http://habrahabr.ru/blogs/php/37962/#comment_899127</link>
			<description><![CDATA[Похожая штука у меня называется «контейнерами» и обычно выглядит так:<br/>
<br/>
{container name=«layout.tpl»}<br/>
Something here…<br/>
{/container}<br/>
<br/>
В layout.tpl вложенный код вставляется тэгом {$_output}<br/>
<br/>
ЗЫ Не забудьте написать обработку за*loop*ленных включений шаблонов ;)]]></description>
			<pubDate>Tue, 26 Aug 2008 09:47:40 GMT</pubDate>
			<author>sEXEcutor</author>
		</item>
	

	
		<item>
			<title>26.08.2008 09:43:57 akira</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/37962/#comment_899104</guid>
			<link>http://habrahabr.ru/blogs/php/37962/#comment_899104</link>
			<description><![CDATA[был бы благодарен примером :) ]]></description>
			<pubDate>Tue, 26 Aug 2008 09:43:57 GMT</pubDate>
			<author>akira</author>
		</item>
	

	
		<item>
			<title>26.08.2008 09:41:19 dasbot</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/37962/#comment_899092</guid>
			<link>http://habrahabr.ru/blogs/php/37962/#comment_899092</link>
			<description><![CDATA[Ну, честно говоря, никогда не сталкивался с их жесткой необходимостью. Это интересная фишка на заметку, но зачастую она вам не пригодится. Потому она и не получила широкого распространения ;)]]></description>
			<pubDate>Tue, 26 Aug 2008 09:41:19 GMT</pubDate>
			<author>dasbot</author>
		</item>
	

	
		<item>
			<title>26.08.2008 09:39:04 dasbot</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/37962/#comment_899086</guid>
			<link>http://habrahabr.ru/blogs/php/37962/#comment_899086</link>
			<description><![CDATA[тем, что инклуд не меняется. В случае одного блока вам понадобится два инклуда <i>код_до</i> и <i>код после</i>. В случае двух блоков, уже три итд. В случае наследования, вам всегда нужен один (если наследуемся от одного конечно).]]></description>
			<pubDate>Tue, 26 Aug 2008 09:39:04 GMT</pubDate>
			<author>dasbot</author>
		</item>
	

	
		<item>
			<title>26.08.2008 09:17:24 akira</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/37962/#comment_899009</guid>
			<link>http://habrahabr.ru/blogs/php/37962/#comment_899009</link>
			<description><![CDATA[Хоть убейте меня, но я не понимаю чем это отличается от include?]]></description>
			<pubDate>Tue, 26 Aug 2008 09:17:24 GMT</pubDate>
			<author>akira</author>
		</item>
	

	
		<item>
			<title>26.08.2008 09:17:17 develop7</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/37962/#comment_899007</guid>
			<link>http://habrahabr.ru/blogs/php/37962/#comment_899007</link>
			<description><![CDATA[Это же <a href="http://www.symfony-project.org/book/1_1/07-Inside-the-View-Layer#Slots">слоты</a>, правда?]]></description>
			<pubDate>Tue, 26 Aug 2008 09:17:17 GMT</pubDate>
			<author>develop7</author>
		</item>
	

	
</channel>
</rss>

