我正在寻找一种方法来管理MyFormType.php
中的所有表单数据。到目前为止我已经label
和placeholder
,但我想要存储一个额外的字符串,例如对于"更多细节" 。
的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-*
- 属性传递数据,如:
// ...
'attr' => ['data-info' => 'more information']
// ...
但是如何以一种好的方式读取数据,而没有错误的解决方法?
此问题的最佳/良好做法是什么?
提前致谢!
答案 0 :(得分: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 %}
答案 1 :(得分: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
答案 2 :(得分:1)
乙
我看到没有答案显示Twig解决方案,所以我想显示一个Twig答案,以防你想要使用它。 form_label
经文form_widget
的格式不同,因此在编码时请记住这一点。
我不知道任何form_additionalData
rending规范。请参阅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'
}
}) }}
如果您有疑问,请告诉我。