7

我有一个 Order 实体,它可以关联多个 LineItem 实体。

我为 Order 创建了一个 Admin 类,为 LineItem 创建了一个 Admin 类。但我需要 LineItem Admin 类成为 Order Admin 类的子级。

在 LineItemAdmin 类中,我设置了protected $parentAssociationMapping = 'order';.

另外,在 OrderAdmin 类的 configureFormFields 方法中,我添加了->add('lineItems', 'sonata_type_model').

但是,它仍然不起作用。订单表单中的订单项列表不可点击,因此我看不到如何从订单管理表单中获取订单管理列表页面。

是否有需要配置的路由?lineItems我需要对表单字段进行更改吗?

很难在 Sonata Admin 包上找到任何好的文档,因此我们将不胜感激。

PS。即使浏览 SonataAdminBundle 代码也无济于事,因为代码很复杂,很难理解。

4

2 回答 2

5

刚刚经历了未记录功能的相同问题,您似乎错过的唯一步骤是调用父 OrderAdmin 类addChildconfigureSideMenu

该解决方案将在包含 lineItems 的 sidemenu 之外创建一个单独的页面,它们不会嵌入 OrderAdmin 表单中(我不确定这是否可能)。

无需配置任何路由,因为 SonataAdmin 会为您处理。

这是一个使用注释的示例父管理类:

namespace YourVendor\YourBundle\Admin;

use JMS\DiExtraBundle\Annotation\Service;
use JMS\DiExtraBundle\Annotation\Tag;
use JMS\DiExtraBundle\Annotation\Inject;
use JMS\DiExtraBundle\Annotation\InjectParams;

use Knp\Menu\ItemInterface as MenuItemInterface;

use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Admin\AdminInterface;

/**
 * @Service("sonata.admin.order")
 * @Tag("sonata.admin", attributes={"manager_type"="orm", "group"="Orders", "label"="Orders"})
 */
class OrderAdmin extends Admin
{
    /**
     * @InjectParams({
     *     "code" = @Inject("%your.parameters.code%"),
     *     "class" = @Inject("%your.parameters.class%"),
     *     "baseControllerName" = @Inject("%your.parameters.controller%"),
     *     "lineItems" = @Inject("sonata.admin.line_item")
     * })
     */
    public function __construct($code, $class, $baseControllerName, $lineItems)
    {
        parent::__construct($code, $class, $baseControllerName);

        $this->addChild($lineItems);
    }

    protected function configureSideMenu(MenuItemInterface $menu, $action, AdminInterface $childAdmin = null)
    {
        if (!$childAdmin && !in_array($action, array('edit', 'show'))) { return; }

        $admin = $this->isChild() ? $this->getParent() : $this;
        $id = $admin->getRequest()->get('id');

        $menu->addChild('Show Order', array('uri' => $admin->generateUrl('show', array('id' => $id))));
        $menu->addChild('Edit Order', array('uri' => $admin->generateUrl('edit', array('id' => $id))));
        $menu->addChild('Line items', array('uri' => $admin->generateUrl('sonata.admin.line_item.list', array('id' => $id))));
    }
}

如果您将 XML 或 YML 用于您的服务,您可能不需要该__construct方法,因为addChild调用可以进入服务定义中。

在撰写本文时,JMS DiExtra Bundle 存在一个未解决的问题,其中包含对专用 @Admin 注释的拉取请求,这也可以避免此要求。不过已经安静了几个星期了。

于 2012-11-28T09:44:10.760 回答
1

您可以执行以下操作:

// Order Entity
/**
 * @ORM\OneToMany(targetEntity="OrderItem", mappedBy="invoice", cascade={"persist", "remove"}, orphanRemoval=true)
 * 
 */
protected $items;
...



// OrderAdmin.php
protected function configureFormFields(FormMapper $formMapper)
{
        $formMapper
        ->with('Order Items')
            ->add('items', 'sonata_type_collection', array('required' => true,
                                                           'by_reference' => false,
                                                           ),
                                                     array('edit' => 'inline',
                                                           'inline' => 'table',))
 ....

确保您还有一个 OrderItem 管理员。这是必要的,因为 sonata_type_collection 需要一个 Admin 类才能工作。

该解决方案适用于我的包含许多发票项目的发票捆绑包。

于 2013-08-02T21:04:14.593 回答