Reputation: 349
Symfony has required = true
for all input fields by default:
https://symfony.com/doc/current/reference/forms/types/text.html#required
And I'm searching for means to disable this behaviour.
Of course, the simplest one is to pass ['required' => false]
to each and every field. But this is somewhat unwieldy.
Then, I created a helper class to build forms tweaked for my needs. It was simply appending ['required' => false]
to every field. It works - except for submit button or alike - for them Symfony throws an error:
Symfony\Component\OptionsResolver\Exception\UndefinedOptionsException: The option "required" does not exist. Defined options are: "attr", "attr_translation_parameters", "auto_initialize", ...
I tried to find a way to get the list of available options for fields - but they are well-hidden, failed to uncover them.
I also tried to put ['required' => false]
into the very top form. Well... it behaves strangely:
['required' => true]
, then for each individual field I can override it to ['required' => false]
['required' => false]
to the form, then I can't override it with ['required' => true]
for any field - all of them are somehow forced to ['required' => false]
So, is there a right method to solve the issue? It could be some method()
for getting available options for specific fields - so I could skip setting required
for fields without it. Or some approach that I don't know about.
Tried the solution written in https://stackoverflow.com/a/65825111/982746
This is my test code:
<?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
Seems it doesn't work - similar to my experiment #3: if I set required=false
to the form type, symfony then refuses to change required
to true
for any individual field - all of the var_dump()
s display false
.
Upvotes: 2
Views: 1572
Reputation: 613
You can create form extension 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];
}
}
Upvotes: 5