Вы не зашли.
Последнее время возникла масса споров относительно использования нового шаблонизатора TWIG.
Постараюсь в этой теме собрать исчерпывающее объяснение причин и научить любого желающего пользоваться TWIG'ом.
Итак, первый вопрос - ЗАЧЕМ?
У существующего шаблонизатора есть несколько серьёзных проблем, а именно:
* работа с шаблонами как с обычным текстом (невозможно отделить переменные от элементов дизайна) - а это значит, что при каждой генерации страницы шаблонизатору приходится выполнять 200-600 символьных замен текста и около 100-200 замен текста при использовании регулярных выражений. итого - низкая производительность
* работа в интерпретирующем режиме - обработка любого шаблона каждый раз требует достаточно много времени
* каскадная обработка переменных - из-за использования функций символьной замены в шаблонизаторе возможны обработки переменных внутри переменных. например, попробуйте в текст новости добавить {mainblock} и можете увидеть (а можете и не получить) сюрприз (зависит от массы факторов)
* отсутствие условных блоков, они заменяются регулярными выражениями (работают медленно, на очень длинных массивах данных возможно катастрофическое падение производительности), возможность отработки только тех условий, которые жестко внесены в код ядра/плагина
* отсутствие циклов, для повторяющихся (даже крайне примитивных) действий требуется создавать новый шаблон
Преимущества TWIG'а:
* компилирующий режим - первая генерация шаблона (после изменения текста шаблона) занимает относительно много времени, но все последующие генерации работают в сотни раз быстрее существующего шаблонизатора
* модульный режим - медленный модуль компиляции (выполняемый редко) и очень быстрый модуль отображения (выполняется при каждом отображении шаблона)
* чёткое разделение текста и переменных в шаблоне - а это значит, что у нас не будет проблем с множественной обработкой шаблона
* наличие условных блоков и возможность создавать сложные условия. главное, чтобы нужные флаги были выставлены в коде ядра/плагине
* наличие циклов - простые повторяющиеся действия можно сделать внутри шаблона
А всёже?
Действительно, полный функционал TWIG'а подавляет - это свой собственный мир, свой язык.
Но... возьмём, к примеру, есть среди нас хоть кто-то, кто использовал более 60% возможностей современного телевизора? Сильно сомневаюсь.
И при этом телевизором пользуются многие... думаю, аналогия ясна.
Практика - отличия для дизайнера
1) Формат переменных.
Старая запись: {variableName}
Новая запись: {{ variableName }}
2) Условные блоки.
Старая запись: [if-logged] тут_текст [/if-logged]
Новая запись: {% if (user.flags.logged) %} тут_текст {% endif %}
3) Простые циклы.
Старая запись:
* основной шаблон: {entries}
* дополнительный шаблон: имя: {name}, записей: {count} <br/>
Новая запись:
{% for entry in entries %}
имя {{ entry.name }}, записей: {{ entry.count }} <br/>
{% endfor %}
4) Отображение блока в случае, если активен конкретный плагин (например, xfields):
Старая запись: [isplugin xfields]...[/isplugin]
Новая запись: {% if pluginIsActive('xfields') %}...{% endif %}
Практика - новые возможности для дизайнера
Благодаря наличию глобальных переменных, появляется возможность использовать некоторую информацию абсолютно во всех шаблонах.
Давайте придумывать примеры:
1. Выводим логин пользователя или слово "гость", если пользователь не залогинен:
Привет, {% if (user.flags.logged) %}<b>{{user.name}}</b>{% else %}гость{% endif %}!
2. Персональный блок для пользователя с логином "vasya":
{% if (user.flags.logged and (user.name == 'vasya')) %} да здравствует Вася!{% endif %}
А теперь - самое важное
Чуть-чуть модифицированный TWIG (а у нас используется именно такой вариант) позволяет полностью сохранить существующие шаблоны сайта!
Достаточно существующего функционана? Продолжаем использовать то что есть.
Хочется что-то новое? Переходим на TWIG, причём только в нужных файлах-шаблонах.
[hr]
Доступные элементы:
* Глобальные переменные:
> lang - глобальный массив с языковыми переменными
> skins_url - URL к каталогу engine/skins/
> admin_url - URL к каталогу engine/
* Функции:
> pluginIsActive(NAME) - возвращает true если данный плагин сейчас активен
Пример: {% if pluginIsActive('xfields') %}Доп. поля включены!{% endif %}
Ваши вопросы/предложения жду в этой теме...
Не в сети
Когда будет переход? или это будет не скоро? или это где то есть, и это можно пощупать?
Изменено Knopik (2011-02-13 16:07:44)
Не в сети
Если честно то я не вижу смысл в шаблонизаторах, особенно после работы со Smarty. Но не сколько не против их, если будет возможность и дальше "жить" без них.
Изменено easmik (2011-02-13 15:53:39)
Не в сети
Нужно больше примеров, т.е. скажем default шаблон, который по-максимуму использует TWIG.
Не в сети
vitaly, новый раздел форума по twig'y? С вопросами и ответами?
А так, в принципе все понятно. Хотя, главное, не злоупотреблять возможностями шаблонизатора, что бы по пол дня не искать решения возникших проблем. Ведь программисты (как и дизайнеры) частенько забывают о людях. Время покажет, как это будет выглядеть в жизни.
Не в сети
Если честно то я не вижу смысл в шаблонизаторах, особенно после работы со Smarty. Но не сколько не против их, если будет возможность и дальше "жить" без них.
У нас и так сейчас smarty-подобный шаблонизатор
Нужно больше примеров, т.е. скажем default шаблон, который по-максимуму использует TWIG.
В SVN есть default шаблон админки. На сайте пока нельзя его использовать. Примеры тут http://twig.kron0s.com/a/02-twig-for-template-designers
Не в сети
Почему нельзя) Что мешает самому давить две строчки в core.php чтобы посмотреть работу и не ждать))
xmpp://ngcms@conf.ngcms.ru
Настройка клиента для подключения к конференции
Не в сети
Не в сети
У нас и так сейчас smarty-подобный шаблонизатор
По крайней мере у меня не каких ошибок с NG не возникало. А со Smarty через раз вылезала ошибка и таким же образом исчезала.
Я и выбрал поэтому NG, что все просто и понятно.
Не в сети
Обновления SVN:
+ Теперь TWIG доступен везде
+ Добавлена функция pluginIsActive
+ Добавлена глобальная переменная handler, ссылка на переменную PHP $CurrentHandler
Теперь функционала достаточно для реализации всех существующих шаблонов на TWIG'е.
Не в сети
Достаточно существующего функционана? Продолжаем использовать то что есть.
Хочется что-то новое? Переходим на TWIG, причём только в нужных файлах-шаблонах
Не в сети
Ваши вопросы/предложения жду в этой теме...
как прописать условие для конкретной страницы? или хотя бы для конкрутного плагина?
к примеру если я хочу вывести на странице с плагином доп. инфу в шапке, сайдбаре или футере - т.е. за пределами mainblock
в смарти есть такая возможность - надеюсь что должна быть и в твиге
и еще - почему не работает {% debug %}? было бы удобно отлавливать... в вер. 0.93/880 точно не работает
Проекты любой сложности. Качественно. Дорого.
Не в сети
t3s, переменная handler, которая полностью идентична массиву $CurrentHandler. Одним из элементов которого является pluginName.
Не в сети
Wolverine, нифига не понял если честно... гугл говорит что-то про getRequestUri - но ведь это для фреймворка Symfony?
блин, возможно из-за того что у меня в шаблоне вообще не работает твиг - если прописать
{% if pluginIsActive('xfields') %}...{% endif %}
то это же и выводится, хотя долно быть лишь многоточие... как его включить?
Проекты любой сложности. Качественно. Дорого.
Не в сети
vitaly пишет:Ваши вопросы/предложения жду в этой теме...
как прописать условие для конкретной страницы? или хотя бы для конкрутного плагина?
к примеру если я хочу вывести на странице с плагином доп. инфу в шапке, сайдбаре или футере - т.е. за пределами mainblock
$SUPRESS_TEMPLATE_SHOW - флаг, при установке двиг не показывает шаблон, но показывает значение переменной $template[‘vars’][‘mainblock’] (основной блок данных). Требует объявления как глобальный: Требует объявления как глобальный: global $SUPRESS_TEMPLATE_SHOW;
$SUPRESS_MAINBLOCK_SHOW - флаг, при котором двиг не показывает основной блок данных. Установка обоих переменных используется в плагинах, которые полностью генерируют содержимое страницы. К примеру, плагин rss_show. Требует объявления как глобальный: global $SUPRESS_MAINBLOCK_SHOW;
то это же и выводится, хотя долно быть лишь многоточие... как его включить?
Использовать можно только в шаблоне к которому подключен твиг...
xmpp://ngcms@conf.ngcms.ru
Настройка клиента для подключения к конференции
Не в сети
ммм... а как подключить твиг к шаблону? в "новом" default не обнаружил - плохо искал или он тоже "нетвиганутый"?
Проекты любой сложности. Качественно. Дорого.
Не в сети
// 2. Load & show template
$tpl -> template($mainTemplateName, $mainTemplatePath);
$tpl -> vars($mainTemplateName, $template);
if (!$SUPRESS_TEMPLATE_SHOW) {
printHTTPheaders();
echo $tpl -> show($mainTemplateName);
} else if (!$SUPRESS_MAINBLOCK_SHOW) {
printHTTPheaders();
echo $template['vars']['mainblock'];
}
Поменять на:
$xt = $twig->loadTemplate($mainTemplatePath.$mainTemplateName.'.tpl');
if (!$SUPRESS_TEMPLATE_SHOW) {
printHTTPheaders();
echo $xt->render($tVars);;
} else if (!$SUPRESS_MAINBLOCK_SHOW) {
printHTTPheaders();
echo $template['vars']['mainblock'];
}
Но тут тогда придется везде {} менять на {{}} и $template['vars'] менять на $tVars
-----
Или воспользоваться $twigLoader->setConversion чтобы не не изменять {{}}
Изменено ROZARD (2012-01-19 16:48:39)
xmpp://ngcms@conf.ngcms.ru
Настройка клиента для подключения к конференции
Не в сети
это в индекс.пхп движка?
получается что оба шаблонизатора одновременно использовать нельзя?
а как же тогда эту фразу понимать?:
Достаточно существующего функционана? Продолжаем использовать то что есть.
Хочется что-то новое? Переходим на TWIG, причём только в нужных файлах-шаблонах.
Проекты любой сложности. Качественно. Дорого.
Не в сети
Это строчка для разработчиков, выбор шаблонизатора лежит на них Дизайнер использует тот вариант, что предложен разработчиком. Одновременно использовать два нельзя, да и смысла обрабатывать один шаблон два раза подряд разными шаблонизаторами нет.
Не в сети
блин, не айс... получается что шаблоны могут быть несовместимыми в пределах одной версии - предвижу появление вопросов в стиле "я вот скачал шаблон для 0.93, а он не работает"
Проекты любой сложности. Качественно. Дорого.
Не в сети
получается что шаблоны могут быть несовместимыми"
Не получится. Но всё идет к тому что к концу останется только один шаблонизатор.
xmpp://ngcms@conf.ngcms.ru
Настройка клиента для подключения к конференции
Не в сети
Могут быть несовместимыми, да. Если все шаблоны были под старый шаблонизатор, потом автор плагина перевел их на новый, в результате чего какие-то файлы объединились в один, какие-то конструкции новые добавились. И те файлы шаблонов для плагина, которые идут шаблоном уже работать не будут без ручного вмешательства, пусть и не сильно напряжного.
Не в сети
Всем привет!
Подскажите, можно ли передавать анонимные функции в методы Twig?
К примеру, если был написан Extension, в котором определен метод, который принимает анонимную функцию, то есть ли возможность передать туда ее?
Хотелось бы иметь возможность писать что-то вроде лямбда-выражений, как в c#.
Не в сети