【问题标题】:How to add options to a Symfony Form field?如何向 Symfony 表单字段添加选项?
【发布时间】:2020-10-28 06:51:38
【问题描述】:

我对 PHP 和 Symfony 比较陌生,并且正在为表单选项苦苦挣扎:

我有以下简单的代码:

  //OnceType.php
class OnceType extends AbstractType
{

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('date', TextType::class, [
            "format" => "date"
        ])
    ;
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
        'data_class' => Once::class,
        'format' => "date",
    ]);
 }
}

我收到一个错误,因为 format 不是 TextType 的选项,但我找不到添加自己选项的方法(但我知道这是可能的,从我阅读的其他帖子中)

我已经阅读了很多其他类似问题的帖子,但无法掌握如何做到这一点(我尝试了setDefaults options,但它并没有引导我到任何地方)

【问题讨论】:

    标签: php forms symfony types


    【解决方案1】:

    您需要在 configureOptions() 方法中添加对 $resolver->setAllowedTypes() 的调用。

    见https://symfony.com/doc/current/forms.html#passing-options-to-forms

    【讨论】:

      【解决方案2】:

      感谢您的帮助

      我尝试这样做,但仍然得到同样的错误:

      class OnceType extends AbstractType
      {
          public function buildForm(FormBuilderInterface $builder, array $options)
         {
              $builder
                  ->add('date', TextType::class, ["format" => "date"])
              ;
          }
      
      public function configureOptions(OptionsResolver $resolver)
          {
              $resolver->setDefaults([
                  'data_class' => Once::class,
                  "format" => "date",
              ]);
      
              $resolver->setAllowedTypes("format", "string");
          }
      }
      

      编辑:我认为这是因为那里的解析器添加了表单选项,而不是选项本身('日期',在 buildForm 中添加的那个)

      【讨论】:

        【解决方案3】:

        您需要创建一个新的自定义扩展来扩展 TextType,例如:

        <?php
        
        namespace App\Form;
        
        use Symfony\Component\Form\AbstractTypeExtension;
        use Symfony\Component\Form\Extension\Core\Type\FormType;
        use Symfony\Component\Form\FormInterface;
        use Symfony\Component\Form\FormView;
        use Symfony\Component\OptionsResolver\OptionsResolver;
        
        class TextTypeExtension extends AbstractTypeExtension
        {
            public function buildView(FormView $view, FormInterface $form, array $options)
            {
                $view->vars['format'] = $options['format'];
            }
        
            public function configureOptions(OptionsResolver $resolver)
            {
                $resolver->setDefaults([
                    'format' => null,
                ]);
            }
        
            public static function getExtendedTypes(): iterable
            {
                return [TextType::class];
            }
        }
        

        在此处阅读更多信息:https://symfony.com/doc/current/form/create_form_type_extension.html

        【讨论】:

        • 谢谢,这正是我所需要的!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-19
        • 1970-01-01
        • 2014-07-15
        • 2016-08-25
        • 2014-06-23
        • 1970-01-01
        相关资源
        最近更新 更多