我一直在问这个问题。不能相信没有一个开发人员不会知道答案,而且我有点绝望
在Sonata中,我无法使url结构/ pattern / parent / ID / child / list工作。经历了相当贫穷的4.6。在奏鸣曲文档中创建儿童ADMINS部分,在网上找到了几个例子,我无法使其工作
有人可以一步一步解释如何设置这样的结构吗?
答案 0 :(得分:15)
我将在我的解释中使用Sonata提供的示例,这是一个基本的帖子/评论关系。
您的实体Post(父级)和Comment(子级)之间必须有父/子链接(oneTomany / manyToOne关系)。
您必须在服务声明中添加以子管理服务为目标的参数addChild:
sonata.news.admin.comment:
class: Sonata\NewsBundle\Admin\CommentAdmin
arguments: [~, Sonata\NewsBundle\Model\Comment, SonataNewsBundle:CommentAdmin]
tags:
- {name: sonata.admin, manager_type: orm, group: "Content"}
sonata.news.admin.post:
class: Sonata\NewsBundle\Admin\PostAdmin
arguments: [~, Sonata\NewsBundle\Model\Post, SonataNewsBundle:PostAdmin]
tags:
- {name: sonata.admin, manager_type: orm, group: "Content"}
calls:
- [addChild, ['@sonata.news.admin.comment']]
在CommentAdmin类中,您需要添加propertyAssociationMapping以按父级过滤此子项。
class CommentAdmin extends Admin
{
protected $parentAssociationMapping = 'post';
...
}
然后你将有一个新的路由:/ parent / ID / child / list,你可以使用控制台找出新路由的标识符(php app / console router:debug)。如果你想在管理员中轻松访问它,我建议在父管理员列表中添加一个按钮,直接访问其子注释:
创建一个模板,添加一个按钮以访问子项注释:
<a class="btn btn-sm btn-default" href="{{ path('OUR_NEW_CHILD_ROUTE_ID', {'id': object.id }) }}">Comments</a>
然后在父管理员中添加按钮操作,在这种情况下为PostAdmin:
class PostAdmin extends Admin
{
protected function configureListFields(ListMapper $listMapper)
{
$listMapper->add('_action', 'actions', array(
'actions' => array(
'show' => array(),
'edit' => array(),
'comments' => array('template' => 'PATH_TWIG')
)
))
}
}
希望您在如何设置父/子管理员方面学到更多知识。