如何在sonataadmin查询生成器中获取已定义的字段?

时间:2014-02-25 11:57:55

标签: symfony sonata-admin query-builder

有以下代码

    $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值而不是select-list表单中的名称? query_builder类型返回object =&gt;如何更改此表单,它的工作原理类似于query_builder?

2 个答案:

答案 0 :(得分:2)

我没有使用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;
     }

属性 - 是您实体中代表您的实体值而不是调用__toString()的字段的名称。 但是......如果您需要始终将您的实体表示为URL,您可以简单地将实体类中的__toString()方法覆盖为:

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

答案 1 :(得分:0)

在我的情况下,UIPickerViewDelegate中使用的->orderBy()可以正常工作,但是后来由于未知原因“在某处”被覆盖。有趣的事实:当我使用query_builder时,所有内容都呈现为extended => true中排序的样子。但是通过使用query_builder,我的extended => false<option>被触摸之前被重新排序。

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

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 实体进行了想要的排序:

project

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