2015-04-02 28 views
3

1就是我想要做的就是添加自定義(選項是在這種情況下,「角」)選項來我的表單控件模板:添加自定義選項,symfony的形式

{%- 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定義了基本選項。我可以在表單模板中全局訪問這些選項,但是我找不到添加我自己的方法。在你形成型

/** 
* @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

我發現基於@Charlie盧卡斯後的溶液

6

只需添加默認選項。

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

上述方法僅更新父窗體(問),但如果我通過窗口小部件模板這個選項:

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

我recive errorr該選項犯規存在。

現在我明白爲什麼會出現錯誤。該選項在每個小部件中調用。這意味着子元素也會調用這個選項。但是這個選項沒有在兒童中定義。

爲了解決它,我添加選項到父窗體和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; 
    } 
} 
+1

謝謝你的回答,但這個讓我補充選項formType對象。我無法訪問我的樹枝模板中的這個選項。我需要將選項傳遞給FormView對象。我們把$ formType-> createView從控制器中查看 – 2015-04-02 10:38:44

相關問題