symfony - Symfony5 表单:如何默认禁用所有字段的“必填”?
问题描述
描述
Symfonyrequired = true
默认具有所有输入字段:
https ://symfony.com/doc/current/reference/forms/types/text.html#required
我正在寻找禁用这种行为的方法。
发现
1.明确要求=假
当然,最简单的方法是传递['required' => false]
给每个字段。但这有点笨拙。
2.助手类
然后,我创建了一个帮助类来构建根据我的需要调整的表单。它只是附加['required' => false]
到每个字段。它可以工作——除了提交按钮或类似的东西——对他们来说 Symfony 会抛出一个错误:
Symfony\Component\OptionsResolver\Exception\UndefinedOptionsException: The option "required" does not exist. Defined options are: "attr", "attr_translation_parameters", "auto_initialize", ...
我试图找到一种方法来获取字段的可用选项列表 - 但它们隐藏得很好,未能发现它们。
3. required=false 到表格
我也尝试放入['required' => false]
最顶级的形式。嗯......它的行为很奇怪:
- 如果我不将此选项传递给表单,或者如果我写
['required' => true]
,那么对于每个单独的字段,我可以将其覆盖为['required' => false]
- 如果我传递
['required' => false]
给表单,那么我不能用['required' => true]
任何字段覆盖它 - 所有这些都以某种方式被迫['required' => false]
问题
那么,有没有正确的方法来解决这个问题呢?它可能是一些method()
用于获取特定字段的可用选项 - 所以我可以跳过required
没有它的字段设置。或者一些我不知道的方法。
编辑 1
尝试了写在https://stackoverflow.com/a/65825111/982746中的解决方案
这是我的测试代码:
<?php
require_once __DIR__.'/../../lib/vendor/autoload.php';
use \Symfony\Component\Form\Forms;
use \Symfony\Component\Form\AbstractTypeExtension;
use \Symfony\Component\Form\Extension\Core\Type as T;
class NotRequiredExtension extends AbstractTypeExtension {
public static function getExtendedTypes (): iterable {
return [T\FormType::class];
}
public function configureOptions ($resolver) {
$resolver->setDefault('required', false);
}
}
$builder = Forms::createFormFactoryBuilder()
->addTypeExtension(new \NotRequiredExtension())
->getFormFactory()
->createBuilder(T\FormType::class, ['inherit'=>'', 'required_true'=>'', 'required_false'=>''])
;
$form = $builder
->add('inherit', T\TextType::class)
->add('required_true', T\TextType::class, ['required'=>true])
->add('required_false', T\TextType::class, ['required'=>false])
->getForm()
;
$formView = $form->createView();
var_dump($formView->children['inherit']->vars['required']); //false
var_dump($formView->children['required_true']->vars['required']); //false
var_dump($formView->children['required_false']->vars['required']); //false
似乎它不起作用 - 类似于我的实验#3:如果我设置required=false
为表单类型,symfony 然后拒绝更改required
任何true
单个字段 - 所有的var_dump()
s 显示false
。
解决方案
您可以创建表单扩展名AbstractTypeExtension
。
namespace App\Form\Extension;
use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\Extension\Core\Type\FormType;
use Symfony\Component\OptionsResolver\OptionsResolver;
class NoRequiredExtension extends AbstractTypeExtension
{
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefault('required', false);
}
public static function getExtendedTypes(): iterable
{
return [FormType::class];
}
}
推荐阅读
- scala - GetComponent[?, ProjectedExtent]: (? => TilerKeyMethods[K, K2]) 和 SpatialComponent: Boundable 是什么意思?
- xml - 我有一个输入文档,我只想提取前缀为 p 、 T 和 C 的元素
- windows - 从源脚本结束函数而不退出脚本
- react-native - React Native,在异步函数后获取
- reactjs - 如何根据条件在 React 中应用 CSS 样式并将其与另一个类合并?
- r - 使用 R 进行 Web 抓取,显示 Javascript 已禁用的消息
- ios - 如何在 Xcode 9.3 中更改包标识符
- android - 是否可以降级“Google Keep”应用程序?
- python - 将数据写入 CSV 文件
- makefile - makefile 将对象扁平化到一个目录中