将自定义选项添加到symfony表单

时间:2015-04-02 08:57:00

标签: symfony symfony-forms

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

{%- 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中的form是否有选项。 但我无法实现它。我尝试了不同的方法。

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

我知道有很多教程展示如何在子元素中传递自定义选项,例如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定义基本选项。我可以在表单模板中全局访问这些选项,但我找不到添加自己的方法。

2 个答案:

答案 0 :(得分:8)

只需在表单类型

中添加默认选项即可
/**
 * @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'];
}

答案 1 :(得分:2)

我找到了基于@Charlie Lucas帖子的解决方案。

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

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

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

我认为错误选项不存在。

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

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

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

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

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;
    }
}