奏鸣曲管理员 - 儿童管理班

age*_*tar 7 admin symfony symfony-sonata sonata-admin

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

我为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代码也没有帮助,因为代码很难遵循它的复杂性.

Bar*_*rry 5

刚刚通过无证功能相同的问题了,你出现在仅几步之遥已经错过了呼吁addChildconfigureSideMenu父OrderAdmin类.

此解决方案将在sidemenu中创建一个单独的页面,其中包含lineItems,它们不会嵌入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))));
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您为服务使用XML或YML,则可能不需要该__construct方法,因为addChild调用可以包含在服务定义中.

在撰写本文时,JMS DiExtra Bundle 存在一个未解决的问题,即对专用@Admin注释的拉取请求也可能避免此要求.虽然它已经安静了几个星期了.