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

编辑本页

警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 3.4,现已不再维护。

本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。

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

ob娱乐下载Symfony提供了一堆可用于构建表单的核心字段类型。但是,在某些情况下,您可能希望为特定目的创建自定义表单字段类型。本文假设您需要一个基于现有选项字段的包含送货选项的字段定义。本节解释如何定义字段以及如何自定义其布局。

定义字段类型

为了创建自定义字段类型,首先必须创建表示该字段的类。在这种情况下,持有字段类型的类将被调用ShippingType该文件将存储在表单字段的默认位置,即< BundleName > \ \形式类型

属性的所有字段类型都必须实现FormTypeInterface,但你应该从AbstractType,它已经实现了该接口,并提供了一些实用程序:

12 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 / AppBundle / /类型/ ShippingType.php形式名称空间AppBundle形式类型使用ob娱乐下载组件形式AbstractType使用ob娱乐下载组件形式扩展核心类型ChoiceType使用ob娱乐下载组件OptionsResolverOptionsResolverShippingType扩展AbstractType公共函数configureOptions(OptionsResolver解析器解析器->setDefaults ([“选择”= > [“标准航运”= >“标准”加快运输的= >“加速”“优先航运”= >“优先”),“choices_as_values”= >真正的]);}公共函数getParent()返回ChoiceType::类;}}

提示

该文件的位置并不重要形式\类型目录只是一种惯例。

函数的返回值getParent ()函数指示您正在扩展ChoiceType字段。这意味着,在默认情况下,您将继承该字段类型的所有逻辑和呈现。要了解其中的一些逻辑,请查看ChoiceType类。

请注意

PHP类扩展机制和Symfony表单字段扩展机制是不同的。ob娱乐下载返回的父类型getParent ()是Symfonyob娱乐下载用来构建和管理字段类型的工具。使PHP类从AbstractType仅仅是实现所需的一种方便的方式吗FormTypeInterface

有三种方法特别重要:

buildForm ()
每个字段类型都有一个buildForm ()方法,您可以在其中配置和构建任何字段。请注意,这与您用于设置的方法相同你的形式,这里也一样。
buildView ()
此方法用于设置在模板中呈现字段时需要的任何额外变量。例如,在ChoiceType,一个多个变量,并在模板中用于设置(或不设置)多个属性上的选择字段。看到为字段创建模板欲知详情。
configureOptions ()
这将定义可用于的表单类型的选项buildForm ()而且buildView ().所有领域都有许多共同的选项(参见FormType领域),但您可以在这里创建所需的任何其他内容。

提示

如果您正在创建一个包含许多字段的字段,那么请确保将您的“父”类型设置为形式或者一些延伸的东西形式.同样,如果您需要从父类型修改任何子类型的“视图”,请使用finishView ()方法。

该字段的目标是扩展选择类型,以支持对运输类型的选择。这是通过固定选择到可用的运输选项列表。

为字段创建模板

每个字段类型都由一个模板片段呈现,该模板片段部分由类型的类名决定。有关更多信息,请参见如何自定义表单渲染

请注意

前缀的第一部分(例如。航运)来自类名(ShippingType->航运).这可以通过重写来控制getBlockPrefix ()ShippingType

谨慎

当表单类的名称与任何内置字段类型匹配时,表单可能无法正确呈现。一个名为AppBundle \ \ PasswordType形式将有相同的块名内置PasswordType并且不会被正确渲染。覆盖getBlockPrefix ()方法返回唯一的块前缀(例如:app_password)以避免碰撞。

在本例中,由于父字段为ChoiceType,你不知道需要做任何工作,作为自定义字段类型将自动呈现像ChoiceType.但是为了这个例子,假设当你的字段被“扩展”时(例如单选按钮或复选框,而不是选择字段),你想总是以ul元素。在您的表单主题模板(参见上面的链接了解详细信息)中,创建一个shipping_widget块来处理这个:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
{# app /资源/视图/形式/ fields.html。树枝#}{%shipping_widget %}{%没有余地的%}{%如果扩大%}<ul{{(“widget_container_attributes”)}}>{%表单%}中的子元素<>{{form_widget(child)}}{{form_label(child)}}>{%endfor%}ul>{%其他的%}{#让选择小部件呈现选择标签#}{{(“choice_widget”)}}{%endif%}{%endspaceless%}{%endblock%}

提示

您可以进一步定制用于呈现所选类型的每个子类型的模板。在这种情况下要覆盖的块被命名为“块名”+_entry_+ "元素名称" (标签错误小部件)(例如,定制你需要定义的Shipping小部件的子部件的标签{% block shipping_entry_label %}…{% endblock %}).

请注意

确保使用了正确的小部件前缀。在本例中,名称应该是shipping_widget(见如何自定义表单渲染).此外,主配置文件应该指向自定义表单模板,以便在呈现所有表单时使用它。

当使用Twig时,这是:

  • YAML
  • XML
  • PHP
1 2 3 4
# app / config / config.yml枝:form_themes:-“形式/ fields.html.twig”

对于PHP模板引擎,你的配置应该是这样的:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6
# app / config / config.yml框架:模板:形式:资源:-”:形式:fields.html.php”

使用字段类型

你现在可以通过在你的表单中创建一个新的类型实例来使用你的自定义字段类型:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ / src / AppBundle / /类型/ OrderType.php形式名称空间AppBundle形式类型使用AppBundle形式类型ShippingType使用ob娱乐下载组件形式AbstractType使用ob娱乐下载组件形式FormBuilderInterface订单类型扩展AbstractType公共函数buildForm(FormBuilderInterface构建器数组,选项构建器->add (“shippingCode”, ShippingType::类,“占位符”= >“选择送货方式”]);}}

但这只是因为ShippingType ()很简单。如果运输代码存储在配置中或数据库中呢?下一节将解释更复杂的字段类型如何解决此问题。

访问服务和配置

如果你需要访问服务从您的表单类中添加一个__construct ()方法正常:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ / src / AppBundle / /类型/ ShippingType.php形式名称空间AppBundle形式类型/ /……使用学说ORMEntityManagerInterfaceShippingType扩展AbstractType私人entityManager公共函数__construct(EntityManagerInterfaceentityManager->entityManager =entityManager;}//使用$this->entityManager下任何你想要的地方…

如果您使用默认设置services.yml配置(即来自形式/加载和可以使用autoconfigure启用),这将已经工作!看到服务容器欲知详情。

提示

如果你不吸毒的话可以使用autoconfigure,请务必标签你的服务form.type

玩得开心!

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。