[英]How to create a custom form using CRUD controller in sonata admin bundle?
我是奏鸣曲管理的初学者,我需要知道如何使用路由和控制器以及 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
如何创建 CRUD 控制器? 我会用最简单的方式来解释。
在您的AppBundle/Controller/Admin/
文件夹中创建类并将其命名为 CategoryAdminController。 这是您班级的代码:
<?php namespace AppBundle\\Controller\\Admin; use Sonata\\AdminBundle\\Controller\\CRUDController; /** * Class CategoryAdminController * @package AppBundle\\Controller\\Admin\\ */ class CategoryAdminController extends CRUDController { }
如您所见,此类扩展了默认的 SonataAdminCRUDController。
然后指向你的奏鸣曲服务,它必须使用这个类,因为它是 CRUDContoller。 在您的 service.yml 中更改标准 CRUD 控制器:
app.admin.category: 类: AppBundle\\Admin\\CategoryAdmin 参数: [~, AppBundle\\Entity\\Category, AppBundle:Admin\\CategoryAdmin] 标签: - { name: soata.admin, manager_type: orm, group: adminn, label:类别 } 公开:真实
现在您已准备好在新控制器中进行新操作。 我们称之为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(), ]); }
为您的新行动开辟路线! 在您的CategoryAdmin
服务中覆盖configureRoutes()
方法
/** * @param RouteCollection $collection */ protected function configureRoutes(RouteCollection $collection) { $collection->add('change', $this->getRouterIdParameter().'/change'); }
最后 - 我们可以将按钮设置为我们的路线:
/** * @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 %}
对于最新的 symfony/sonata,staskrak 解决方案不再适用于我。 所以我采用了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(),
]);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.