有以下代码
$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;
}
.........
结果是提供给字符串(__toString方法)的实体对象集合。它返回名称字段。但是我需要获取另一个字段 - url。
如何获取 url 值而不是选择列表表单中的名称?query_builder类型返回对象=>如何更改它同样query_builder工作的形式?
使用SonataAdminBundle表单,但我认为它的工作方式绝对像symfony表单。您在这里需要的只是将'class'
和'property'
值添加到选项列表中:
$form->with('Item')->add('parent', null, array(
'class' => 'AcmeDemoBundleEntityCategory',
'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;
}
就我而言,->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
:
{% 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 -%}
以防万一如果有人需要像我需要的那样通过 FK(外键)"过滤"实体(并搜索了 3 天),以下是解决方案:
在__construct中,您可以设置/查找所需的内容。就我而言,我在这个"会议"(年)工作。所以我发现会话>状态=true:
$this->sessionActive = $this->sessionRepository->findOneBy(['status'=>true]);
然后在查询构建器中:
protected function configureQuery(ProxyQueryInterface $query): ProxyQueryInterface
{
$rootAlias = current($query->getRootAliases());
$query
->select($rootAlias)
->where($rootAlias.'.session = :id')
->addOrderBy($rootAlias.'.dateStart', 'ASC')
->setParameter('id', $this->sessionActive->getId());
return $query;
}
注意:我始终将一个会话>状态设置为"true"。如果您有空值,请不要忘记设置条件,以免给您带来错误!
问候。