Smarty - проблема с {assign var} и {capture}

DVLev

Новичок
Smarty - проблема с {assign var} и {capture}

Добрый день.

Есть шаблон:

-------------------------------
{capture name='first'}
{assign var=control value='first'}
{/capture}

{capture name='second'}
{assign var=control value='second'}
{/capture}

{$control}
------------------------------

Выводит "second", а по логике вообще ничего не должен выводить, поскольку я ни разу не вызвал {$smarty.capture.first} или {$smarty.capture.second}. Это баг или фича?

На самом деле проблема разумеется намного сложнее, я просто упростил для наглядности пример. Я честно говоря думал, что capture - это аналог функций, т.е. до тех пор пока они явно не вызваны - код в них не отрабатывается, получается, что я ошибался. Следствие из всего этого - если у Вас очень большой шаблон и там много вызовов вспомогательных функций типа {html_options}, {html_image} и прочих, в различных блоках {capture} - они при выводе все отрабатываются в независимости нужно это или нет, соответственно появляются тормоза при выводе.
 

alexhemp

Новичок
DVLev

Ты неверно думал. код внутри capture выполняется, но не выводиться, а записывается в переменную.

capture не вызывается потом, capture записывает ЗНАЧЕНИЕ, которое ты потом ИСПОЛЬЗУЕШЬ.

Тебе нужно выполнение кусков кода по условию?
НАПИШИ if

т.е.

{if условие}
{capture assign=varname}тут вывод{/capture}
{/if}

Потом в нужном месте

{if $varname}...{$varname}...{/if}
 

DVLev

Новичок
С условиями if все понятно. Проблема не в этом.

Изменим пример добавив вызов шаблона.
--------------------------------------------------
{capture name='first'}
{assign var=control value='first'}
{/capture}

{capture name='second'}
{assign var=control value='second'}
{/capture}

{$smarty.capture.first}
{$control}
--------------------------------------

Мне кажется все таки было логичнее чтобы выводилось 'first', а выводится 'second', но это по всей видимости специфика. Хотелось бы потом $control использовать для организации дальнейшей логики формирования шаблона.

Понятно, что можно изменить логику шаблона, но вопрос был именно по этому примеру. Когда у Вас шаблон с 50 capture и довольно разветвленным выводом, как-то не очень хочется заморачиваться с введением дополнительных условий. А тут assign выступает фактически как флаг, что именно такие capture, вызывались.
 

alexhemp

Новичок
DVLev

Послушай, ты не прочитал мануал и пытался использовать capture не по назначению - а теперь жалуешься?

ПРОЧИТАЙ МАНУАЛ! CAPTURE - НЕ ФУНКЦИЯ! Это конструкция, дает команду Smarty отпарсить текст и записать в переменную.
Smarty делает это немедленно, не дожидаясь, когда там что-то "вызывут", посмотри - результат capture необязательно получать через $smarty.capture - можно и переменной назначить.

И ОБРАЩЕНИЕ к переменной не означает ВЫЗОВА ФУНКЦИИ и НЕ МОЖЕТ ОЗНАЧАТЬ.

Как тебе еще объяснить, что CAPTURE РАБОТАЕТ ИНАЧЕ ЧЕМ ТЫ СЕБЕ ВЫДУМАЛ.

ЭТО ТВОЯ ОШИБКА - И ТЕБЕ ЕЕ ИСПРАВЛЯТЬ.
 

kvf77

Red Devil
DVLev

к чему тут эта твоя истерика? тебе же правильно все написали
 
Сверху