SonataAdmin自定义表单动作

时间:2013-11-28 17:32:39

标签: symfony sonata-admin symfony-sonata

我正在使用SonataAdminBundle,我想知道如何在edit中添加自定义表单操作(类似于Save, Update and Close的内容)

似乎没有关于它的任何记录。

我正在尝试添加一个自定义输入字段,该字段将调用控制器或其他内容来更新值并发送电子邮件

是否有关于如何执行此操作的文档或示例?

由于

1 个答案:

答案 0 :(得分:5)

您可以通过添加新路由来添加自定义表单操作。因为当您添加新路线时,还需要添加操作来处理此路线。

创建路线

您可以通过在Admin类中定义新路由来注册新路由。只有管​​理员路线才能以这种方式注册。

您以此方式定义的路线是在管理员的上下文中生成的,添加()唯一必需的参数是操作名称。第二个参数可用于定义要附加到 baseRoutePattern 的URL格式,如果未明确设置,则默认为操作名称。

<?php
use Sonata\AdminBundle\Route\RouteCollection;

class MediaAdmin extends Admin
{
        protected function configureRoutes(RouteCollection $collection)
    {
        $collection->add('myCustomAction');
        $collection->add('view', $this->getRouterIdParameter().'/view');
    }
}

创建新操作所需的其他步骤

除了为新操作定义路径之外,还需要在Controller中为其创建处理程序。默认情况下,Admin类使用SonataAdminBundle:CRUD作为其控制器,但可以通过在定义Admin Service时更改第三个参数(在admin.yml文件中)来更改。

例如,让我们将MediaAdmin类的Controller更改为AcmeDemoBundle:MediaCRUD:

# src/Acme/DemoBundle/Resources/config/admin.yml
sonata.admin.media:
    class: Acme\DemoBundle\Admin\MediaAdmin
    tags:
        - { name: sonata.admin, manager_type: orm, label: "Media" }
    arguments:
        - ~
        - Acme\DemoBundle\Entity\Page
        - 'AcmeDemoBundle:MediaCRUD' # define the new controller via the third argument
    calls:
        - [ setTranslationDomain, [Acme\DemoBundle]]

我们现在需要创建我们的Controller,最简单的方法是扩展基本的Sonata CRUD控制器:     

use Sonata\AdminBundle\Controller\CRUDController;

class MediaCRUDController extends CRUDController
{
    public function myCustomAction()
    {
        // your code here ...
    }
}

在CRUD模板中,可以通过admin变量的 generateUrl()命令生成当前Admin类的路由:

<a href="{{ admin.generateUrl('list') }}">List</a>

<a href="{{ admin.generateUrl('list', params|merge('page': 1)) }}">List</a>

只需覆盖您需要的模板并添加此自定义操作。