blixit / msf-bundle
Symfony 3 的多步表单
dev-master
2017-06-01 22:07 UTC
Requires
- jms/serializer-bundle: ^2.0
- symfony/form: ^3.2
Requires (Dev)
- doctrine/annotations: ^1.4
- doctrine/doctrine-bundle: ^1.6
- doctrine/doctrine-cache-bundle: ^1.2
- doctrine/orm: ^2.5
- phpunit/phpunit: ~5.2
- sensio/distribution-bundle: ^5.0
- sensio/framework-extra-bundle: ^3.0.2
- sensio/generator-bundle: ^3.0
- symfony/monolog-bundle: ^3.0.2
- symfony/phpunit-bridge: ^3.0
- symfony/swiftmailer-bundle: ^2.3.10
- symfony/symfony: 3.2.*
This package is auto-updated.
Last update: 2024-09-11 00:15:31 UTC
README
用于管理 Symfony 3 中多步表单的包
在一个简单的项目中,我发现没有任何包提供多步表单功能。实际上,我找到了一个,https://github.com/craue/CraueFormFlowBundle 。但对我来说,这个包过于关注表单本身,这与我无关。例如,我不使用处理表单事件。然后,我有了创建一个包的想法,这个包可以让开发者分别与每个表单交互,然后使用一个配置良好的小系统来管理表单集,它们之间的转换、填充...
因此我创建了 MSFBundle。它很小,目前有 5 或 6 个类,作为一个服务运行。它的使用方式与表单本身非常相似,以减少学习时间。
只需要一个 MsfFormType 类 !!
额外功能:使用这个系统,管理 MSF 之间的转换也很容易。你只需要在每个步骤配置操作即可。
控制器示例
/** * @Route("/msfbundle", name="msfbundle") * @return \Symfony\Component\HttpFoundation\Response */ public function indexAction(Request $request){ //getting service and creating form $msf = $this->container->get('msf')->create(MSFTesterType::class,"blog"); //getting symfony form $form = $msf->getForm(); //request handling $form->handleRequest($request); if($form->isSubmitted() && $form->isValid() ) { //validation $msf->done() ; } return $this->render('BlixitMultiStepFormBundle:Default:default.html.twig',[ 'form' => $form->createView(), 'title' => $msf->getLabel(), 'buttons' => $msf->getButtons(), 'menu' => $msf->getMenu('msfbundle'), ]); }
MSFFormType 示例:带有转换回调的 MSFTesterType
<?php /** * Created by PhpStorm. * User: blixit * Date: 26/05/17 * Time: 14:56 */ namespace Blixit\MSFBundle\Form\TemplateTypes; use Blixit\MSFBundle\Core\MSFService; use Blixit\MSFBundle\Entity\Example\Article; use Blixit\MSFBundle\Entity\Example\Blog; use Blixit\MSFBundle\Form\Type\MSFAbstractType; class MSFTesterType extends MSFAbstractType { function __construct(MSFService $msf, $defaultState) { parent::__construct($msf, $defaultState); } public function configure() { return [ '__default_paths'=>true, '__default_formType_path'=>'\Blixit\MSFBundle\Form\ExampleTypes', '__root'=>'msfbundle', '__final_redirection'=>'msfbundle', '__on_cancel'=>['redirection'=>$this->getRouter()->generate('msfbundle')], '__on_terminate'=>['destroy_data'=>true], 'blog' => [ 'label'=> "Blog", 'entity' => Blog::class, 'after' => function($msfData){ return 'article'; }, 'validation' => function(){ return true; } ], 'article' => [ 'label'=> "Article", 'entity' => Article::class, 'before' => 'blog', 'after' => function($msfData){ return null; }, 'validation' => function(){ return true; } ] ]; } /** * Modify the form * @return $this */ public function buildMSF() { return $this->addSubmitButton([ 'label'=>'Valider', 'attr'=>[ 'class'=>"inline btn btn-primary" ] ])->addCancelButton([ 'label'=>'Annuler', 'attr'=>[ 'class'=>"inline btn btn-danger" ] ])->addNextButton([ 'label'=>'Suivant', 'attr'=>[ 'class'=>"inline btn btn-warning pull-right" ] ]) ->addPreviousButton([ 'label'=>'Précédent', 'attr'=>[ 'class'=>"inline btn btn-warning" ] ]) ; } }
依赖项
- Symfony 3
- JMS Serializer(需要安装 JMS)
- Doctrine Orm 实体管理器
- 路由器
- 请求栈
- 表单工厂
- 会话
根据 symfony 最佳实践,不建议使用第三方 php 库。然而,我假设使用 JMS/Serializer(见 https://symfony.com.cn/doc/current/bundles/best_practices.html#vendors )
特性
- 通过 3 个可配置的回调来管理表单之间的转换:before(前)、after(后)、cancel(取消)。
- [可选] 验证回调
- [可选] 按钮导航(提交、上一个、下一个、取消)
- 会话存储
- 代码类似于 Symfony 表单
性能
我尚未研究性能。我主要怀疑的是 Serializer 的使用。为了方便使用我的服务,我让开发者定义他们自己的验证方法。为此,他们需要访问整个 MSF 数据,这些数据存储为 JSON 字符串,并反序列化它。我的第二个怀疑是关于数组的用法。
其他用法
- 你可以将你的实体之一附加到 MSFDataLoader。例如,创建一个用于管理用户注册的 MSF 表单。假设 msf 包含用户、联系人和角色表单。你可以在用户实体中添加一个 MSFDataLoader 字段。为了动态地将创建的用户附加到这个 msfdataloader,请转到 'user' 配置的验证方法(见方法 configure()),在用户对象上设置字段,然后持久化用户。