infinityloop-dev / multistep-form
为 Nette 框架提供的组件,帮助创建多步表单。
v1.0.1
2020-02-02 21:02 UTC
Requires
- php: >=7.4
- nette/application: ^3.0
- nette/forms: ^3.0
- nette/http: ^3.0
This package is auto-updated.
Last update: 2024-08-29 04:48:38 UTC
README
🔧 为 Nette 框架提供的组件,帮助创建多步表单。
简介
此组件提供了一种简单的方式来创建多步表单。处理步骤之间的切换,将前一步的值传递到当前步骤,并将所有组合值传递到最后一步的成功回调。还处理常见的边缘情况,例如区分一个客户端访问的同一表单的多个实例。
安装
使用 composer 安装包
composer require infinityloop-dev/multistep-form
依赖
- PHP >= 7.4
- nette/application
- nette/http
- nette/forms
如何使用
- 在配置文件中将 \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)
- 所有步骤的值提交后发送到该回调