如何创建一个自定义表单字段类型
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.1,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.3(当前的稳定版本)。
如何创建一个自定义表单字段类型
ob娱乐下载Symfony提供了一群核心字段类型可供建筑形式。然而在有些情况下,您可能想要创建一个自定义表单字段类型为一个特定的目的。这道菜假设您需要一个字段定义包含一个人的性别,基于现有的选择。本节解释如何定义的字段,你可以定制它的布局和最后,如何注册它在应用程序中使用。
定义字段类型
为了创建自定义字段类型,首先您需要创建类的代表。在这种情况下,类的字段类型将被称为“GenderType”和文件将存储在表单字段的默认位置,这是< BundleName > \ \类型
。确保领域延伸AbstractType:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27日28
/ / src / Acme / DemoBundle /形式/类型/ GenderType.php名称空间Acme\DemoBundle\形式\类型;使用ob娱乐下载\组件\形式\AbstractType;使用ob娱乐下载\组件\OptionsResolver\OptionsResolverInterface;类GenderType扩展AbstractType{公共函数setDefaultOptions(OptionsResolverInterface美元解析器){美元解析器- >setDefaults (数组(“选择”= >数组(“米”= >“男”,“f”= >“女”)));}公共函数getParent(){返回“选择”;}公共函数getName(){返回“性别”;}}
提示
这个文件的位置,并不重要形式\类型
目录是一个约定。
的返回值getParent
表明你扩展函数选择
字段类型。默认情况下,这意味着你承受所有的逻辑和呈现字段类型。看到的一些逻辑,检查ChoiceType类。有三个方法尤其重要:
buildForm ()
——每个字段类型都有buildForm
方法,就是您配置和构建任何领域(年代)。请注意,这是你使用同样的方法设置你的形式,它的运作是一样的。李><李>buildView ()
——这种方法用于设置任何额外的变量需要渲染你的领域在一个模板。例如,在ChoiceType,一个多个
变量设置和使用模板中设置(或没有)多个
属性选择
字段。看到创建一个模板为更多的细节。李><李>setDefaultOptions ()
——这个定义选项可用于表单类型buildForm ()
和buildView ()
。有很多选择所有字段(参见表单字段类型),但在这里你可以创建任何其他需要。李>< /ul>提示
如果你创建一个字段包含许多字段,然后一定要设置为“父”类型
形式
或者一些延伸形式
。同样,如果您需要修改的“视图”你的孩子从你的父母类型,类型使用finishView ()
方法。的
getName ()
方法返回一个标识符在您的应用程序应该是唯一的。这是用在不同的地方,例如当定制表单类型将如何呈现。这一领域的目标是扩展类型的选择,使选择性别。这是通过修复
选择
列表可能的性别。
创建一个模板
每种字段类型呈现模板片段,这部分取决于你的价值getName ()
方法。有关更多信息,请参见如何自定义形式呈现。
在这种情况下,自父字段选择
,你不需要做任何工作作为自定义字段类型将自动显示像一个选择
类型。但为了这个例子中,我们假设当你的字段是“扩大”(即单选按钮或复选框,而不是选择字段),你总是想要呈现它ul
元素。在表单的主题模板(有关详细信息,请参阅上面的链接),创建一个gender_widget
块来处理:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
{# src / Acme / DemoBundle /资源/视图/形式/ fields.html。树枝#}{%块gender_widget %}{%没有余地的%}{%如果扩大%}<ul{{块(“widget_container_attributes”)}}>{%为孩子在形式上%}<李>{{form_widget(孩子)}}{{了form_label(孩子)}}< /李>{%endfor%}< /ul>{%其他的%}{#让选择小部件呈现选择标签#}{{块(“choice_widget”)}}{%endif%}{%endspaceless%}{%endblock%}
1 2 3 4 5 6 7 8 9 10 11 12 13 14
< !- - - - - -- - - - - -src/Acme/DemoBundle/Resources/views/Form/gender_widget.html.twig -->< /span>< ? php如果(美元扩大):? ><ul< ?php美元视图['形式']- - - - - ->块(美元形式,widget_container_attributes) ? > >< ? phpforeach(美元形式作为美元孩子):? ><李>< ? php回声美元视图(“形式”]- >小部件(美元孩子)? >< ? php回声美元视图(“形式”]- >标签(美元孩子)? >< /李>< ? phpendforeach? >< /ul>< ? php其他的:? >< !- - - - - -- - - - - -just let the choice widget render the select tag -->< /span>< ? php回声美元视图(“形式”]- >renderBlock (“choice_widget”)? >< ? phpendif? >
请注意
确保使用了正确的部件前缀。在本例中这个名字gender_widget
,根据所返回的值getName
。进一步,主要配置文件应该指向自定义表单模板时使用呈现各种形式。
1 2 3 4 5
# app / config / config.yml枝:形式:资源:- - - - - -“AcmeDemoBundle:形式:fields.html.twig”
1 2 3 4 5 6
< !- - - - - -- - - - - -app/config/config.xml -->< /span><枝:配置><枝:形式><枝:资源>AcmeDemoBundle:形式:fields.html.twig< /枝:资源>< /枝:形式>< /枝:配置>
1 2 3 4 5 6 7 8
/ / app / config / config . php美元容器- >loadFromExtension (“树枝”,数组(“形式”= >数组(“资源”= >数组(“AcmeDemoBundle:形式:fields.html.twig”))));
使用字段类型
你现在可以立即使用您的自定义字段类型,只需创建一个新的实例类型的表单:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/ / src / Acme / DemoBundle /形式/类型/ AuthorType.php名称空间Acme\DemoBundle\形式\类型;使用ob娱乐下载\组件\形式\AbstractType;使用ob娱乐下载\组件\形式\FormBuilderInterface;类AuthorType扩展AbstractType{公共函数buildForm(FormBuilderInterface美元构建器数组,美元选项){美元构建器- >add (“gender_code”,新GenderType (),数组(“empty_value”= >选择一个性别的));}}
但这只因为工作GenderType ()
是非常简单的。如果性别代码存储在数据库中的配置或?下一节解释了更复杂的字段类型解决这个问题。
作为服务创建字段类型
到目前为止,这个条目假设您有一个非常简单的自定义字段类型。但是如果你需要访问配置中,一个数据库连接,或其他服务,然后你要注册您的自定义类型作为服务。例如,假设你存储性别参数配置:
1 2 3 4 5
# app / config / config.yml参数:性别:m:男性f:女
1 2 3 4 5 6 7
< !- - - - - -- - - - - -app/config/config.xml -->< /span><参数><参数关键=“性别”类型=“收集”><参数关键=“m”>男性< /参数><参数关键=“f”>女< /参数>< /参数>< /参数>
1 2 3
/ / app / config / config . php美元容器- >setParameter (“genders.m”,“男”);美元容器- >setParameter (“genders.f”,“女”);
使用参数,定制字段类型定义为一种服务,注入性别
即将参数值作为第一个参数__construct
功能:
1 2 3 4 5 6 7 8
# src / Acme / DemoBundle /资源/ config / services.yml服务:acme_demo.form.type.gender:类:Acme \ DemoBundle \ \ \ GenderType型形式参数:- - - - - -性别“% %”标签:- - - - - -{名称:form.type,别名:性别}
1 2 3 4 5
< !- - - - - -- - - - - -src/Acme/DemoBundle/Resources/config/services.xml -->< /span><服务id=“acme_demo.form.type.gender”类=“Acme \ DemoBundle \ \ \ GenderType型”><论点>%性别%< /论点><标签的名字=“form.type”别名=“性别”/ >< /服务>
1 2 3 4 5 6 7 8 9 10 11 12
/ / src / Acme / DemoBundle /资源/ config / services.php使用ob娱乐下载\组件\DependencyInjection\定义;美元容器- >setDefinition (“acme_demo.form.type.gender”,新定义(“Acme \ DemoBundle \ \ \ GenderType型的形式,数组(“%性别%”)))- >addTag (“form.type”,数组(“别名”= >“性别”));
提示
确保服务文件被导入。看到服务容器获取详细信息。
确保别名
标签的属性与返回的值相对应getName
方法定义。你会看到这个时刻的重要性当您使用自定义字段类型。但首先,添加一个__construct
方法GenderType
性别,接收配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日24日25日26日
/ / src / Acme / DemoBundle /形式/类型/ GenderType.php名称空间Acme\DemoBundle\形式\类型;使用ob娱乐下载\组件\OptionsResolver\OptionsResolverInterface;/ /……/ /……类GenderType扩展AbstractType{私人美元genderChoices;公共函数__construct(数组美元genderChoices){美元这- >genderChoices =美元genderChoices;}公共函数setDefaultOptions(OptionsResolverInterface美元解析器){美元解析器- >setDefaults (数组(“选择”= >美元这- >genderChoices));}/ /……}
太棒了!的GenderType
现在由于配置参数和注册为一个服务。此外,因为你使用了form.type
其配置别名,使用领域现在更容易:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ / src / Acme / DemoBundle /形式/类型/ AuthorType.php名称空间Acme\DemoBundle\形式\类型;使用ob娱乐下载\组件\形式\FormBuilderInterface;/ /……类AuthorType扩展AbstractType{公共函数buildForm(FormBuilderInterface美元构建器数组,美元选项){美元构建器- >add (“gender_code”,“性别”,数组(“empty_value”= >选择一个性别的));}}
注意,而不是实例化一个新的实例,您可以参考它的别名用于您的服务配置,性别
。玩得开心!