2013-03-27 5 views
3

Использование Symfony2 с Sonata, в списке шаблоны полей могут быть перезаписаны и назначить переменные шаблонам, например setTemplateVar(), иногда могут быть полезны! (не говоря о форме, где «attr» служит этой цели, но список ...)В symfony2 с sonata: Как передать переменную в шаблон, определенный для заданного поля listmapper в методе configureListFields?

Я хотел бы знать, что было бы лучшим подходом, чтобы передать переменную шаблону, определенному для заданного поля listmapper в метод configureListFields?

<?php 

    namespace Acme\AcmeBundle\Admin; 

    use Sonata\AdminBundle\Admin\Admin; 
    use Sonata\AdminBundle\Datagrid\ListMapper; 
    use Sonata\AdminBundle\Datagrid\DatagridMapper; 
    use Sonata\AdminBundle\Validator\ErrorElement; 
    use Sonata\AdminBundle\Form\FormMapper; 

    class AcmeAdmin extends Admin 
    { 

     protected function configureListFields(ListMapper $listMapper) 
     { 
      $listMapper 
       ->addIdentifier('acme_field') 
       ->add('date', 'date', array(
        'template' => "AcmeBundle:CRUD:list_date.html.twig", 
      //  'dateFormat' => "Y-m-d",// ---> how to pass this var to twig ? 
       )) 
       ->add('_action', 'actions', array(
        'actions' => array(
         'edit' => array(), 
         'delete' => array(), 
        ), 
       )) 
      ; 
     } 

Решение конкретной задачи перевода и форматирование даты уже реализована с помощью шаблона веточку следующим образом:

{% block field%} 
     {% if value is empty %} 
      &nbsp; 
     {% else %} 

      {# retrieving the dateFormat variable from the listmapper #} 
      {% if dateFormat is defined %} 
       {{ value|date(dateFormat)|title }} 
      {% else %} 
       {{ value|date('m/Y') }} 
      {% endif %} 

      {# passing the locale in some way here would be great, it is not available in twig.. #} 
      {# scratch that, it is not necessary with intl.extension... #} 
      {% if locale is defined %} 
       {% set dflt_locale = locale %} 
      {% else %} 
       {% set dflt_locale = 'fr_FR.UTF-8' %} 
      {% endif %} 

      {{ value|localizeddate('medium', 'none', dflt_locale)|title }} 

     {% endif %} 
    {% endblock %} 

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

Вопрос о локализации прекрасно на самом деле, как я понял, что не нужно быть переданы localizeddate ... его уже доступен через внутреннее расширение.

Следующий ответ сообщения приводит меня к такому выводу, поскольку я не мог определить локаль, но не добавляя параметр, который был разрешен! Localize dates in twigs using Symfony 2 отсюда:

{{ value|localizeddate('medium', 'none')|title }} 

Приветствия заранее для любого ответа, связанного с параметром DateFormat!

Vinz

ответ

14

Try в Twig

field_description.options.YOURFIELDNAME 

определено здесь

->add('date', 'date', array(
        'template' => "AcmeBundle:CRUD:list_date.html.twig", 
        'YOURFIELDNAME' => 'Blablo' 
       )) 

Приветствия

+0

Высокий, отлично работает, THx Axel – MediaVince

0

В конце концов, самое простое решение было определить вар в классе администратора следующим образом:

 <?php 

     namespace Acme\AcmeBundle\Admin; 

     use Sonata\AdminBundle\Admin\Admin; 
     use Sonata\AdminBundle\Datagrid\ListMapper; 
     use Sonata\AdminBundle\Datagrid\DatagridMapper; 
     use Sonata\AdminBundle\Validator\ErrorElement; 
     use Sonata\AdminBundle\Form\FormMapper; 

     class AcmeAdmin extends Admin 
     { 
      // two options to define var and make them available to twig by admin. mechanism 
      public $dateFormat = "Y-m-d";// ---> this var is available in twig : admin.dateFormat 
      // or to allow better relation to context 
      public $parameters = array();// ---> this array is available in twig : admin.parameters.x.y.z 

      protected function configureListFields(ListMapper $listMapper) 
      { 
       // assuming the $dateFormat is not set, by convention it could be defined here with proper intent in mind 
       // it could then be contained in an array like that 

       $this->parameters = array('listmapper' => array('dateFormat' => 'Y-m-d',),); 

       // then specialized in twig : admin.parameters.listmapper.dateFormat 

       $listMapper 
        ->addIdentifier('acme_field') 
        ->add('date', 'date', array(
         'template' => "AcmeBundle:CRUD:list_date.html.twig",// checking admin.parameters.listmapper.dateFormat 
        )) 
        ->add('_action', 'actions', array(
         'actions' => array(
          'edit' => array(), 
          'delete' => array(), 
         ), 
        )) 
       ; 
      } 

Тогда в веточке:

  {% block field%} 
      {% if value is empty %} 
       &nbsp; 
      {% else %} 

       {# retrieving the dateFormat variable from the listmapper by convention... 
        twig is very forgiving in eval, so checking for defined var is peachy 
        e.g if admin.parameters is not defined or empty then else is triggered 
       #} 
       {% if admin.parameters.listmapper.dateFormat is defined %} 

        {{ value|date(admin.parameters.listmapper.dateFormat)|title }} 

       {% else %} 

        {{ value|localizeddate('medium', 'none')|title }} 

       {% endif %} 

      {% endif %} 
      {% endblock %} 

Благодаря Sonata Admin: Add custom triggers/actions to list/edit action Я понял/вспомнил/связал точки ..., что у twig есть доступ к переменной администратора, поэтому, определив переменную в классе, мы можем получить ее в веточке.

Теперь речь идет только о конвенции, чтобы создать какое-то ограничение для контейнера для переменных администратора. (массив параметров cf)

Для этого конкретного случая это решение не добавляет никакой точки, поскольку localizeddate хорошо служит моей цели, однако, ради аргумента хорошо знать IMHO.

Cheers, Надеюсь, что это поможет!

Vinz

 Смежные вопросы

  • Нет связанных вопросов^_^