如何创建一个表单类型扩展

编辑该页面

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

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

自定义表单字段类型很好当你需要字段类型与一个特定的目的,如船舶类型选择器,或增值税号码输入。

但有时,你真的不需要添加新的字段类型——你想添加特性上现有的类型。这就是表单类型扩展进来。

表单类型扩展主要有两个用例:

  1. 你想添加一个特定的功能单一类型(如添加一个“下载”功能文件类型字段类型);
  2. 你想添加一个通用特性来几种类型(如添加一个“帮助”文本每一个“输入文本”式的类型)。

有可能实现你的目标和自定义表单渲染或自定义表单字段类型。但使用表单类型扩展可以清洁(通过限制的业务逻辑模板)和更灵活(您可以添加一些类型扩展到一个表单类型)。

表单类型扩展可以实现自定义字段类型能做什么,而是自己的字段类型,他们插入现有的类型

假设你管理媒体实体,每个媒体文件相关联。你的媒体表单使用文件类型,但在编辑实体时,你希望看到它的图像自动呈现文件输入。

当然你可以通过定制这个领域是如何呈现在一个模板。但字段类型扩展允许您在一个干燥的时尚。

ImageTypeExtension在这篇文章)。标准,形成扩展通常生活在形式\扩展你的一个包的目录中。

当创建一个表单类型扩展,你可以实现的FormTypeExtensionInterface接口或扩展AbstractTypeExtension类。在大多数情况下,很容易扩展抽象类:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/ / src / / ImageTypeExtension.php AppBundle /形式/扩展名称空间AppBundle\形式\扩展;使用ob娱乐下载\组件\形式\AbstractTypeExtension;使用ob娱乐下载\组件\形式\扩展\核心\类型\文件类型;ImageTypeExtension扩展AbstractTypeExtension{/ * * *返回类型被扩展的名称。* *@return字符串类型的名称* /扩展公共函数getExtendedType(){返回文件类型::类;}}

唯一的方法必须实现是getExtendedType ()函数。它是用来表示表单类型的名称,将延长您的扩展。

提示

你返回的值getExtendedType ()方法对应于表单的完全限定类名类你想扩展类型。

除了getExtendedType ()功能,你可能会想要覆盖下列方法之一:

  • buildForm ()
  • buildView ()
  • configureOptions ()
  • finishView ()

对这些方法做的更多信息,你可以参考如何创建一个自定义表单字段类型篇文章。

form.type_extension标签:

  • YAML
  • XML
  • PHP
1 2 3 4 5
服务:app.image_type_extension:类:AppBundle \ \ \ ImageTypeExtension扩展形式标签:- - - - - -{名称:form.type_extension,extended_type:ob娱乐下载Symfony \组件\ \ \核心类型\ \文件类型扩展形式}

2.8

extended_type选择是新的在Symfony 2.8ob娱乐下载。之前,被称为的选项别名。如果你是一个包和需要支持多个Symfony的版本,作者指定ob娱乐下载这两个extended_type别名(将防止任何弃用警告)。

extended_type标签的关键字段的类型应该应用于这个扩展。在你的情况下,您想要扩展ob娱乐下载\组件\形式\扩展\核心\类型\文件类型字段类型,您将使用extended_type

如何处理文件上传与教义:你有一个媒体模式与路径属性,对应数据库中的图像路径:

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 / AppBundle /实体/ Media.php名称空间AppBundle\实体;使用ob娱乐下载\组件\验证器\约束作为断言;媒体{/ /……/ * * *@var字符串的路径——通常存储在数据库* /私人美元路径;/ /……/ * * * * *得到图像的URL@return空字符串| * /公共函数getWebPath(){/ /……美元webPath完整图像的URL,用于模板返回美元webPath;}}

表单类型扩展类需要做两件事来扩展文件类型::类表单类型:

  1. 覆盖configureOptions ()为了添加一个方法image_path选择;
  2. 覆盖buildView ()方法以图像URL传递给视图。

的逻辑是这样的:当添加一个表单字段的类型文件类型::类,你可以指定一个新选项:image_path。这个选项会告诉文件字段如何获得实际的图像URL以显示在视图:

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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
/ / src / / ImageTypeExtension.php AppBundle /形式/扩展名称空间AppBundle\形式\扩展;使用ob娱乐下载\组件\形式\AbstractTypeExtension;使用ob娱乐下载\组件\形式\FormView;使用ob娱乐下载\组件\形式\FormInterface;使用ob娱乐下载\组件\PropertyAccess\PropertyAccess;使用ob娱乐下载\组件\OptionsResolver\OptionsResolver;使用ob娱乐下载\组件\形式\扩展\核心\类型\文件类型;ImageTypeExtension扩展AbstractTypeExtension{/ * * *返回类型被扩展的名称。* *@return字符串类型的名称* /扩展公共函数getExtendedType(){返回文件类型::类;}/ * * * * *添加image_path选项@paramOptionsResolver解析器* /美元公共函数configureOptions(OptionsResolver美元解析器){美元解析器- >setDefined (数组(“image_path”));}/ * * * * *图像URL传递给视图@paramFormView $观点*@paramFormInterface美元形式*@param数组* /美元选项公共函数buildView(FormView美元视图,FormInterface美元形式数组,美元选项){如果(收取(美元选项(“image_path”))){美元parentData=美元形式- >getParent ()- >getData ();美元imageUrl=;如果(= = !美元parentData){美元访问器= PropertyAccess::createPropertyAccessor ();美元imageUrl=美元访问器- >getValue (美元parentData,美元选项(“image_path”]);}/ /设置一个“image_url”变量,可以在呈现美元视图- >var (“image_url”]=美元imageUrl;}}}

如何自定义形式呈现篇文章。

在您的扩展类,添加了一个新的变量(image_url),但是你仍然需要利用这一新的变量在你的模板。具体地说,您需要覆盖file_widget布洛克:

1 2 3 4 5 6 7 8 9 10 11 12 13
{# src / AppBundle /资源/视图/形式/ fields.html。树枝#}{%扩展“form_div_layout.html。嫩枝' %}{%file_widget %}{%没有余地的%}{{(“form_widget”)}}{%如果image_url不是零%}<imgsrc={{资产(image_url)}}/ >{%endif%}{%endspaceless%}{%endblock%}

请注意

你需要改变你的配置文件或显式地指定您想要如何形成主题为了Symfony使用覆盖块。ob娱乐下载看到如何自定义形式呈现为更多的信息。

表单类型引用)。例如,几个可用的表单类型本身在Symfony的继承ob娱乐下载TextType表单类型(如EmailType,SearchType,UrlType等)。一种类型的扩展应用TextType(即,getExtendedType ()方法返回TextType::类)将适用于所有这些形式类型。

以同样的方式,因为大多数在Symfony的继承形式类型本地可用ob娱乐下载FormType形式类型,一种类型的扩展应用FormType将适用于所有这些。一个显著的例外是ButtonType表单类型。还请记住,无论是扩展的自定义表单类型FormType也没有ButtonType类型可以被创建。

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