<rmcreative>

RSS

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

  1. №7839
    seydamet
    seydamet 28 апр. 2013 г., 19:17:58

    Зачем "перетаскивать" полностью функцию Html::a ? Нельзя ли в шаблонах делать более наглядно, как это делают ребята из Symfony.

    <a href="{{path('post/index', {'page': 2}) }}">Posts, page 2</a>

    где "path" и будет аналогом createUrl в Yii.

  2. №7840
    Sam
    Sam 28 апр. 2013 г., 19:32:25

    seydamet, можно, конечно. Если так всем удобно, так и сделаем.

  3. №7841
    janki
    janki 28 апр. 2013 г., 19:33:29

    действительно. решение seydamet, которые используется в симфони. выглядит удобней и не надо raw

    или так. если оставлять Html::a

    {{ a('Posts, page 2', 'post/index', {'page': 2}) | raw }}
  4. №7842
    Sam
    Sam 28 апр. 2013 г., 19:33:38

    seydamet, а что насчёт остального?

  5. №7843
    nucleartux
    nucleartux 28 апр. 2013 г., 19:46:10

    Вместо encode есть escape, который по идее применяется по-умолчанию, где нет raw.

  6. №7844
    janki
    janki 28 апр. 2013 г., 19:47:24

    допустим для Yii::t мы сделали хелпер и использовали примерно так

    {{ t('news', 'Archive') }}

    для Yii::app тоже.

    {{ app.dateFormatter.format("d MMMM yyyy", article.publish_begin) }}
  7. №7845
    janki
    janki 28 апр. 2013 г., 19:49:25

    главное не забывать raw, где он необходим. потому что по умолчанию ескейпит ))

  8. №7846
    Aibolit
    Aibolit 28 апр. 2013 г., 19:50:38

    Прошу прощения за оффтоп. Не могли бы вы транскрибировать имя Qiang Xue. Всё-таки пользуемся плодами его труда, а не знаем (я не знаю), как правильно произносится имя. Спасибо.

  9. №7847
    nucleartux
    nucleartux 28 апр. 2013 г., 19:52:08

    Для Yii::t можно наверно сделать как в Symfony, или с помощью блоков-функций {% trans %}Archive{% endtrans %}, или, что по-моему лучше с помощью фильтра {% 'Archive'|trans %}

  10. №7848
    nucleartux
    nucleartux 28 апр. 2013 г., 19:57:51
    echo $this->title;
     
    // отрендерить ещё какой-то view внутри текущего
    echo $this->render('viewName', array('x' => 'y'));
     
    // использовать виджет
    echo $this->widget('yii\widgets\Something', array('x' => 'y', 'z' => 42));

    это все помоему можно вынести в глобальную область видимости, т.е. title выводить как {{ title }}, а render вызывать как {% render('viewName', {x:y}) %}.

  11. №7849
    Sam
    Sam 28 апр. 2013 г., 20:05:55
  12. №7850
    Александр
    Александр 28 апр. 2013 г., 21:22:45

    Википедия говорит, Цянь Сюэ

  13. №7851
    itspoma
    itspoma 28 апр. 2013 г., 21:25:44
    {{ a('href', 'title', {'target': '_blank'}) | raw }}
     
    {{ 'content with <html>'|escape }}
     
    Html::url =>
    {{ path('href', {params}) }}

    :)

  14. №7852
    neex2hex
    neex2hex 28 апр. 2013 г., 22:37:54

    Вариант с тегом

    {% a 'Posts, page 2', {'target': '_blank'} %}

    короче и нагляднее

  15. №7853
    Stan
    Stan 28 апр. 2013 г., 22:49:38

    использую github.com/yiiext/twig-renderer

    привык к

    {{ App.language }}
    {{ html.link('Link', this.createUrl('controller/action'), {param: val}) }}

    если надо выводить виджет $captureOutput=true

    {{ this.widget('WidgetClass', {}, true) }}

    если не надо ничего выводить

    {% do App.clientScript.registerScriptFile() %}
    {% do this.beginWidget() %}
  16. №7854
    cystbear
    cystbear 29 апр. 2013 г., 0:28:34
    {{path('route_name',  {'param1': param1_value, 'param1': param2_value }) }}
  17. №7855
    cystbear
    cystbear 29 апр. 2013 г., 0:31:52

    Не надо отдавать на откуп хелперам рендер самого html. Пускай только ссылки генерируюстя. Это доказали хелперы из первой симфы url_for и link_to -- они были неудобны.

    {{path('route_name', {'param1': param1_value, 'param1': param2_value }) }}

    вполне достаточно

  18. №7856
    Rea
    Rea 29 апр. 2013 г., 11:19:49
    <a href="{{path('post/index', {'page': 2}) }}">Posts, page 2</a>

    Мне тоже такой вариант больше нравиться, иногда нужно сгенерить урл, но без самой ссылки.

  19. №7857
    Rea
    Rea 29 апр. 2013 г., 11:29:31
    echo Html::beginForm(array('post/edit', 'id' => 10), 'post', array('enctype' => 'multipart/form-data'));
     
    echo \Yii::$app->language;
     
    echo $this->widget('yii\widgets\Something', array('x' => 'y', 'z' => 42));

    Можно так и оставить:

    {{html.beginForm(...) }}
    {{ App.language }}
    {{ this.widget('WidgetClass', {}, true) }}
  20. №7860
    ostin
    ostin 29 апр. 2013 г., 20:36:09

    Может стоит это обсуждение перевести в форум?

  21. №7875
    white-shadow
    white-shadow 02 мая 2013 г., 15:08:36

    Я не работал с Yii, но очень плотно работаю с Symfony и Twig, сразу что просилось в глаза - если какаято функция генерит html - можно сказать не ескейпить twig.sensiolabs.org/doc/advanced.html#automatic-escaping

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

    echo Html::encode('content with <html>');
    'content with <html>'|e
     
    echo \Yii::$app->language;
    app.language

    тоесть делаете global в твиге и все

    echo $this->render('viewName', array('x' => 'y'));
    {% render('viewName', {x: 'y'}) %}
     
     
     
    $form = $this->beginWidget('yii\widgets\ActiveForm');
    echo $form->field($model, 'username')->textInput();

    немного к другой структуре форм привык, но как вариант (лучше наверно всетаки переменную использовать но путь будет так):

    {%- form model -%}
      {{ field('username', 'text', {opt1: 123  }) }} {# тут можно или функциями или тегами поля задавать #}
    {%- endform -%}
     
    app.dateFormatter.format("d MMMM yyyy", article.publish_begin)

    должно быть так:

    article.publish_begin|date('d m y') - это встроенное форматирование дат
  22. №7911
    Igo
    Igo 06 мая 2013 г., 11:28:16

    Полностью поддерживаю последний комментарий white-shadow.

    В Symfony2 очень классно реализована работа с шаблонизатором Twig, в частности с формами. И потому было бы просто идеально видеть в Yii2 рендерере Twig'а такой же подход к работе с шаблонами.

    То что есть сейчас в виде расширения twig для Yii1 в итоге не удобно использовать в жизни, т.к. там перенесли подход работы с нативным php шаблонизатором yii на twig, тем самым не раскрывая все возможности последнего.

  23. №7938
    Пётр
    Пётр 11 мая 2013 г., 10:28:13

    Заметил класс TwigViewRenderer, это все что надо? Или сам twig еще надо качать и как то подключать к yii? Метода уже где то описана?

  24. №7944
    Sam
    Sam 11 мая 2013 г., 14:44:58

    Пётр, надо поставить Composer и сделать в корневой директории фреймворка composer install из консоли. Возможно придётся также доставить git и svn. Могу архивом выложить и дать инструкцию, если это проблемно. Ближе к релизу это требоваться не будет. Можно будет просто распаковать zip-архив.

  25. №7954
    Пётр
    Пётр 13 мая 2013 г., 8:08:38

    Нет пока не надо, несколько непонятные шаги пока для меня это, не такая нужная вещь пока этот шаблонизатор, а в том формате синтаксиса, даже спрашивается в чем же профит его...

  26. №8796
    Александр
    Александр 04 февр. 2014 г., 0:03:23

    Sam, скажите, как в итоге реализовали это:

    // подключение asset-ов $this->registerAssetBundle('jquery');

    А вернее, имею в конфиг:

    'view' => [
        'renderers' => [
            'twig' => [
                'globals' => [
                    'assets' => 'backend\assets\AppAsset',
                ]
           ]
        ]
    ]

    Как зарегистрировать этот asset в шаблоне? Если так:

    {% assets.register(this) %}

    получаю ошибку: Unknown tag name "assets" in "main.twig" at line 23

  27. №8797
    Александр
    Александр 04 февр. 2014 г., 19:28:56

    Разобрался:

    {{ void( assets.register(this) ) }}
  28. №9221
    Андрей
    Андрей 30 сент. 2014 г., 1:39:53

    Подскажите, как вот такую штуку в Twig сделать?

    $this->params['breadcrumbs'][] = $this->title;
  29. №9222
    Андрей
    Андрей 30 сент. 2014 г., 1:42:51

    И еще, что в итоге решили делать для работы с переводами в шаблонах Twig? yii message/extract строки умеет из шаблонов Twig выдирать?

  30. №9225
    Sam
    Sam 30 сент. 2014 г., 12:28:37

    message/extract должен справиться, но его надо настроить. По переводам ничего особо не решали. Если есть идеи, предлагайте на GitHub.

    По штуке... не уверен :)

  31. №9526
    Marcio Camello
    Marcio Camello 28 дек. 2014 г., 22:21:01

    Example Twig for braeadcrumbs

    {{ set(this, 'title', 'About') }}

    {{ set(this, 'params', { 'breadcrumbs' : { '' : this.title } }) }}

  32. №9832
    Marco Polo
    Marco Polo 04 июня 2015 г., 15:55:31

    Имя в транскрипции на русский Чанг Хуй

  33. №9835
    Sam
    Sam 05 июня 2015 г., 21:35:27

    Не совсем. Фамилия произносится примерно как "Сюэ".

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.