将自己的操作添加到SonataAdminBundle下拉菜单中

时间:2015-06-18 07:32:44

标签: symfony sonata

我们将SonataAdminBundle与Symfony2应用程序一起使用。在编辑实体时,我想在位于右上角的下拉菜单中添加自己的操作,但我不知道它是如何工作的。

我知道我可以通过configureRoutes(RouteCollection $collection)添加自己的路由以及如何在列表视图中添加批量操作或在实体后面添加自己的操作,但是如何在编辑视图的操作下拉列表中添加自己的链接?

它基本上只是一个像"在前端"中显示这个实体的链接,所以不需要大的逻辑。

3 个答案:

答案 0 :(得分:5)

一种方法是覆盖编辑时使用的模板。现在,您需要做的是:

  • 在名为app/Resources的{​​{1}}中创建新目录(如果您已经没有了)。在里面,创建另一个名为SonataAdminBundle的人。这将创建类似views的路径。这是Symfony基本模板覆盖。您可以阅读有关该主题here.

  • 的更多信息
  • 现在,您应该在原始包中复制原始模板,其路径与原始模板相同。我们感兴趣的模板文件位于app/Resources/SonataAdminBundle/views。这意味着您必须在sonata-project/admin-bundle/Resources/views/CRUD/base_edit.html.twig(我们刚刚在views中创建的文件夹中创建另一个文件夹,名为app。因此,现在我们必须遵循路径CRUD。内部的模板(app/Resources/SonataAdminBundle/views/CRUD),我们可以开始编辑。

请注意,您拥有的每个编辑操作都会使用以下模板。因此,您是否要在每个edit_action中显示该链接都取决于您。我将向您展示一种限制具体行动的方法。

您要编辑的块是base_edit.html.twig,它负责呈现下拉列表。这就是它现在的样子:

{% block actions %}

现在剩下要做的就是在最后{% block actions %} <li>{% include 'SonataAdminBundle:Button:show_button.html.twig' %}</li> <li>{% include 'SonataAdminBundle:Button:history_button.html.twig' %}</li> <li>{% include 'SonataAdminBundle:Button:acl_button.html.twig' %}</li> <li>{% include 'SonataAdminBundle:Button:list_button.html.twig' %}</li> <li>{% include 'SonataAdminBundle:Button:create_button.html.twig' %}</li> {% endblock %} 代码后插入您的链接。

<li>

{% if admin.id(object) is not null and app.request.get('_route') == 'my_route' %} <li> <a href="/generate/path/with/your/route">View in Frontend</a> </li> {% endif %} 将返回您编辑的项目的当前ID。 admin.id(object)将返回您的修改操作的路线。如果您希望链接显示在所有编辑操作中,则可以删除它。使用app.request.get('_route')使用您的路线名称更改<a href="/generate/path/with/your/route">View in Frontend</a>,您应该很高兴。

答案 1 :(得分:4)

在您的管理类中,覆盖以下方法:

public function getActionButtons($action, $object = null)
{
    $list = parent::getActionButtons($action, $object);

    $list['upload'] = [
        'template' => ':admin:my_upload_button.html.twig',
    ];

    return $list;
}

这将在此管理员的所有页面上添加自定义操作按钮。您可以在此处添加任何逻辑,以决定要显示按钮的页面($action - s)。

您可以在模板中执行您想要的操作,但只是为了完成我的示例并显示与自定义操作的连接:

<li>
    <a class="sonata-action-element" href="{{ admin.generateUrl('upload') }}">
        <i class="fa fa-cloud-upload" aria-hidden="true"></i>
        Upload stuff
    </a>
</li>

答案 2 :(得分:0)

另一种方法是覆盖对象管理类中的方法generateObjectUrl()

/**
 * @see \Sonata\AdminBundle\Admin\Admin::generateObjectUrl()
 */
public function generateObjectUrl($name, $object, array $parameters = array(), $absolute = false)
{
    if ('show' == $name) {
        return $this->getRouteGenerator()->generate('your_route_to_public_facing_view', [
            'id' => $this->getUrlsafeIdentifier($object),
        ], $absolute );
    }
    $parameters['id'] = $this->getUrlsafeIdentifier($object);
    return $this->generateUrl($name, $parameters, $absolute);
}

就是这样。没有与模板混淆。并且没有将在其他所有管理员上运行的模板代码。

要让链接自动显示,您必须通过$showMapperconfigureShowFields()添加内容。 (如果有人知道更好的方法,请告诉。)

覆盖generateObjectUrl()还有另一个好处:如果您在show上显示$listMapper按钮,那么其中的网址也会更新。

编辑说:由于这会覆盖show路线,因此您将无法再使用该内置功能。这对我来说没关系,因为我需要在加载所有前端css和js的情况下查看我的对象。