2016-09-22 74 views
2

我正在尋找一種方法來管理MyFormType.php中的所有表單數據。到目前爲止,我已經有labelplaceholder,但我想存儲一個額外的字符串,例如爲「更多詳情」Symfony/Twig:如何將附加數據傳遞給表單?

的appbundle \表格\型號\ MyFormType.php

// ... 
$builder->add('fieldname', TextType::class, [ 
    'label' => 'My label', 
    'attr' => ['placeholder' => 'My placeholder'],  
    'additionalData' => ['info' => 'More information] // <- ???  
]); 
// ... 

myForm.html.twig

Label: {{form_label(form.fieldname)}} 
Textfield: {{form_widget(form.fieldname)}} 
Info: {{form_additionalData(form.fieldname, 'info')}} {# ??? #} 

我在想通過data-* -attribute像傳遞數據:

// ... 
'attr' => ['data-info' => 'more information'] 
// ... 

但是,如何以良好的方式讀取數據,而不需要使用多變的解決方法?

這個問題的最佳/良好做法?

提前致謝!

+2

您可以通過form.fieldname.vars.attr訪問'attr'值。這將返回你的數組。 –

+2

對所有類型都沒有* easy *方法。最直接的方式是將一個[表單擴展](https://symfony.com/doc/current/form/create_form_type_extension.html)添加到基本表單類型以允許一個新選項。這個選項將在模板中可用。儘管您還需要自定義表單小部件以實際使用該新選項。 – Yoshi

+0

@yoshi。來吧,這並不難。你不需要任何形式的擴展。 –

回答

3

通過使用一個form type extension可能是一個方式,如果這是一個常見的情況在你的應用程序:

# src/AppBundle/Form/Extension/FormTypeExtension.php 

class FormTypeExtension extends AbstractTypeExtension 
{ 
    public function buildView(FormView $view, FormInterface $form, array $options) 
    { 
     foreach ($options['extra_data'] as $name => $data) { 
      $dataName = sprintf('data-%s', $name); 
      $view->vars['attr'][$dataName] = json_encode($data); 
     } 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array('extra_data' => array())); 
     $resolver->setAllowedTypes('extra_data', 'array'); 
    } 

    public function getExtendedType() 
    { 
     return FormType::class; 
    } 
} 

註冊表單類型的擴展名:

# app/config/services.yml 

services: 
    app.form.extension.form_type: 
     class: AppBundle\Form\Extension\FormTypeExtension 
     tags: 
      - { name: form.type_extension, extended_type: Symfony\Component\Form\Extension\Core\Type\FormType } 

如果:

$form->add('name', TextType::class, array(
    'extra_data' => array(
     'foo' => 'bar', 
     'baz' => array('name' => 'john'), 
    ), 
)); 

然後:

<input type="text" id="form_name" name="form[name]" data-foo=""bar"" data-baz="{"name": "john"}"/> 

而是怎樣讀書的好方法的數據,而越野車的解決方法?

在一些JavaScript方面使用jQuery例如:

var data = $('#form_name').data(); 

// all data values are converted to JSON automatically 
alert(data.foo); // display: bar 
alert(data.baz.name); // display: john 
+0

我剛剛更新了我的答案,向您展示瞭如何使用Javascript/jQuery讀取這些額外的數據。 – yceruto

4

好的做法是爲您的需要創建FormType併爲其配置必要的選項。

class YourType extends AbstractType 
{ 
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'add_info' => "", 
     )); 
    } 


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

    public function getBlockPrefix() 
    { 
     return 'your_type'; 
    } 


    public function getParent() 
    { 
     return TextType::class; 
    } 
} 

然後

$builder->add('fieldname', YourType::class, [ 
    'label' => 'My label', 
    'attr' => ['placeholder' => 'My placeholder'],  
    'add_info' => 'More information' 
]); 

然後做一個小部件

{% block your_type_widget %} 
    {% spaceless %} 
     {{ add_info }} 
      ... other code 
    {% endspaceless %} 
{% endblock %} 
+0

只想說謝謝:)。這幫助我解決了一個問題:P。 – Elven

+0

歡迎:) –

1

B.

我看到沒有一個答案顯示出嫩枝的解決方案,所以我想表現出的情況下樹枝答案你想使用它。 form_labelform_widget的格式是不同的,因此在編碼時請記住這一點。

我不知道任何form_additionalData伸縮規範。請參閱reference here。但是,可以使用「form_label,form_errors和form_widget」。

在我的下面的例子中,我將顯示「form_label」和「form_widget」供您參考(帶有一點變化)。這工作,我試了一下:

Label: {{ form_label(form.fieldname,null,{ 
    'label_attr':{ 
     'id':'my_label_id', 
     'class':'my_label_class', 
     'data-info':'my label information' 
    } 
}) }} 
Textfield: {{ form_widget(form.fieldname,{ 
    'attr':{ 
     'class':'my_text_field_class', 
     'data-info':'my-text-field information' 
    } 
}) }} 

讓我知道如果你有問題。