如何在Sonata configureListFields中检索主题?

时间:2016-12-06 09:39:55

标签: symfony sonata-admin

我在Symfony项目中使用Sonata Admin Bundle,并为我的Article实体创建了一个ArticleAdmin类。 在列表页面中,我添加了一些自定义操作来快速发布,取消发布,删除和删除预览每篇文章。

我想要做的是在文章发布时隐藏发布按钮&反之亦然。

为此,我需要访问方法configureListFields()中的每个对象。我会做这样的事情:     

protected function configureListFields(ListMapper $listMapper)
{
    $listMapper->add('title');
    // ...

    /** @var Article article */
    $article = $this->getSubject();

    // Actions for all items.
    $actions = array(
        'delete'  => array(),
        'preview' => array(
            'template' => 'AppBundle:ArticleAdmin:list__action_preview.html.twig',
        ),
    );

    // Manage actions depending on article's status.
    if ($article->isPublished()) {
        $actions['draft']['template'] = 'AppBundle:ArticleAdmin:list__action_draft.html.twig';
    } else {
        $actions['publish']['template'] = 'AppBundle:ArticleAdmin:list__action_preview.html.twig';
    }

    $listMapper->add('_actions', null, array('actions' => $actions));
}

但是$this->getSubjet()总是返回NULL。我也试过了$listMapper->getAdmin()->getSubject()和其他许多吸气剂,但结果总是一样。

我做错了什么?

感谢阅读&祝你有个美好的一天:)

1 个答案:

答案 0 :(得分:2)

您可以直接在_action模板中进行检查,因为您可以访问当前主题。

protected function configureListFields(ListMapper $listMapper)
{
    $listMapper
        ->add('title')
        ->add('_action', 'actions', array(
            'actions' => array(
            'delete'  => array(),
            'preview' => array(
                'template' => 'AppBundle:ArticleAdmin:list__action_preview.html.twig',
            ),
            'draft'  => array(
                'template' => 'AppBundle:ArticleAdmin:list__action_draft.html.twig',
            ),
            'publish'  => array(
                'template' => 'AppBundle:ArticleAdmin:list__action_publish.html.twig',
            ),
        ))
    ;
}

例如在AppBundle:ArticleAdmin:list__action_draft.html.twig中,您可以检查您的情况:

{% if object.isPublished %}
    your html code
{% endif %}