blixit/msf-bundle

Symfony 3 的多步表单

安装: 10

依赖: 0

建议者: 0

安全: 0

星标: 1

关注者: 2

分支: 0

开放问题: 0

类型:symfony-bundle

dev-master 2017-06-01 22:07 UTC

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 字符串,并反序列化它。我的第二个怀疑是关于数组的用法。

其他用法

  1. 你可以将你的实体之一附加到 MSFDataLoader。例如,创建一个用于管理用户注册的 MSF 表单。假设 msf 包含用户、联系人和角色表单。你可以在用户实体中添加一个 MSFDataLoader 字段。为了动态地将创建的用户附加到这个 msfdataloader,请转到 'user' 配置的验证方法(见方法 configure()),在用户对象上设置字段,然后持久化用户。