На самом деле я потратил некоторое время на свои сторонние проекты, выясняя, являются ли утверждения из моих шаблонов на сайте mvc (или, по крайней мере, стремящимся быть mvc), над которым я работаю.
Если вы хотите придерживаться строжайших значений mvc, то, по вашему мнению, не должно быть никаких логических конструкций. Так что даже при рендеринге набора - скажем, списка - у вас должен быть цикл foreach, который (от вашего контроллера) имеет аргументы для части шаблона и вызывает эту часть снова и снова. Что мне не нравится в этом, так это то, что это может привести к очень неэффективному коду, если вы не будете осторожны с тем, как вы агрегируете свое окончательное, составное представление, содержащее все части вашего представления. Это особенно верно, если используемая вами библиотека шаблонов имеет метод рендеринга b / c, если вы делаете это таким образом - вы, вероятно, будете вызывать «рендер» снова и снова. По сути, вам, скорее всего, придется выполнять агрегирование строк, а не строить представление одним потоком.
Итак - что я делал, так это то, что у меня есть файлы шаблонов, которые я на самом деле помечал как «контроллеры». Итак, здесь у меня будут IF / FOREACH или другие логические конструкции и вызовы соответствующих подшаблонов / подпредставлений. Я не думаю, что кто-то сказал, что ваш файл шаблона должен быть просто вид. Я думаю, что парадигма в том, что ваш ВЗГЛЯД НЕ должен иметь логических конструкций. Изоляция этих логических конструкций путем создания файлов шаблонов, которые на самом деле являются контроллерами, а не частями вашего представления, должна обеспечить счастливую среду.
Пример (с использованием библиотеки шаблонов Google Closure)
Смешение логики и представления (не очень хорошо ... но вы действительно не поймете почему, пока не построите сложное представление таким образом):
/**
*
* Template description
*
* @param paramA description of paramA
* @param paramB description of paramB
* @param paramC description of paramC
*
*
*/
{template .myTemplate}
<div class="{$paramA}">
{if $paramC}
<span class="{$paramB}">Some content</span>
{/if}
</div>
{/template}
Разделение логики и вида. Обратите внимание, что файл шаблона контроллера ничего не добавляет к представлению. Он просто вызывает другой шаблон.
Файл шаблона контроллера:
/**
*
* Template description
*
* @param condition description of condition
* @param parameters parameters to call subtemplate with
*
*/
{template .myTemplate}
{if $condition}
{call .getTemplForCondition data="$parameters" /}
{else}
{call .getTempl data="$parameters" /}
{/if}
{/template}
А потом файл шаблона ... теперь без логики ...
/**
*
* Template description
*
* @param paramA description of paramA
* @param paramB description of paramB
*
*/
{template .getTemplForCondition}
<div class="{$paramA}">
<span class="{$paramB}">Some content</span>
</div>
{/template}
/**
*
* Template description
*
* @param paramA description of paramA
*
*/
{template .myTemplate}
<div class="{$paramA}"></div>
{/template}