Вы не вошли.
Страницы 1
Последнее время возникла масса споров относительно использования нового шаблонизатора 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, причём только в нужных файлах-шаблонах.
Доступные элементы:
* Глобальные переменные:
> lang - глобальный массив с языковыми переменными
> skins_url - URL к каталогу engine/skins/
> admin_url - URL к каталогу engine/
* Функции:
> pluginIsActive(NAME) - возвращает true если данный плагин сейчас активен
Пример: {% if pluginIsActive('xfields') %}Доп. поля включены!{% endif %}
Ваши вопросы/предложения жду в этой теме...
Вне форума
Когда будет переход? или это будет не скоро? или это где то есть, и это можно пощупать?
Отредактировано Knopik (2011-02-13 15:07:44)
Вне форума
Если честно то я не вижу смысл в шаблонизаторах, особенно после работы со Smarty. Но не сколько не против их, если будет возможность и дальше "жить" без них.
Отредактировано easmik (2011-02-13 14:53:39)
Все сайты, что могут быть сделаны на ng cms, должны быть сделаны на ng cms.
Расширив границы сознания, мы открываем новые горизонты жизни.
Вне форума
Нужно больше примеров, т.е. скажем 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, что все просто и понятно.
Все сайты, что могут быть сделаны на ng cms, должны быть сделаны на ng cms.
Расширив границы сознания, мы открываем новые горизонты жизни.
Вне форума
Обновления SVN:
+ Теперь TWIG доступен везде
+ Добавлена функция pluginIsActive
+ Добавлена глобальная переменная handler, ссылка на переменную PHP $CurrentHandler
Теперь функционала достаточно для реализации всех существующих шаблонов на TWIG'е.
Вне форума
Достаточно существующего функционана? Продолжаем использовать то что есть.
Хочется что-то новое? Переходим на TWIG, причём только в нужных файлах-шаблонах
Вне форума
Ваши вопросы/предложения жду в этой теме...
как прописать условие для конкретной страницы? или хотя бы для конкрутного плагина?
к примеру если я хочу вывести на странице с плагином доп. инфу в шапке, сайдбаре или футере - т.е. за пределами mainblock
в смарти есть такая возможность - надеюсь что должна быть и в твиге
и еще - почему не работает {% debug %}? было бы удобно отлавливать... в вер. 0.93/880 точно не работает
Проекты любой сложности. Качественно. Дорого.
Вне форума
Вне форума
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 15:48:39)
xmpp://ngcms@conf.ngcms.ru
Настройка клиента для подключения к конференции
Вне форума
это в индекс.пхп движка?
получается что оба шаблонизатора одновременно использовать нельзя?
а как же тогда эту фразу понимать?:
Достаточно существующего функционана? Продолжаем использовать то что есть.
Хочется что-то новое? Переходим на TWIG, причём только в нужных файлах-шаблонах.
Проекты любой сложности. Качественно. Дорого.
Вне форума
Это строчка для разработчиков, выбор шаблонизатора лежит на них
Дизайнер использует тот вариант, что предложен разработчиком. Одновременно использовать два нельзя, да и смысла обрабатывать один шаблон два раза подряд разными шаблонизаторами нет.
Вне форума
блин, не айс... получается что шаблоны могут быть несовместимыми в пределах одной версии - предвижу появление вопросов в стиле "я вот скачал шаблон для 0.93, а он не работает"
Проекты любой сложности. Качественно. Дорого.
Вне форума
получается что шаблоны могут быть несовместимыми"
Не получится. Но всё идет к тому что к концу останется только один шаблонизатор.
xmpp://ngcms@conf.ngcms.ru
Настройка клиента для подключения к конференции
Вне форума
Могут быть несовместимыми, да. Если все шаблоны были под старый шаблонизатор, потом автор плагина перевел их на новый, в результате чего какие-то файлы объединились в один, какие-то конструкции новые добавились. И те файлы шаблонов для плагина, которые идут шаблоном уже работать не будут без ручного вмешательства, пусть и не сильно напряжного.
Вне форума
Всем привет!
Подскажите, можно ли передавать анонимные функции в методы Twig?
К примеру, если был написан Extension, в котором определен метод, который принимает анонимную функцию, то есть ли возможность передать туда ее?
Хотелось бы иметь возможность писать что-то вроде лямбда-выражений, как в c#.
Вне форума
Страницы 1
[ Сгенерировано за 0.026 сек, 7 запросов выполнено - Использовано памяти: 662.31 Кбайт (Пик: 715.31 Кбайт) ]