【问题标题】:Add custom options to symfony form向 symfony 表单添加自定义选项
【发布时间】:2015-04-02 08:57:00
【问题描述】:

1 我想要做的是在我的表单小部件模板中添加自定义(在这种情况下选项是“角度”)选项:

{%- block widget_attributes -%}
    id="{{ id }}" name="{{ full_name }}"

    {%- if angular %} ng-model="{{ full_name }}"{% endif -%}
 ....
    {%- if intention %} {{ intention }}{% endif -%}
    {%- if read_only %} readonly="readonly"{% endif -%}
 .....
{%- endblock widget_attributes -%}

我想决定我的 CustomFormType 中是否有表单选项。 但我无法实现。我尝试了不同的方法。

是否可以在主窗体中添加自定义选项?

我知道有很多教程展示了如何在子元素中传递自定义选项,例如http://symfony.com/doc/current/cookbook/form/create_form_type_extension.html

我研究了表单组件的核心,并且有类

 namespace Symfony\Component\Form\Extension\Core\Type;

 class FormType extends BaseType{}

有方法构建视图

public function buildView(FormView $view, FormInterface $form, array $options)
{

     .....

    $view->vars = array_replace($view->vars, array(
        'read_only' => $readOnly,
        'errors' => $form->getErrors(),
        'valid' => $form->isSubmitted() ? $form->isValid() : true,
        'value' => $form->getViewData(),
        'data' => $form->getNormData(),
        'required' => $form->isRequired(),
        'max_length' => isset($options['attr']['maxlength']) ? $options['attr']['maxlength'] : null, // Deprecated
        'pattern' => isset($options['attr']['pattern']) ? $options['attr']['pattern'] : null, // Deprecated
        'size' => null,
        'label_attr' => $options['label_attr'],
        'compound' => $form->getConfig()->getCompound(),
        'method' => $form->getConfig()->getMethod(),
        'action' => $form->getConfig()->getAction(),
        'submitted' => $form->isSubmitted(),

    ));
}

在 symfony 之上定义基本选项。我可以在表单模板中全局访问这些选项,但我找不到添加自己的方法。

【问题讨论】:

    标签: symfony symfony-forms


    【解决方案1】:

    只需在表单类型中添加默认选项

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            // default form options
            'my_options' => 'my default value option'
        ));
    }
    

    编辑

    /**
     * {@inheritdoc}
     */
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        $view->vars['my_options'] = $options['my_options'];
    }
    

    【讨论】:

    • 感谢您的回答,但这允许我向 formType 对象添加选项。我无法在我的树枝模板中访问此选项。我需要将选项传递给 FormView 对象。我们把 $formType->createView 从控制器放到视图
    【解决方案2】:

    我根据@Charlie Lucas 的帖子找到了解决方案。

    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        $view->vars['my_options'] = $options['my_options'];
    }
    

    上面的方法只更新父表单(我问一下),但是如果我在小部件模板中传递这个选项:

    {%- block widget_attributes -%}
     {{ 'my_options' }}
    {%- endblock widget_attributes -%}
    

    我收到错误提示该选项不存在。

    现在我明白为什么会发生错误了。在每个小部件中都会调用此选项。这意味着子元素也调用此选项。但是这个选项没有在 children 中定义。

    为了解决这个问题,我在 FormType 类的父表单和子表单中添加了选项。 在

      public function buildView(FormView $view, FormInterface $form, array $options)
     {
        .....
     }
    

    我们无法访问子元素,所以我不得不调用 finishView()。 在这种方法中,我使用递归函数向所有元素添加选项

    public function finishView(FormView $view, FormInterface $form, array $options)
    {
        $params = array(
            'angular'=>true,
        );
    
        $this->setParam( $view, $params);
    
    }
    
    private function setParam(FormView $view, array $params)
    {
        $this->updateParam($view, $params);
        $this->updateChild($view, $params);
    }
    
    private function updateChild(FormView $parent, array $params)
    {
        foreach ($parent->children as $child){
            $this->updateParam($child, $params);
            $this->updateChild($child, $params);
        }
    }
    
    private function updateParam(FormView $view, array $params)
    {
        foreach($params as $key => $value){
            $view->vars[$key] = $value;
        }
    }
    

    【讨论】:

      【解决方案3】:

      在 symfony 5 中

      public function configureOptions(OptionsResolver $resolver)
      {
          $resolver->setDefaults([
              'my_custom_option' => 'default_value',
              'data_class' => User::class,
          ]);
      }
      

      【讨论】:

        猜你喜欢
        • 2021-02-08
        • 2016-11-18
        • 2013-11-23
        • 2020-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多