3

Sonata で Symfony2 を使用すると、リスト内でフィールド テンプレートを上書きでき、変数をテンプレートに割り当てることができます。つまり、setTemplateVar() が役立つ場合があります。(「attr」がこの目的を果たすフォームについては話していませんが、リスト...)

メソッド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(),
                    ),
                ))
            ;
        }

日付の変換と書式設定に関する特定の問題の解決策は、次のように twig テンプレートで既に実装されています。

    {% 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 %}

ただし、私の目標は、リストマッパーから変数を取得できるようにすることです。
提案された例では、dateFormat は渡すのに適したものです...

localizeddate に渡す必要がないことに気付いたので、ロケールに関する問題は実際には問題ありません... intl 拡張機能を介して既に利用可能です。

次の投稿の回答は、ロケールを定義できなかったため、その結論に至りましたが、パラメーターを追加しないことで解決されました! したがって、Symfony 2 を使用して小枝の日付をローカライズします。

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

dateFormat パラメーターに関連するすべての応答を事前に乾杯!

ヴィンツ

4

2 に答える 2

16

小枝で試してみてください

field_description.options.YOURFIELDNAME

ここで定義

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

乾杯

于 2013-09-26T14:00:08.480 に答える
0

最終的に、最も簡単な解決策は、次のように Admin クラスで var を定義することでした。

        <?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に感謝: リスト/編集アクションにカスタム トリガー/アクションを追加する気づいた/覚えていた/点を結び付けた... twig は admin 変数にアクセスできるため、クラスで変数を定義することで、twig でそれを取得できます。

さて、管理変数のコンテナに一種の制約を設定するのは慣例の問題です。(パラメーター配列を参照)

この特定のケースでは、ローカライズされた日付が私の目的に十分に役立つため、このソリューションは何のポイントも追加しませんが、議論のために私見を知っておくとよいでしょう。

乾杯、それが役立つことを願っています!

ヴィンツ

于 2013-03-28T11:10:59.483 に答える