infinityloop-dev/multistep-form

为 Nette 框架提供的组件,帮助创建多步表单。

v1.0.1 2020-02-02 21:02 UTC

This package is auto-updated.

Last update: 2024-08-29 04:48:38 UTC


README

🔧 为 Nette 框架提供的组件,帮助创建多步表单。

简介

此组件提供了一种简单的方式来创建多步表单。处理步骤之间的切换,将前一步的值传递到当前步骤,并将所有组合值传递到最后一步的成功回调。还处理常见的边缘情况,例如区分一个客户端访问的同一表单的多个实例。

安装

使用 composer 安装包

composer require infinityloop-dev/multistep-form

依赖

如何使用

  • 在配置文件中将 \Infinityloop\MultistepForm\IMultiStepFormFactory 注册为服务。
  • 将其注入到您希望使用多步表单的组件/展示器中,
    • 编写 createComponent 方法,并在模板文件中使用 {control} 宏
  • 自动添加前进和后退的提交按钮。

示例 createComponent 方法

protected function createComponentMultistepForm() : \Infinityloop\MultistepForm\MultistepForm
{
    $multistepForm = $this->multistepFormFactory->create()
        ->setDefaults(['action' => \App\Enum\EAction::ACTION2])
        ->setSuccessCallback(function(array $values) {
            $this->model->save($values);
        });

    // first step
    $multistepForm->addFactory(function() : \Nette\Forms\Form {
        $form = new \Nette\Application\UI\Form();
        $form->addProtection();
        $form->setTranslator($this->translator);

        $form->addSelect('action', 'Akce', \App\Enum\EAction::ENUM)
            ->setRequired();

        return $form;
    }, __DIR__ . '/step1.latte');

    // second step
    $multistepForm->addFactory(function(array $previousValues) : \Nette\Forms\Form {
        $form = new \Nette\Application\UI\Form();
        $form->addProtection();
        $form->setTranslator($this->translator);

        if (\in_array($previousValues['action'], [\App\Enum\EAction::ACTION1, \App\Enum\EAction::ACTION2], true)) {
            $form->addText('action_1or2', 'Action 1 or 2')
                ->setRequired();
        } else {
            $form->addText('action_xyz', 'Action Xyz')
                ->setRequired();
        }
    });

    return $multistepForm;
}

选项

  • setDefaults(array)
    • 您表单的默认值,所有步骤同时设置
  • addFactory(callable, ?string)
    • 第一个参数是创建表单的工厂函数
    • 第二个参数是自定义模板路径
      • 如果没有指定当前步骤的模板,则使用标准的 {control form}
      • 在自定义模板中,您可以使用 {form form} ... {/form} 手动渲染每个步骤
  • setSuccessCallback(callable)
    • 所有步骤的值提交后发送到该回调