【问题标题】:How to get the defined field in sonataadmin query builder?如何在 Sonataadmin 查询生成器中获取定义的字段?
【发布时间】:2014-03-27 15:14:38
【问题描述】:

有如下代码

    $form->with('Item')->add('parent', null, array(
                                        'label' => 'Category',
                                        'required' => true,
                                        'query_builder' => 
                                        function($er) use ($id) {
                                            $qb = $er->createQueryBuilder('p');
                                                if ($id){
                                                    $qb->where('p.id <> :id')
                                                       ->setParameter('id', $id);
                                                }
                                            $qb->orderBy('p.root, p.lft', 'ASC');
                                            return $qb;
                                         }
                                       .........

Result 是赋予字符串的实体对象集合(__toString 方法)。 它返回名称字段。 但我需要获取另一个字段 - url。

如何在选择列表表单中获取 url 值而不是名称? query_builder 类型返回对象 => 如何改变这个表单,它同样工作于 query_builder?

【问题讨论】:

标签: symfony sonata-admin query-builder


【解决方案1】:

我没有使用 SonataAdminBundle 表单,但我认为它与 symfony 表单完全一样。您只需将'class' 和'property' 值添加到您的选项列表中:

$form->with('Item')->add('parent', null, array(
    'class' => 'Acme\DemoBundle\Entity\Category',
    'property' => 'url',
    'label' => 'Category',
    'required' => true,
    'query_builder' => 
    function($er) use ($id) {
        $qb = $er->createQueryBuilder('p');
            if ($id){
                $qb->where('p.id <> :id')
                   ->setParameter('id', $id);
            }
        $qb->orderBy('p.root, p.lft', 'ASC');
        return $qb;
     }

property - 是您的实体中的字段名称,它将代表您的实体的值,而不是调用__toString()。 而且...如果您需要始终将您的实体表示为 URL,您可以简单地将 Entity 类中的 __toString() 方法重写为类似的东西:

public function __toString() {
    return $this->url;
}

【讨论】:

    【解决方案2】:

    在我的例子中,query_builder 中使用的-&gt;orderBy() 有效,但后来由于未知原因被“某处”覆盖。有趣的事实:当我使用extended =&gt; true 时,所有内容都呈现为在query_builder 中排序。但是通过使用extended =&gt; false 我的&lt;option&gt;s 在select2 触及它之前被重新排序。

    作为一种解决方法,我这样做了:

    config/packages/twig.yaml

    twig:
        paths:
            '%kernel.project_dir%/templates': '%kernel.project_dir%/templates'
            # This is to prevent a infinite loop when extending the parent template
            'vendor/sonata-project/admin-bundle/src/Resources/views': SonataAdminBundleOriginal
    

    然后我在 twig 中再次为 project 实体进行了我想要的排序:

    templates/bundles/SonataAdminBundle/Form/form_admin_fields.html.twig:

    {% extends '@SonataAdminBundleOriginal/Form/form_admin_fields.html.twig' %}
    
    {%- block choice_widget_options -%}
        {% if name == 'project' %}
            {% set options = options|sort((a, b) => a.data.numberSortable <=> b.data.numberSortable)|reverse %}
        {% endif %}
    
        {{ parent() }}
    {%- endblock choice_widget_options -%}
    

    【讨论】:

      猜你喜欢
      • 2018-11-15
      • 1970-01-01
      • 2020-05-19
      • 1970-01-01
      • 2017-08-20
      • 1970-01-01
      • 1970-01-01
      • 2016-11-07
      • 1970-01-01
      相关资源
      最近更新 更多