如何在奏鸣曲管理包中使用 CRUD 控制器创建自定义表单?

How to create a custom form using CRUD controller in sonata admin bundle?

我是 sonata admin 的初学者,我需要知道如何使用路由和控制器创建自定义表单以及 index.html.twig。

   app.admin.category:
        class: AppBundle\Admin\CategoryAdmin
        arguments: [~, AppBundle\Entity\Category, SonataAdminBundle:CRUD]
        tags:
            - { name: sonata.admin, manager_type: orm, group: adminn, label: Category }
        public: true

您需要创建 CRUD 控制器。对于每个管理服务,您都有一个默认服务,您可以覆盖它。 在您的情况下,服务是 app.admin.category

如何创建增删改查控制器?我将以最简单的方式进行说明。

  1. 在您的 AppBundle/Controller/Admin/ 文件夹中创建 class 并将其命名为 CategoryAdminController。 这是您的代码 class:

    <?php
    
    namespace AppBundle\Controller\Admin;
    
    use Sonata\AdminBundle\Controller\CRUDController;
    
    /**
     * Class CategoryAdminController
     * @package AppBundle\Controller\Admin\
     */
    class CategoryAdminController extends CRUDController
    {
    }
    

    如您所见,class 扩展了默认的 SonataAdminCRUDController。

  2. 然后指向你的 sonata 服务,它必须使用这个 class 因为它是 CRUDContoller。 在您的 service.yml 中更改标准 CRUD 控制器:

    app.admin.category: class: AppBundle\Admin\CategoryAdmin 参数:[~, AppBundle\Entity\Category, AppBundle:Admin\CategoryAdmin] 标签: - {名称:sonata.admin,manager_type:orm,组:adminn,标签:类别} public: 真

  3. 现在您已准备好在新控制器中执行新操作。我们称它为 changeAction。

     /**
      * @param int $id
      *
      * @return Response
      */
     public function changeAction($id = null)
     {
         try {
            if ($id !== null) {
                $category = $this->admin->getObject($id);
            }
        } catch (NotFoundHttpException $e) {
            error_log($e->getMessage());
        }
    
        // .. Here is a code of creating your custom form with variable $form
    
    
        return $this->render('@App/Admin/CRUD/index.html.twig', [
            'custom_form' => $form->createView(),
        ]);
     }
    
  4. 为您的新活动制定路线!在您的 CategoryAdmin 服务中覆盖 configureRoutes() 方法

    /**
     * @param RouteCollection $collection
     */
    protected function configureRoutes(RouteCollection $collection)
    {
        $collection->add('change', $this->getRouterIdParameter().'/change');
    }
    
  5. 最后 - 我们可以将按钮添加到我们的路线:

    /**
     * @param ListMapper $listMapper
     */
    protected function configureListFields(ListMapper $listMapper)
    {
        $listMapper
            //.. Your fields...
            ->add('_action', 'actions', [
                'label' => ' ',
                'actions' => [
                    //'show' => array(),    // I removed show action button, but you can uncomment
                    //'edit' => array(),    // I removed edit action button, but you can uncomment
                    //'delete' => array(),  // I removed delete action button, but you can uncomment
                'change' => [
                        'template' => 'AppBundle::Admin\CRUD\Buttons\change_category_button.html.twig',
                    ]
                ]
            ])
        ;
    }
    

当然不要忘记为您的新按钮创建一个树枝模板并将其放置在正确的位置AppBundle/Resources/views/Admin/CRUD/Buttons/:

//'AppBundle::Admin\CRUD\Buttons\change_category_button.html.twig':

{% if admin.isGranted('EDIT', object) and admin.hasRoute('change') %}
    <a href="{{ admin.generateObjectUrl('change', object) }}" class="btn btn-sm btn-primary edit_link" title="Your title here"  style="display: inline-block">
        <i class="fa fa-toggle-on"> </i>
        Change Button
    </a>
{% endif %}

staskrak 解决方案对我来说不再适用于最新的 symfony/sonata。所以我采用了 https://sonata-project.org/bundles/admin/3-x/doc/cookbook/recipe_custom_view.html

的解决方案

只需添加文件 admin/my_form.html.twig 喜欢

{# templates/admin/my_form.html.twig #}

{% extends '@SonataAdmin/standard_layout.html.twig' %}

{% block sonata_admin_content %}
    {{ form(form) }}
{% endblock %}

并在 SomeAdminController 中使用它

public function batchActionMyAction(ProxyQueryInterface $selectedModelQuery, Request $request = null)
{
    $this->admin->checkAccess('edit');
    $this->admin->checkAccess('delete');

    $form = $this->createFormBuilder([])
        ->add('smsText', TextType::class)
        ->add('save', SubmitType::class, ['label' => 'Create Task'])
        ->getForm();

    return $this->render('Admin/my_form.html.twig', [
        'form' => $form->createView(),
    ]);
}