如何创建一个自定义表单字段类型

编辑该页面

警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.2,不再维护。

这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。

如何创建一个自定义表单字段类型

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块来处理:

  • 嫩枝
  • PHP
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%}

请注意

确保使用了正确的部件前缀。在本例中这个名字gender_widget,根据所返回的值getName。进一步,主要配置文件应该指向自定义表单模板时使用呈现各种形式。

  • YAML
  • XML
  • PHP
1 2 3 4 5
# app / config / config.yml枝:形式:资源:- - - - - -“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 ()是非常简单的。如果性别代码存储在数据库中的配置或?下一节解释了更复杂的字段类型解决这个问题。

作为服务创建字段类型

到目前为止,这个条目假设您有一个非常简单的自定义字段类型。但是如果你需要访问配置中,一个数据库连接,或其他服务,然后你要注册您的自定义类型作为服务。例如,假设你存储性别参数配置:

  • YAML
  • XML
  • PHP
1 2 3 4 5
# app / config / config.yml参数:性别:m:男性f:

使用参数,定制字段类型定义为一种服务,注入性别即将参数值作为第一个参数__construct功能:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8
# src / Acme / DemoBundle /资源/ config / services.yml服务:acme_demo.form.type.gender:类:Acme \ DemoBundle \ \ \ GenderType型形式参数:- - - - - -性别“% %”标签:- - - - - -{名称: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{