Symfony 索纳塔管理-儿童管理类
我有一个订单实体,可以关联多个LineItem实体 我为Order和LineItem分别创建了一个Admin类和一个Admin类。但是我需要LineItem Admin类是Order Admin类的子类 在LineItemAdmin类中,我设置了Symfony 索纳塔管理-儿童管理类,symfony,admin,symfony-sonata,sonata-admin,Symfony,Admin,Symfony Sonata,Sonata Admin,我有一个订单实体,可以关联多个LineItem实体 我为Order和LineItem分别创建了一个Admin类和一个Admin类。但是我需要LineItem Admin类是Order Admin类的子类 在LineItemAdmin类中,我设置了protected$parentAssociationMapping='order' 另外,在OrderAdmin类configureFormFields方法中,我添加了->add('lineItems','sonata\u type\u model')
protected$parentAssociationMapping='order'代码>
另外,在OrderAdmin类configureFormFields方法中,我添加了->add('lineItems','sonata\u type\u model')
然而,它仍然不起作用。订单表单中的行项目列表不可单击,因此我看不到如何从订单管理表单获取行项目管理列表页面
是否有需要配置的路由?是否需要对lineItems
表单字段进行更改
很难找到任何关于Sonata管理包的好文档,因此如果有任何帮助,我们将不胜感激
注:即使阅读SonataAdminBundle代码也无济于事,因为代码非常复杂,很难理解。刚刚在未记录的功能中遇到同样的问题,您似乎错过的唯一步骤是调用父OrderAdmin类上的addChild
和configureSideMenu
此解决方案将在侧菜单上创建一个单独的页面,其中包含行项,它们不会嵌入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用于服务,则可能不需要\u构造
方法,因为addChild
调用可以进入服务定义
在编写本文时,JMS DiExtra捆绑包中有一个对专用@Admin注释的pull请求,这也可以避免此要求。不过,这里已经安静了几周。您可以访问以下内容:
// 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_集合需要一个管理类才能工作
该解决方案适用于包含许多发票项目的发票包