将自定义选项传递给 symfony2 表单 [英] Pass custom options to a symfony2 form
问题描述
在 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屋!