在Sonata管理员列表视图中显示不同的实体

时间:2016-12-01 03:43:50

标签: php entity-framework symfony doctrine-orm sonata-admin

我有这个实体,其中包含entityName属性和entityId属性:

    /**
     * @var string
     *
     * @ORM\Column(name="entityName", type="string", length=255)
     */
    private $entityName;

    /**
     * @var integer
     * @ORM\Column(name="entityId", type="integer")
     */
    private $entityId;

我没有使用__toString()函数显示此实体,而是希望实际返回名称和id的实体。并在奏鸣曲管理列表视图中显示。

目前,这里是__toString

public function __toString()
{
    return $this->entityName . ":" . $this->entityId;
}

应该返回类似的内容:

public function __toString()
{
    return $em->getRepository($this->entityName)->find($this->entityId);
}

我希望我能很好地描述我的问题。 TNX

1 个答案:

答案 0 :(得分:0)

一种解决方法是为奏鸣曲使用自定义列表块。

  1. create a new twig filter名为entityFilter,此过滤器会将奏鸣曲管理对象的FQCN转换为奏鸣曲生成的可读路由名称。比如admin_blablabla_show

    public function entityFilter($entityName)
    {
        $str = str_replace('\\', '_', $entityName);
        $str = str_replace('Bundle', '', $str);
        $str = str_replace('_Entity', '', $str);
        $str = 'Admin' . $str . '_Show';
        return strtolower($str);
    }
    
    public function getName()
    {
        return 'my_extension';
    }
    
  2. 在您的管理类中
  3. ,将所需字段的模板设置为新的树枝模板:

        ->add('orderItems', null, array(
            'template' => 'AcmeBundle::order_items_list.html.twig'
        ))
    
  4. 在新的twig模板中(order_items_list.html.twig):

    {% extends 'SonataAdminBundle:CRUD:base_list_field.html.twig' %}
    {% block field %}
    <div>
        {% for item in object.orderItems %}
            {% if entity(item.entityName) == 'admin_first_entity_show' %}
                {% set foo = 'Apple ID' %}
            {% elseif entity(item.entityName) == 'admin_second_entity_show' %}
                {% set foo = 'Device Accessory' %}
            {% else %}
                {% set foo = 'Not defiend' %}
            {% endif %}
    
            <a target="_blank" class="btn btn-default btn-xs" href="{{ path(entity(item.entityName), {'id': item.entityId}) }}"><i class="fa fa-external-link"></i> {{ foo }}</a>
        {% endfor %}
    </div>
    {% endblock %}