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

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

问题描述

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

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!

推荐答案

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

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 AcmeDemoBundleFormType;

use SymfonyComponentFormAbstractType as FormAbstractType;
use SymfonyComponentFormFormBuilder;
use SymfonyComponentFormFormView;
use SymfonyComponentFormFormInterface;

// For Symfony 2.1 and higher:
use SymfonyComponentOptionsResolverOptionsResolverInterface;

/**
 * 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';
    }
}

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

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

在 app/config/config.yml 中为自定义表单类型注册模板

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 AcmeDemoBundleFormType;

use SymfonyComponentFormAbstractType;
use SymfonyComponentFormFormBuilder;

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 或更高版本进行更新

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

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