Yii2 и Twig, дополнительный синтаксис
28 апреля 2013
Итак, код Yii2 уже близок, чтобы показать его всем. Пока Qiang доделывает последний тикет, а именно ActiveForm, я решил плотнее поработать с шаблонными движками. Уже сейчас реализована самая базовая поддержка Smarty и Twig, но кучу всего, что доступно в PHP-шаблонах, через них делать пока нельзя.
Порыв немного Twig, я понял, что реализовать это можно кучей разных способов, но так как сам с Twig не работаю, мне трудно решить, как же будет удобней.
Например, создание ссылки. В Yii2 оно делается примерно так:
echo Html::a('Posts, page 2', array('post/index', 'page' => 2));
Если утащить в Twig как есть в виде функции, получается:
{{ a('Posts, page 2', {0: 'post/index', 'page': 2}) | raw }}
По-моему, несколько криво. Если пользуетесь Twig, как бы вам было удобней?
Вот ещё некоторые штуки о которых хотелось бы мнений по синтаксису:
// В Twig вроде было что-то своё на эту тему echo Html::encode('content with <html>'); // не привязанная к модели форма echo Html::beginForm(array('post/edit', 'id' => 10), 'post', array('enctype' => 'multipart/form-data')); echo Html::dropDownList('mySelect', 1, array(0 => 'A', 1 => 'B'), array('class' => 'mySelectCSSClass')); echo Html::activeLabel($postModel, 'title', array('class' => 'postTitleLabel')); echo Html::endForm(); // URL echo Html::url(array('post/index', 'page' => 2)); // свойство приложения echo \Yii::$app->language; // title станицы echo $this->title; // отрендерить ещё какой-то view внутри текущего echo $this->render('viewName', array('x' => 'y')); // использовать виджет echo $this->widget('yii\widgets\Something', array('x' => 'y', 'z' => 42)); // ActiveForm $form = $this->beginWidget('yii\widgets\ActiveForm'); echo $form->field($model, 'username')->textInput(); echo $form->field($model, 'password')->checkboxAlt(); $this->endWidget(); // подключение asset-ов $this->registerAssetBundle('jquery');
Комментарии RSS по email OK
Зачем "перетаскивать" полностью функцию Html::a ? Нельзя ли в шаблонах делать более наглядно, как это делают ребята из Symfony.
где "path" и будет аналогом createUrl в Yii.
seydamet, можно, конечно. Если так всем удобно, так и сделаем.
действительно. решение seydamet, которые используется в симфони. выглядит удобней и не надо raw
или так. если оставлять Html::a
seydamet, а что насчёт остального?
Вместо encode есть escape, который по идее применяется по-умолчанию, где нет raw.
допустим для Yii::t мы сделали хелпер и использовали примерно так
для Yii::app тоже.
главное не забывать raw, где он необходим. потому что по умолчанию ескейпит ))
Прошу прощения за оффтоп. Не могли бы вы транскрибировать имя Qiang Xue. Всё-таки пользуемся плодами его труда, а не знаем (я не знаю), как правильно произносится имя. Спасибо.
Для Yii::t можно наверно сделать как в Symfony, или с помощью блоков-функций {% trans %}Archive{% endtrans %}, или, что по-моему лучше с помощью фильтра {% 'Archive'|trans %}
это все помоему можно вынести в глобальную область видимости, т.е. title выводить как {{ title }}, а render вызывать как {% render('viewName', {x:y}) %}.
Aibolit, Чиан (Тян) Ше (Шве).
Википедия говорит, Цянь Сюэ
:)
Вариант с тегом
короче и нагляднее
использую github.com/yiiext/twig-renderer
привык к
если надо выводить виджет $captureOutput=true
если не надо ничего выводить
Не надо отдавать на откуп хелперам рендер самого html. Пускай только ссылки генерируюстя. Это доказали хелперы из первой симфы url_for и link_to -- они были неудобны.
вполне достаточно
Мне тоже такой вариант больше нравиться, иногда нужно сгенерить урл, но без самой ссылки.
Можно так и оставить:
Может стоит это обсуждение перевести в форум?
Я не работал с Yii, но очень плотно работаю с Symfony и Twig, сразу что просилось в глаза - если какаято функция генерит html - можно сказать не ескейпить twig.sensiolabs.org/doc/advanced.html#automatic-escaping
по поводу пути говорят правильно просто функция которая генерирует url или path, тегом это лучше не делать - будут проблемы чтобы передать это значение кудато например как параметр в функцию и т.п.
тоесть делаете global в твиге и все
немного к другой структуре форм привык, но как вариант (лучше наверно всетаки переменную использовать но путь будет так):
должно быть так:
Полностью поддерживаю последний комментарий white-shadow.
В Symfony2 очень классно реализована работа с шаблонизатором Twig, в частности с формами. И потому было бы просто идеально видеть в Yii2 рендерере Twig'а такой же подход к работе с шаблонами.
То что есть сейчас в виде расширения twig для Yii1 в итоге не удобно использовать в жизни, т.к. там перенесли подход работы с нативным php шаблонизатором yii на twig, тем самым не раскрывая все возможности последнего.
Заметил класс TwigViewRenderer, это все что надо? Или сам twig еще надо качать и как то подключать к yii? Метода уже где то описана?
Пётр, надо поставить Composer и сделать в корневой директории фреймворка
composer install
из консоли. Возможно придётся также доставитьgit
иsvn
. Могу архивом выложить и дать инструкцию, если это проблемно. Ближе к релизу это требоваться не будет. Можно будет просто распаковать zip-архив.Нет пока не надо, несколько непонятные шаги пока для меня это, не такая нужная вещь пока этот шаблонизатор, а в том формате синтаксиса, даже спрашивается в чем же профит его...
Sam, скажите, как в итоге реализовали это:
А вернее, имею в конфиг:
Как зарегистрировать этот asset в шаблоне? Если так:
получаю ошибку: Unknown tag name "assets" in "main.twig" at line 23
Разобрался:
Подскажите, как вот такую штуку в Twig сделать?
И еще, что в итоге решили делать для работы с переводами в шаблонах Twig? yii message/extract строки умеет из шаблонов Twig выдирать?
message/extract
должен справиться, но его надо настроить. По переводам ничего особо не решали. Если есть идеи, предлагайте на GitHub.По штуке... не уверен :)
Example Twig for braeadcrumbs
{{ set(this, 'title', 'About') }}
{{ set(this, 'params', { 'breadcrumbs' : { '' : this.title } }) }}
Имя в транскрипции на русский Чанг Хуй
Не совсем. Фамилия произносится примерно как "Сюэ".