将自定义选项传递给symfony2表单 [英] Pass custom options to a symfony2 form

查看:78
本文介绍了将自定义选项传递给symfony2表单的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在symfony 1.4中,可以通过表单的选项来参数化表单类的定义。有没有办法将自定义选项传递给我的自定义窗体类型?我试过使用 buildForm 方法的options参数,但我不太确定这个数组是什么,显然它不是我想要的。 。

解决方案

解决方案很简单,如果您希望您的自定义选项在Twig模板中也可用,则必须使用
$ builder-> setAttribute() in buildForm 方法

$ view-> set()方法位于 buildView()方法中。 b

<?php

命名空间Acme\DemoBundle\Form\Type;

使用Symfony \ Component \ Form \ AbstractType作为FormAbstractType;
使用Symfony \Component\Form\FormBuilder;
使用Symfony \Component\Form\FormView;
使用Symfony \Component\Form\FormInterface;

//对于Symfony 2.1及更高版本:
使用Symfony \ Component \ Options \\ Resolver \ Options \\ ResolverInterface;
$ b $ / **
* ImagePreviewType
*
* /
class ImagePreviewType extends FormAbstractType
{

/ **
* {@inheritDoc}
*对于Symfony 2.0
* /
// public function getDefaultOptions(array $ options)
// {
// $ options = parent :: getDefaultOptions($ options);
// $ options ['base_path'] ='path / to / default / dir /';
//
// return $ options;
//
$ b $ **
* {@inheritDoc}
*对于Symfony 2.1及更高版本
* /
public function setDefaultOptions (OptionsResolverInterface $ resolver)
{
$ resolver-> setDefaults(array(
'base_path'=>'',
));
}
$ b $ **
* {@inheritDoc}
* /
公共函数buildView(FormView $ view,FormInterface $ form,array $ options )
{
//对于Symfony 2.0:
// $ view-> set('base_path',$ form-> getAttribute('base_path'));

//对于Symfony 2.1及更高版本:
$ view-> vars ['base_path'] = $ options ['base_path'];

$ b / **
* {@inheritDoc}
* /
public function buildForm(FormBuilder $ builder,array $ options)
{
$ builder
- > setAttribute('base_path',$ options ['base_path'])
;

$ b / **
* {@inheritDoc}
* /
public function getName()
{
return 'image_preview';
}

public function getParent(array $ options)
{
//用于Symfony 2.0:
// return'field';

//用于Symfony 2.1及更高版本:
返回'form';


自定义表单类型(文件... Acme /DemoBundle/Resources/views/Form/fields.html.twig):

  {%block image_preview_widget%} 
{%spaceless%}
< img src ={{base_path_value}}alt ={{block('widget_container_attributes')}} />
{%endspaceless%}
{%endblock%}

用于app / config / config.yml中的自定义表单类型
$ b

  twig:
debug :%kernel.debug%
strict_variables:%kernel.debug%
form:
资源:
- 'AcmeDemoAdminBundle:Form:fields.html.twig'

用法:在编辑个人资料时显示用户图片的预览:

  // src / Acme / DemoBundle / Form / Type / UserType.php 
命名空间Acme\DemoBundle\Form\Type;

使用Symfony \Component\Form\AbstractType;
使用Symfony \Component\Form\FormBuilder;
$ b $ class UserType extends AbstractType
{
public function buildForm(FormBuilder $ builder,array $ options)
{
$ builder-> add(' user_profile_image_file_name',new ImagePreviewType(),array(
'base_path'=>'some / other / dir',
));
}
}

2014-08-18:已更新Symfony 2.1或更高版本

in symfony 1.4 it was possible to parameterize a form class definition, via the options of the form. Is there any way to pass custom options to my custom form type??? i've tried to use the options parameter of the buildForm method, but i'm not very sure what this array is, and apparently it is not for what i want... Thanks!

解决方案

The solution is simple, if you want your custom option to be available also in Twig template, you must use $builder->setAttribute() in buildForm method and $view->set() method in buildView() method, too.

<?php

namespace Acme\DemoBundle\Form\Type;

use Symfony\Component\Form\AbstractType as FormAbstractType;
use Symfony\Component\Form\FormBuilder;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\FormInterface;

// For Symfony 2.1 and higher:
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

/**
 * ImagePreviewType
 *
 */
class ImagePreviewType extends FormAbstractType
{

    /**
     * {@inheritDoc}
     * For Symfony 2.0
     */
    //public function getDefaultOptions(array $options)
    //{
    //    $options = parent::getDefaultOptions($options);
    //    $options['base_path'] = 'path/to/default/dir/';
    //
    //    return $options;
    //}

    /**
     * {@inheritDoc}
     * For Symfony 2.1 and higher
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'base_path'         => '',
        ));
    }

    /**
     * {@inheritDoc}
     */
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        // For Symfony 2.0:
        // $view->set('base_path', $form->getAttribute('base_path'));

        // For Symfony 2.1 and higher:
        $view->vars['base_path'] = $options['base_path'];
    }

    /**
     * {@inheritDoc}
     */
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
            ->setAttribute('base_path', $options['base_path'])
        ;
    }

    /**
     * {@inheritDoc}
     */
    public function getName()
    {
        return 'image_preview';
    }

    public function getParent(array $options)
    {
        // for Symfony 2.0:
        // return 'field';

        // for Symfony 2.1 and higher:
        return 'form';
    }
}

Template for custom form type (file ...Acme/DemoBundle/Resources/views/Form/fields.html.twig):

{% block image_preview_widget %}
{% spaceless %}
<img src="{{ base_path ~ value }}" alt=""  {{ block('widget_container_attributes') }} />
{% endspaceless %}
{% endblock %}

Register your template for custom form types in app/config/config.yml

twig:
    debug:            %kernel.debug%
    strict_variables: %kernel.debug%
    form:
        resources:
            - 'AcmeDemoAdminBundle:Form:fields.html.twig'

Usage: Display preview of user's image while editing his profile:

// src/Acme/DemoBundle/Form/Type/UserType.php
namespace Acme\DemoBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;

class UserType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder->add('user_profile_image_file_name', new ImagePreviewType(), array(
            'base_path' => 'some/other/dir',
        ));
    }
}

2014-08-18: Updated for Symfony 2.1 or higher

这篇关于将自定义选项传递给symfony2表单的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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