Sonata/symfony - 父/子结构设置

bel*_*nea 5 admin parent-child symfony

我一直在问这个问题.无法相信没有一个开发人员不会知道答案,我有点绝望

在Sonata中,我无法使url结构/ pattern/parent/ID/child/list工作.经历了相当贫穷的4.6.在奏鸣曲文档中创建儿童ADMINS部分,在网上找到了几个例子,我无法使其工作

有人可以一步一步解释如何设置这样的结构?

Hyp*_*peR 15

我将在我的解释中使用Sonata提供的示例,一个基本的帖子/评论关系.

您的实体Post(父级)和Comment(子级)之间必须有父/子链接(oneTomany/manyToOne关系).

您必须在服务声明中添加以子管理服务为目标的参数addChild:

services.yml

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']]
Run Code Online (Sandbox Code Playgroud)

在CommentAdmin类中,您需要添加propertyAssociationMapping以按父级筛选此子级.

CommentAdmin

class CommentAdmin extends Admin
{
    protected $parentAssociationMapping = 'post';
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后你将有一个新的路由可用:/ parent/ID/child/list,你可以使用控制台找出新路由的标识符(php app/console router:debug).如果您想在管理员中轻松访问此功能,我建议在父管理员列表中添加一个按钮,以直接访问其子注释:

创建一个模板,添加一个按钮来访问子注释:

post_comments.html.twig

<a class="btn btn-sm btn-default" href="{{ path('OUR_NEW_CHILD_ROUTE_ID', {'id': object.id }) }}">Comments</a>
Run Code Online (Sandbox Code Playgroud)

然后在这种情况下在父管理员中添加按钮操作PostAdmin:

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')
            )
        ))
    }
}
Run Code Online (Sandbox Code Playgroud)

希望您能学到更多关于如何设置父/子管理员的知识.