Зачем нужен Smarty

prog90

Новичок
Зачем нужны такие вещи как Smarty? Все равно разделения программы и представления нет:
Те же переменные что и в php, только еще в фигурных скобках:
PHP:
<script type="text/javascript" src="{$smarty.const.URL_JS}/category.js"></script>
{* category view *}
<div class="clearfix" id="cat_path">
<table cellpadding="0" border="0" class="cat_path_in_productpage">
	<tr>
	{if $selected_category.picture}
	<td><img src="{$smarty.const.URL_PRODUCTS_PICTURES}/{$selected_category.picture|escape:'url'}" alt="{$selected_category.name|escape:'html'}" title="{$selected_category.name|escape:'html'}" >
	</td>
	{/if}
	<td><a href="{"?"|set_query}">{"lnk_homepage"|translate}</a>&nbsp;{$BREADCRUMB_DELIMITER}
		{section name=i loop=$product_category_path}
		{if $product_category_path[i].categoryID != 1}
		<a href='{"?categoryID=`$product_category_path[i].categoryID`&category_slug=`$product_category_path[i].slug`"|set_query_html}'>{$product_category_path[i].name|escape:'html'|default:"(no name)"}</a>{if !$smarty.section.i.last}&nbsp;{$BREADCRUMB_DELIMITER}{/if}
		{/if}
		{/section}
	</td>
	</tr>
	</table>
	</div>
	<div class="clearfix" id="cat_top_tree">
{*
@features "Search products by params"
*}
		{if $allow_products_search}
		{include file="advanced_search_in_category.tpl.html"}
		{/if}
{*
@features
*}
		
		<div id="cat_info_left_block">
		{* description *}
		{$selected_category.description}
		{if $subcategories_to_be_shown}
		{* show subcategories *}
		<p>{section name=i loop=$subcategories_to_be_shown}
		{if $subcategories_to_be_shown[i][3]}
			{assign var=_sub_category_url value="?categoryID=`$subcategories_to_be_shown[i][0]`&category_slug=`$subcategories_to_be_shown[i][3]`"|set_query_html}
		{else}
		{assign var=_sub_category_url value="?categoryID=`$subcategories_to_be_shown[i][0]`"|set_query_html}
		{/if}
		 <a href="{$_sub_category_url}">{$subcategories_to_be_shown[i][1]}</a>
		 ({$subcategories_to_be_shown[i][2]})<br>
		{/section}</p>
		{/if}
		</div>

</div>

<center>
{if $products_to_show}

{*
 * @features "Products comparison"
*}
{include file="comparison_products_button.html"}
{*
 * @features
*}


{if $string_product_sort}<p id="cat_product_sort">{$string_product_sort}</p>{/if}


{if $catalog_navigator}<p>{$catalog_navigator}</p>{/if}
	
<table cellpadding="6" border="0" width="95%">
  {foreach from=$products_to_show item=product_item name=product_brief}
	{if $smarty.foreach.product_brief.index is div by $smarty.const.CONF_COLUMNS_PER_PAGE}<tr>{/if}
	<td valign="top" width="{math equation="100 / x" x=$smarty.const.CONF_COLUMNS_PER_PAGE format="%d%%"}">
		{include file="product_brief.html" product_info=$product_item}
	</td>
	{if ($smarty.foreach.product_brief.index+1) is div by $smarty.const.CONF_COLUMNS_PER_PAGE}</tr>{elseif $smarty.foreach.product_brief.last}</tr>{/if}
  {/foreach}
</table> 
 
{if $catalog_navigator}<p>{$catalog_navigator}</p>{/if}

{*
 * @features "Products comparison"
*}
{include file="comparison_products_button.html"}
{*
 * @features
*}

{else}
<p>
	{if $search_with_change_category_ability && !$advanced_search_in_category}
		&nbsp;
	{else}
		{if $advanced_search_in_category}
			&nbsp;&nbsp;&nbsp;&nbsp;< {"srch_no_matches_found"|translate} >
		{else}
			&nbsp;&nbsp;&nbsp;&nbsp;< {"str_empty_category"|translate} >
		{/if}
	{/if}
</p>
{/if}

</center>
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Зачем вообще нужны шаблоны? все равно там в них выводятся переменные
 

Sufir

Я не волшебник, я только учусь
Все равно разделения программы и представления нет
Есть. Логика представления в виде переменных, условий и циклов - это не то же самое что логика приложения.
 

Sufir

Я не волшебник, я только учусь
Зачем вообще нужны шаблоны? все равно там в них выводятся переменные
Шаблоны нужны, а вот зачем нужны шаблонизаторы? Приходится иметь с ними дело, но до ужаса не люблю. Никакого смысла в них нет. Всё что делается с их помощью, так-же делается с помощью нативного php, только удобнее. Единственное что они дают (на мой взгляд) - это ограничивают начинающих разработчиков не давая свалить в шаблон логику обработки данных, а только логику представления. Больше никакой практической ценности в них не вижу.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Sufir
Ты прими во внимание, что php сам и есть шаблонизатор, остальные же так - надстройка.
 

Фанат

oncle terrible
Команда форума
"Такие вещи как смарти" нужны для того, чтобы чтобы разделять логику получения данных от логики отображения данных.
Такое разделение сильно облегчает разработку, сопровождение и переносимость программ.

Конкретно смарти представляется избыточным решением, поскольку все то же самое может делать и сам РНР. В последнем случае программа на РНР разделяется, условно, на две части. одна из которых отвечает за получение данных, а вторая - за отображение.
 

prog90

Новичок
ясно. А зачем вообще нужен класс View? Зачем создавать класс для передачи данных в шаблоны, если можно их просто подключить через include, а переменные заполнить в контроллере?
 

scorpion-ds

Новичок
А мне вот тоже не особо понятен смысл Smarty, я в своей работе использую самописный шаблонизатор, в котором всего несколько возможностей:
- вставить переменную или сразу несколько переменных;
- вставлять данные в цикле, для списков к примеру;
- выбрать фрагмент шаблона по условию, что-то вроде switch
ну еще всякое кеширование и т.п. В коде шаблонов используются только "ключи", PHP кода нет.

Но мне этого вполне хватает, что бы отделять шаблоны от PHP кода.
 

soines

Новичок
А мне вот тоже не особо понятен смысл Smarty, я в своей работе использую самописный шаблонизатор, в котором всего несколько возможностей:
- вставить переменную или сразу несколько переменных;
- вставлять данные в цикле, для списков к примеру;
- выбрать фрагмент шаблона по условию, что-то вроде switch
ну еще всякое кеширование и т.п. В коде шаблонов используются только "ключи", PHP кода нет.

Но мне этого вполне хватает, что бы отделять шаблоны от PHP кода.
Отделять нужно не шаблоны от PHP-кода, а представление от бизнес-логики. До сих пор не понимаю, чем {if}, {else} и т.д. лучше чем пыховские аналоги.
 

Period

Новичок
С появлением наследования в шаблонах, вопрос зачем нужны шаблонизаторы можно не ставить. Нативным PHP без дополнительных костылей ( == свой шаблонизатор aka велосипед), не сделаешь обработку шаблонов снизу вверх (это когда к шаблону "статья" подтягивается шаблон "дизайн сайта"), только сверху вниз (когда к шаблону "дизайн сайта" подключается шаблон "статья").

До сих пор не понимаю, чем {if}, {else} и т.д. лучше чем пыховские аналоги.
Читабельность выше.

+ не забывайте про безопасность. Файлы .tpl более безопасны, чем файлы .php. Это если над проектом работает много людей и шаблоны, например, можно редактировать из CMS.

У нативного PHP, кроме скорости, никаких преимуществ над шаблонами нет.
 

ksnk

прохожий
У нативного PHP, кроме скорости, никаких преимуществ над шаблонами нет.
Вообще-то и преимущества в скорости у них нет. Любой приличный шаблонизатор компилирует шаблон в PHP код, который не сильно неэффективней написанного вручную.
 

Absinthe

жожо
prog90 зачем нужен пхп(с, линукс и т.д.)? Все равно потом процессор бинарный код выполняет.
 

Absinthe

жожо
Любой приличный шаблонизатор компилирует шаблон в PHP код, который не сильно неэффективней написанного вручную.
Смарти побыстрее будет, чем пхп, если не считать время загрузки: потому что будут обработаны все блоки уже.
 
  • Like
Реакции: AmdY

AmdY

Пью пиво
Команда форума
Absinthe
+1, особенно его клон Quicky c хитрым кешем
 

Фанат

oncle terrible
Команда форума
Читабельность выше.
Ну, это полная фигня, упоминания явно не стоила.
Нативным PHP без дополнительных костылей ( == свой шаблонизатор aka велосипед), не сделаешь обработку шаблонов снизу вверх (это когда к шаблону "статья" подтягивается шаблон "дизайн сайта"), только сверху вниз (когда к шаблону "дизайн сайта" подключается шаблон "статья").
А вот здесь хотелось бы поподробнее.
Очень желательно - с примером.
 

Фанат

oncle terrible
Команда форума
Специально пишу отдельным топиком, чтобы не отвлекать от вышележащей просьбы про пример.

Я как раз сейчас думаю над дизайном шаблонизатора, и единственное неудобство, которое вижу - это необходимость прописывать вызов всех дополнительных блоков в контроллере (чтобы как раз избежать костылей с парсингом, когда о том, какой блок подключать, мы узнаем прямо из шаблона).
Но я, кстати, не уверен, что это неудобство.

То есть, в текущем варианте при обращении к странице (контроллеру) он формирует данные, переопределяет (если надо) основной шаблон, и дергает шаблонизатор, передавая ему имя шаблона страницы.
Шаблонизатор запускает контроллер основного шаблона, который сначала дергает контроллеры дополнительных блоков (опорос какой-нибудь лажовый, или облакотегов), а потом уже занимается только заполнением шаблонов.
При этом дополнительные блоки в основном шаблоне заполняются по принципу: есть данные из контроллера - пишем их. Нету - запускаем дефолтный контроллер.
Вот только вызов всех этихблоков не очень понятен. То ли везде прямые инклюды, то ли буфферинг, то ли действительно свой шаблонизатор с метками.

Сильно красивее всей этой чехарды, кстати, будет старый добрый SSI.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
То есть, в текущем варианте при обращении к странице (контроллеру) он формирует данные, переопределяет (если надо) основной шаблон, и дергает шаблонизатор, передавая ему имя шаблона страницы.
Шаблонизатор запускает контроллер основного шаблона, который сначала дергает контроллеры дополнительных блоков (опорос какой-нибудь лажовый, или облакотегов), а потом уже занимается только заполнением шаблонов.
При этом дополнительные блоки в основном шаблоне заполняются по принципу: есть данные из контроллера - пишем их. Нету - запускаем дефолтный контроллер.
Вот только вызов всех этихблоков не очень понятен. То ли везде прямые инклюды, то ли буфферинг, то ли действительно свой шаблонизатор с метками.
Почти все вышеописанное есть в твиге, а с учетом того, что для него вышел еще и экстеншн...
 
Сверху