Symfony/Twig:如何将附加数据传递给表单? [英] Symfony/Twig: how to pass additional data to a form?

查看:30
本文介绍了Symfony/Twig:如何将附加数据传递给表单?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在寻找一种方法来管理 MyFormType.php 中的所有表单数据.到目前为止,我已经有了 labelplaceholder,但我想存储一个额外的字符串,例如更多详细信息".

AppBundle\Form\Type\MyFormType.php

//...$builder->add('fieldname', TextType::class, ['标签' =>'我的标签','属性' =>['占位符' =>'我的占位符'],'附加数据' =>['信息' =>'更多信息]//<- ???]);//...

myForm.html.twig

标签:{{form_label(form.fieldname)}}文本字段:{{form_widget(form.fieldname)}}信息:{{form_additionalData(form.fieldname, 'info')}} {# ???#}

我正在考虑通过 data-* 属性传递数据,例如:

//...'属性' =>['数据信息' =>'更多信息']//...

但是如何在没有错误解决方法的情况下以良好的方式读取数据?

针对这个问题有什么最佳/好的做法吗?

提前致谢!

解决方案

通过使用 表单如果它是您的应用程序中的常见用例,那么类型扩展可能是一种方法:

# src/AppBundle/Form/Extension/FormTypeExtension.php类 FormTypeExtension 扩展 AbstractTypeExtension{公共函数 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);}}公共函数 configureOptions(OptionsResolver $resolver){$resolver->setDefaults(array('extra_data' => array()));$resolver->setAllowedTypes('extra_data', 'array');}公共函数 getExtendedType(){返回 FormType::class;}}

注册您的表单类型扩展:

# app/config/services.yml服务:app.form.extension.form_type:类:AppBundle\Form\Extension\FormTypeExtension标签:- { 名称:form.type_extension,extended_type:Symfony\Component\Form\Extension\Core\Type\FormType }

如果:

$form->add('name', TextType::class, array('额外数据' =>大批('富' =>'酒吧','巴兹' =>数组('姓名' => '约翰'),),));

那么:

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

<块引用>

但是如何在没有错误解决方法的情况下以良好的方式读取数据?

在某些 JavaScript 上下文中使用 jQuery 示例:

var data = $('#form_name').data();//所有数据值都会自动转换为 JSON警报(数据.foo);//显示:条形警报(data.baz.name);//显示:约翰

I'm looking for a way to manage all the form data within MyFormType.php. So far I've the label and placeholder, but I'd like to store an additional string, e.g. for "more details".

AppBundle\Form\Type\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')}}  {# ??? #}

I was thinking about passing the data via an data-*-attribute like:

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

But how to read the data in a good way, without buggy workarounds?

Any best/good practise for this issue?

Thanks in advance!

解决方案

By using a form type extension for that probably is a way if it's a common use case in your application:

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

Register your form type extension:

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

If:

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

Then:

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

But how to read the data in a good way, without buggy workarounds?

In some JavaScript context by using jQuery example:

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

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

这篇关于Symfony/Twig:如何将附加数据传递给表单?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆