Автор Тема: Шаблонизатор (4.0)  (Прочитано 4676 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Shturman

  • Разработчики
  • Опытный лис
  • *****
  • Сообщений: 416
  • Авторитет: 71
  • Пол: Мужской
    • Просмотр профиля
Шаблонизатор (4.0)
« : 27 февраля 2016, 12:28:51 »
@Rinat в одной из тем затронул вопрос что шаблонизатор нужно переделывать, что он много раз парсит одно и тоже. У кого какие конкретные мысли притенении по нему?

Мне не перестала нравиться тема с блоками <!-- @main -->, <!-- @nextlevel --> так как это позволяет держать весь шаблон в одном месте, если это необходимо, и при этом разделить, требуется правда думаю возможность взять этот шаблон и без блока, т.е. если кому-то хочется в модуле хранить каждый шаблон в отдельном файле, чтобы он смог это сделать не прописывая заголовок. Не уверен что сейчас это так.

Сами метки у меня вызывают смешанное чувство. С одной стороны они хорошо выделяются %%метка%%, с другой стороны режет глаз, может из-за схожести со строками форматирования. Вообщем тут для меня нет ясности, надо их менять или оставлять так.

Мне очень нравится методы шаблонизатора, используемые в CodeInteger. Когда в шаблоне можно задать кусок повторяющегося шаблона. Вот пример простой, кто не знает
<b>Список пользователей</b>
{list_user} 
Имя: {name}
Возраст: {age}
{/list_user} 

И в шаблонизатор мы передаем простой массив
[list_user] =
    [0] =
        [name] = Дима
        [age]    = 25
    [1] =
        [name] = Лена
        [age]    = 22
Думаю нам тоже это надо.
Но конструкция:
<b>Список пользователей</b>
%%list_user%%
Имя: %%name%%
Возраст: %%age%%
%%/list_user%% 
выглядит очень страшно и не читабельно, и мне нравится синтаксис {var_name}.

Вот все пока мысли которые у меня есть по новым шаблонам.

Оффлайн Rinat

  • Старый лис
  • *****
  • Сообщений: 602
  • Авторитет: 36
    • Просмотр профиля
Re: Шаблонизатор (4.0)
« Ответ #1 : 27 февраля 2016, 12:46:02 »
Да нет, я намекал на то, что очень много str_replace, последовательного выполняется.
Т.е кусок кода допустим:

$content = str_replace('%test%', 'test', 'html code');

.. затем функции и снова


$content = str_replace('%test%', 'test', $content);

и снова и снова...


Таким образом контент гоняется по многу раз.

А когда это дело можно объединить в массив и в конце вызвать str_replace. Писать просто правильно надо, вот я о чем.

С блоками идея - отличная, мне из за этого как раз Санта очень понравилась.

Что касается режет глаза..
Какой толк от того, что у нас %метка% поменяется на {метка}. Я вижу от этого только минусы, придется возится с шаблонами еще при переносе, а также вызовет путаницу. В одной версии так, в другой по другому.



Оффлайн bubek

  • Старый лис
  • *****
  • Сообщений: 615
  • Авторитет: 55
  • Пол: Мужской
    • Просмотр профиля
Re: Шаблонизатор (4.0)
« Ответ #2 : 27 февраля 2016, 16:23:08 »
Поддерживаю Рината.
Оптимизировать код чтобы srt_replace вызывался одной функцией

Оффлайн Rinat

  • Старый лис
  • *****
  • Сообщений: 602
  • Авторитет: 36
    • Просмотр профиля
Re: Шаблонизатор (4.0)
« Ответ #3 : 27 февраля 2016, 17:04:47 »
Я в 3.14 свой код по крайней мере имено так и делал, в kernel добавил tpl_replace.
Но тут у нас предлагается полностью поменять все и вся

Оффлайн Rinat

  • Старый лис
  • *****
  • Сообщений: 602
  • Авторитет: 36
    • Просмотр профиля
Re: Шаблонизатор (4.0)
« Ответ #4 : 27 февраля 2016, 22:45:59 »
Насчет второй идеи...
Да, это конечно удобно мне как программисту, но мне же неудобно как верстальщику.

Как верстальщику мне удобно:
<b>Список пользователей</b>
%rows%
<!--@row!-->
Имя: %name%
Возраст: %age%


Как программисту, когда я пишу модуль - мне неудобно, так как приходится обрабатывать дополнительный блок шаблона.

Однако, модуль написал один раз и забыл, а вот иметь дело с версткой и натяжкой приходится часто...

Если мы введем условные операторы, циклы, подключения сторонних шаблонов - то верстаку реально будет сложно понять html код:
Далеко ходить не надо, тот же реальный шаблон смарти (Prestashop):
{include file="$tpl_dir./errors.tpl"}
idSelectedCountry = {if isset($smarty.post.id_state)}{$smarty.post.id_state|intval}{else}{if isset($address->id_state)}{$address->id_state|intval}{else}false{/if}{/if};
countries = new Array();
countriesNeedIDNumber = new Array();
countriesNeedZipCode = new Array();
{foreach from=$countries item='country'}
{if isset($country.states) && $country.contains_states}
countries[{$country.id_country|intval}] = new Array();
{foreach from=$country.states item='state' name='states'}
countries[{$country.id_country|intval}].push({ldelim}'id' : '{$state.id_state}', 'name' : '{$state.name|escape:'htmlall':'UTF-8'}'{rdelim});
{/foreach}
{/if}
{if $country.need_identification_number}
countriesNeedIDNumber.push({$country.id_country|intval});
{/if}
{if isset($country.need_zip_code)}
countriesNeedZipCode[{$country.id_country|intval}] = {$country.need_zip_code};
{/if}
{/foreach}
$(function(){ldelim}
$('.id_state option[value={if isset($smarty.post.id_state)}{$smarty.post.id_state}{else}{if isset($address->id_state)}{$address->id_state|escape:'htmlall':'UTF-8'}{/if}{/if}]').attr('selected', 'selected');
{rdelim});
...
<fieldset>
<h3>{if isset($id_address)}{l s='Your address'}{else}{l s='New address'}{/if}</h3>
<p class="required text dni">
<label for="dni">{l s='Identification number'}</label>
<input type="text" class="text" name="dni" id="dni" value="{if isset($smarty.post.dni)}{$smarty.post.dni}{else}{if isset($address->dni)}{$address->dni|escape:'htmlall':'UTF-8'}{/if}{/if}" />
<span class="form_info">{l s='DNI / NIF / NIE'}</span>
<sup>*</sup>
</p>
{if $vat_display == 2}
<div id="vat_area">
{elseif $vat_display == 1}
<div id="vat_area" style="display: none;">
{else}
<div style="display: none;">
{/if}
<div id="vat_number">
<p class="text">
<label for="vat_number">{l s='VAT number'}</label>
<input type="text" class="text" name="vat_number" value="{if isset($smarty.post.vat_number)}{$smarty.post.vat_number}{else}{if isset($address->vat_number)}{$address->vat_number|escape:'htmlall':'UTF-8'}{/if}{/if}" />
</p>
</div>
</div>
{assign var="stateExist" value="false"}
...



Это реально html шаблон.
Моя позиция такова: ввести циклы и встроенные функции, но не более, так как  не хотелось чтобы шаблонизатор превращался в такое.
Начнешь вводить больше - программист будет перекладывать логику на шаблон.
Зачем парится и писать лишний код, когда можно условия прямо в шаблоне составить. А верстаку потом - разбирай что это...
« Последнее редактирование: 27 февраля 2016, 23:18:43 от Rinat »

Оффлайн Shturman

  • Разработчики
  • Опытный лис
  • *****
  • Сообщений: 416
  • Авторитет: 71
  • Пол: Мужской
    • Просмотр профиля
Re: Шаблонизатор (4.0)
« Ответ #5 : 28 февраля 2016, 13:18:23 »
Да нет, я намекал на то, что очень много str_replace, последовательного выполняется.
Я понял о чем ты говоришь, какие тут намеки :) Но только я считаю что это косвенно проблема шаблонизатора, он вернул что распарсил а дальше ты (разработчик модуля я имею ввиду, как основной логической единицы системы подвергающейся частой правки и модификации) уже отвечаешь за то, как ты его используешь.

Что касается режет глаза..
Какой толк от того, что у нас %метка% поменяется на {метка}. Я вижу от этого только минусы, придется возится с шаблонами еще при переносе, а также вызовет путаницу. В одной версии так, в другой по другому.
Я имел ввиду именно в контексте построения обхода массива. Хотя сейчас я глянул wiki старую, и там метки все описаны в одних процентах, видимо у меня в каком-то другом месте проскользнули метки в двойных процентах.

И тогда конструкции:
<b>Список пользователей</b>
{list_user} 
Имя: {name}
Возраст: {age}
{/list_user} 
и
<b>Список пользователей</b>
%list_user% 
Имя: %name%
Возраст: %age%
%/list_user% 
выглядят уже более похоже, хотя читабельность второй всё равно выше.
Но я согласен что тут лучше пойти по пути преемственности, и не менять синтаксис.

Как верстальщику мне удобно:
Вопрос не в том чтобы отказаться от старых методов и решений которые себя хорошо зарекомендовали, а вопрос в том чтобы добавить новых возможностей которые себя хорошо зарекомендовали в других решениях, при этом не нарушая концепции SantaFox.

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

Собственно целью этого поста и было, выявить кому реально что-то хотелось вставить в шаблонизатор чтобы сделать его лучше и удобнее, а не обсуждать "плохие" шаблоны.

Оффлайн Oslix

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 2 472
  • Авторитет: 346
  • Пол: Мужской
    • Просмотр профиля
Re: Шаблонизатор (4.0)
« Ответ #6 : 29 февраля 2016, 13:07:55 »
У меня к шаблонизатору вообще мало замечаний.
Имхо, все там более-менее нормально.