SonataAdmin自定义表单动作

use*_*122 2 symfony symfony-sonata sonata-admin

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

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

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

有关于如何做到这一点的文档或示例吗?

谢谢

Tur*_*tan 6

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

创建路线

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

以这种方式定义的路由是在Admin的上下文中生成的,add()唯一需要的参数是操作名称.第二个参数可用于定义要附加到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');
    }
}
Run Code Online (Sandbox Code Playgroud)

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

除了为新操作定义路由之外,还需要在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]]
Run Code Online (Sandbox Code Playgroud)

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

use Sonata\AdminBundle\Controller\CRUDController;

class MediaCRUDController extends CRUDController
{
    public function myCustomAction()
    {
        // your code here ...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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