有以下代码
$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?
答案 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