2012-01-12 185 views
7

我有一个Order实体,它可以有多个LineItem实体关联。Sonata管理员 - 子管理员类

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

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

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

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

是否存在需要配置的路由?我需要修改lineItems表单字段吗?

在Sonata Admin软件包上找到任何好的文档都很困难,所以我们将不胜感激。

PS。即使通过SonataAdminBundle代码也没有帮助,因为代码由于其复杂性而非常难以遵循。

回答

4

刚刚经历了与未记录功能相同的问题时,您似乎错过的唯一步骤是在父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呼叫可以在服务定义中去。

在写这篇文章时,有an open issue与JMS DiExtra Bundle一起提供专用的@Admin注释的pull请求,这也可能避免这种要求。尽管如此,它已经安静了几周。

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类来工作。

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