刚刚经历了未记录功能的相同问题,您似乎错过的唯一步骤是调用父 OrderAdmin 类addChild
。configureSideMenu
该解决方案将在包含 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 注释的拉取请求,这也可以避免此要求。不过已经安静了几个星期了。