ORO平台-如何将相关实体的集合传递给datagrid列模板?

问题描述

我在ORO平台中有一个具有相关实体的实体。内置User实体可以具有许多内置Access Roles。我想使用自定义树枝模板在“用户”数据网格中显示这些角色,以便将它们包装在某些标签或样式中。

这是我的datagrids.yaml部分,它将覆盖用户datagrid:

    users-grid:
        source:
            query:
                select:
                    - What to pass here?
                join:
                    left:
                        - { join: u.roles,alias: r }
                groupBy: u.id
        columns:
            roles:
                inline_editing:
                    enable: false
                label: 'Roles'
                type: twig
                frontend_type: html
                template: 'MyBundle:User:Property/roles.html.twig'

要访问roles.html.twig中的角色集合对象,我该怎么办?

解决方法

仅使用YAML配置是不可能的。相反,您必须创建一个数据网格侦听器,该侦听器将使用“之后结果”事件中的数据填充角色列。 这是一个示例:

  • AcmeDemoBundle / EventListener / UserRolesGridListener.php
<?php

namespace AcmeDemoBundle\EventListener;

use Oro\Bundle\DataGridBundle\Datasource\ResultRecord;
use Oro\Bundle\DataGridBundle\Event\OrmResultAfter;
use Oro\Bundle\EntityBundle\ORM\DoctrineHelper;
use Oro\Bundle\UserBundle\Entity\User;

class UserRolesGridListener
{
    /** @var DoctrineHelper */
    protected $doctrineHelper;

    /**
     * @param DoctrineHelper $doctrineHelper
     */
    public function __construct(DoctrineHelper $doctrineHelper)
    {
        $this->doctrineHelper = $doctrineHelper;
    }

    /**
     * @param OrmResultAfter $event
     */
    public function onResultAfter(OrmResultAfter $event)
    {
        $userIds = [];
        /** @var ResultRecord[] $records */
        $records = $event->getRecords();
        foreach ($records as $record) {
            $userIds[] = $record->getValue('id');
        }

        $repository = $this->doctrineHelper->getEntityRepository(User::class);
        $userRoles = $repository->createQueryBuilder('user')
            ->select('partial user.{id},partial roles.{id,label}')
            ->indexBy('user','user.id')
            ->leftJoin('user.roles','roles')
            ->where('user.id in (:userIds)')
            ->setParameter('userIds',$userIds)
            ->getQuery()
            ->getArrayResult();
        foreach ($records as $record) {
            $id = $record->getValue('id');
            $record->addData(['roles' => $userRoles[$id]['roles']]);
        }
    }
}
  • AcmeDemoBundle / Resources / config / services.yml
services:
    AcmeDemoBundle\EventListener\UserRolesGridListener:
        arguments:
            - '@oro_entity.doctrine_helper'
        tags:
            - { name: kernel.event_listener,event: oro_datagrid.orm_datasource.result.after.users-grid,method: onResultAfter }
  • AcmeDemoBundle / Resources / config / oro / datagrids.yml
datagrids:
    users-grid:
        columns:
            roles:
                inline_editing:
                    enable: false
                label: 'Roles'
                type: twig
                frontend_type: html
                template: 'AcmeDemoBundle:User:Column/roles.html.twig'
  • AcmeDemoBundle / Resources / views / User / Column / roles.html.twig
{% for role in record.getValue('roles') %}
  <div class="role-{{ role.id }}">{{ role.label }}</div>
{% endfor %}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...