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



有以下代码

    $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"。如果您有空值,请不要忘记设置条件,以免给您带来错误!

问候。

相关内容

  • 没有找到相关文章

最新更新