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

编辑该页面

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

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

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

ob娱乐下载Symfony提供了一群核心字段类型可供建筑形式。然而在有些情况下,您可能想要创建一个自定义表单字段类型为一个特定的目的。本文假设您需要一个字段定义保存航运选择,基于现有的选择。本节解释如何定义的字段以及如何自定义布局。

定义字段类型

为了创建自定义字段类型,首先您需要创建类的代表。在这种情况下都会调用类的字段类型ShippingType和文件将存储在表单字段的默认位置,这是< 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日
/ / src / AppBundle / /类型/ ShippingType.php形式名称空间AppBundle\形式\类型;使用ob娱乐下载\组件\形式\AbstractType;使用ob娱乐下载\组件\OptionsResolver\OptionsResolver;使用ob娱乐下载\组件\形式\扩展\核心\类型\ChoiceType;ShippingType扩展AbstractType{公共函数configureOptions(OptionsResolver美元解析器){美元解析器- >setDefaults (数组(“选择”= >数组(“标准航运”= >“标准”,加快运输的= >“加速”,“优先航运”= >“优先”),“choices_as_values”= >真正的));}公共函数getParent(){返回ChoiceType::类;}}

提示

这个文件的位置,并不重要形式\类型目录是一个约定。

的返回值getParent ()表明你扩展函数ChoiceType字段。默认情况下,这意味着你承受所有的逻辑和呈现字段类型。看到的一些逻辑,检查ChoiceType类。有三个方法尤其重要:

buildForm ()
每个字段类型都有buildForm ()方法,就是您配置和构建任何领域(年代)。请注意,这是你使用同样的方法设置<新兴市场>你的形式,它的运作是一样的。
buildView ()
该方法用于设置任何额外的变量需要渲染你的领域在一个模板。例如,在ChoiceType,一个多个变量设置和使用模板中设置(或没有)多个属性选择字段。看到创建一个模板为更多的细节。
configureOptions ()
这个定义的选项可用于表单类型buildForm ()buildView ()。有很多选择所有字段(参见FormType领域),但在这里你可以创建任何其他需要。

提示

如果你创建一个字段包含许多字段,然后一定要设置为“父”类型形式或者一些延伸形式。同样,如果您需要修改的“视图”你的孩子从你的父母类型,类型使用finishView ()方法。

这一领域的目标是扩展类型的选择,使船舶类型的选择。这是通过修复选择可用航运选项的列表。

创建一个模板

每种字段类型呈现模板片段,这部分取决于你的类型的类名。有关更多信息,请参见如何自定义形式呈现

请注意

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

谨慎

当表单类的名称匹配任何内置的字段类型,表单可能不会正确地呈现。一种类型命名AppBundle \ \ PasswordType形式内置的名称有相同的块吗PasswordType和不会正确地呈现。覆盖getBlockPrefix ()方法返回一个独特的块前缀(例如。app_password),以避免碰撞。

在这种情况下,自父字段ChoiceType,你不<新兴市场>需要做任何工作作为自定义字段类型将自动显示像一个ChoiceType。但为了这个例子中,假设当你的字段是“扩大”(即单选按钮或复选框,而不是选择字段),你总是想要呈现它ul元素。在表单的主题模板(有关详细信息,请参阅上面的链接),创建一个shipping_widget块来处理:

  • 嫩枝
  • PHP
1 2 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(孩子)}}{{了form_label(孩子)}}< />{%endfor%}< /ul>{%其他的%}{#让选择小部件呈现选择标签#}{{(“choice_widget”)}}{%endif%}{%endspaceless%}{%endblock%}

提示

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

请注意

确保使用了正确的部件前缀。在本例中这个名字shipping_widget(见如何自定义形式呈现)。进一步,主要配置文件应该指向自定义表单模板时使用呈现各种形式。

当使用树枝,这是:

  • 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”

使用字段类型

你现在可以立即使用您的自定义字段类型,只需创建一个新的实例类型的表单:

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

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

访问服务和配置

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ / src / AppBundle / /类型/ ShippingType.php形式名称空间AppBundle\形式\类型;/ /……使用学说\ORM\EntityManagerInterface;ShippingType扩展AbstractType{私人美元新兴市场;公共函数__construct(EntityManagerInterface美元新兴市场){美元- >em =美元新兴市场;}/ /使用$ this - > em下来任何你想要的…}

如果您使用的是默认值services.yml配置(即服务形式/装入和可以使用autoconfigure启用),这已经工作!看到服务容器为更多的细节。

提示

如果你不使用可以使用autoconfigure,请确保标签你的服务form.type

玩得开心!

这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。