如何创建一个表单类型扩展
编辑该页面警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 5.3,不再维护。
读这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。
你想添加一个特定的特性来一个表单类型(如添加一个“下载”功能文件类型
字段类型);
你想添加一个通用特性来几种类型(如添加一个“帮助”文本每一个“输入文本”式的类型)。
假设你有一个媒体
实体,每个媒体文件相关联。你的媒体
表单使用文件类型,但在编辑实体时,你希望看到它的图像自动呈现文件输入。
AbstractTypeExtension(你可以实现FormTypeExtensionInterface相反,如果你喜欢):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ / src /形式/扩展/ ImageTypeExtension.php名称空间应用程序\形式\扩展;使用欧宝娱乐app下载地址\组件\形式\AbstractTypeExtension;使用欧宝娱乐app下载地址\组件\形式\扩展\核心\类型\文件类型;类ImageTypeExtension扩展AbstractTypeExtension{/ * * *扩展类型的返回一个数组。* /公共静态函数getExtendedTypes():iterable{/ /返回(FormType::类)来修改(几乎)系统中各个领域返回(文件类型::类);}}
唯一的方法必须实现是getExtendedTypes ()
用于配置哪一个您想修改字段类型。
根据您的用例中,您可能需要重写一些以下的方法:
buildForm ()
buildView ()
configureOptions ()
finishView ()
关于这些方法做的更多信息,请参阅自定义表单字段类型篇文章。
注册为服务和标记与form.type_extension
标签。如果你使用默认的服务。yaml的配置,这已经为你做好了,谢谢自动配置。
提示
有一个可选的标记属性优先级
,默认为0
和控制的顺序加载表单类型扩展(优先级越高,越早一个扩展加载)。这是有用的,当你需要保证一个扩展加载之前或之后的另一个扩展。使用这个属性时,您需要显式地添加服务配置。
一旦注册扩展,任何方法你覆盖(如。buildForm ()
)时将调用任何给定类型的字段(文件类型
)建立。
提示
运行以下命令来验证表单类型扩展成功注册的应用程序:
1
美元php bin /控制台调试:形式
如何处理文件上传与教义:你有一个媒体模式与路径属性,对应数据库中的图像路径:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日
/ / src /实体/ Media.php名称空间应用程序\实体;使用欧宝娱乐app下载地址\组件\验证器\约束作为断言;类媒体{/ /……/ * * *@var字符串的路径——通常存储在数据库* /私人美元路径;/ /……公共函数getWebPath():字符串{/ /……美元webPath完整图像的URL,用于模板返回美元webPath;}}
表单类型扩展类需要做两件事来扩展文件类型::类
表单类型:
- 覆盖
configureOptions ()
方法,所以任何文件类型
字段可以有一个image_property
选择;
- 覆盖
buildView ()
方法将图像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
/ / src /形式/扩展/ ImageTypeExtension.php名称空间应用程序\形式\扩展;使用欧宝娱乐app下载地址\组件\形式\AbstractTypeExtension;使用欧宝娱乐app下载地址\组件\形式\扩展\核心\类型\文件类型;使用欧宝娱乐app下载地址\组件\形式\FormInterface;使用欧宝娱乐app下载地址\组件\形式\FormView;使用欧宝娱乐app下载地址\组件\OptionsResolver\OptionsResolver;使用欧宝娱乐app下载地址\组件\PropertyAccess\PropertyAccess;类ImageTypeExtension扩展AbstractTypeExtension{公共静态函数getExtendedTypes():iterable{/ /返回(FormType::类)来修改(几乎)系统中各个领域返回(文件类型::类);}公共函数configureOptions(OptionsResolver美元解析器):无效{/ /使它合法的文件类型字段image_property选项美元解析器- >setDefined ([“image_property”]);}公共函数buildView(FormView美元视图,FormInterface美元形式数组,美元选项):无效{如果(收取(美元选项(“image_property”))){/ /这是什么类/实体绑定到表单(例如媒体)美元parentData=美元形式- >getParent ()- >getData ();美元imageUrl=零;如果(零= = !美元parentData){美元访问器= PropertyAccess::createPropertyAccessor ();美元imageUrl=美元访问器- >getValue (美元parentData,美元选项(“image_property”]);}/ /设置一个“image_url”变量,可以在呈现美元视图- >var (“image_url”]=美元imageUrl;}}}
表单片段命名规则。
在您的扩展类,您添加了一个新的变量(image_url
),但是你仍然需要利用这一新的变量在你的模板。具体地说,您需要覆盖file_widget
布洛克:
1 2 3 4 5 6 7 8 9
{/形式/ fields.html #模板。树枝#}{%扩展“form_div_layout.html。嫩枝' %}{%块file_widget %}{{块(“form_widget”)}}{%如果image_url不是零%}<imgsrc=”{{资产(image_url)}}”/ >{%endif%}{%endblock%}
一定要配置这个主题模板形式这样的形式系统。
表单类型引用)。例如,几个表单类型继承TextType
表单类型(如EmailType
,SearchType
,UrlType
等)。一种类型的扩展应用TextType
(即,getExtendedType ()
方法返回TextType::类
)将适用于所有这些形式类型。
以同样的方式,因为大多数在Symfony的继承形式类型本地可用欧宝娱乐app下载地址FormType
形式类型,一种类型的扩展应用FormType
将适用于所有这些(值得注意的例外是吗ButtonType
表单类型)。还请记住,如果你创建(或使用)一个自定义形式类型,它是可能的不扩展FormType
,所以您的表单类型扩展可能无法适用于它。
另一个选择是返回多个表单类型getExtendedTypes ()
方法延长所有人:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ / src /形式/扩展/ DateTimeExtension.php名称空间应用程序\形式\扩展;/ /……使用欧宝娱乐app下载地址\组件\形式\扩展\核心\类型\DateTimeType;使用欧宝娱乐app下载地址\组件\形式\扩展\核心\类型\DateType;使用欧宝娱乐app下载地址\组件\形式\扩展\核心\类型\TimeType;类DateTimeExtension扩展AbstractTypeExtension{/ /……公共静态函数getExtendedTypes():iterable{返回[DateTimeType::类,DateType::类,TimeType::类);}}
文件类型
字段类型);媒体
实体,每个媒体文件相关联。你的媒体
表单使用文件类型,但在编辑实体时,你希望看到它的图像自动呈现文件输入。AbstractTypeExtension(你可以实现FormTypeExtensionInterface相反,如果你喜欢):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ / src /形式/扩展/ ImageTypeExtension.php名称空间应用程序\形式\扩展;使用欧宝娱乐app下载地址\组件\形式\AbstractTypeExtension;使用欧宝娱乐app下载地址\组件\形式\扩展\核心\类型\文件类型;类ImageTypeExtension扩展AbstractTypeExtension{/ * * *扩展类型的返回一个数组。* /公共静态函数getExtendedTypes():iterable{/ /返回(FormType::类)来修改(几乎)系统中各个领域返回(文件类型::类);}}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ / src /形式/扩展/ ImageTypeExtension.php名称空间应用程序\形式\扩展;使用欧宝娱乐app下载地址\组件\形式\AbstractTypeExtension;使用欧宝娱乐app下载地址\组件\形式\扩展\核心\类型\文件类型;类ImageTypeExtension扩展AbstractTypeExtension{/ * * *扩展类型的返回一个数组。* /公共静态函数getExtendedTypes():iterable{/ /返回(FormType::类)来修改(几乎)系统中各个领域返回(文件类型::类);}}
唯一的方法必须实现是getExtendedTypes ()
用于配置哪一个您想修改字段类型。
根据您的用例中,您可能需要重写一些以下的方法:
buildForm ()
buildView ()
configureOptions ()
finishView ()
关于这些方法做的更多信息,请参阅自定义表单字段类型篇文章。
注册为服务和标记与form.type_extension
标签。如果你使用默认的服务。yaml的配置,这已经为你做好了,谢谢自动配置。
提示
有一个可选的标记属性优先级
,默认为0
和控制的顺序加载表单类型扩展(优先级越高,越早一个扩展加载)。这是有用的,当你需要保证一个扩展加载之前或之后的另一个扩展。使用这个属性时,您需要显式地添加服务配置。
提示
有一个可选的标记属性优先级
,默认为0
和控制的顺序加载表单类型扩展(优先级越高,越早一个扩展加载)。这是有用的,当你需要保证一个扩展加载之前或之后的另一个扩展。使用这个属性时,您需要显式地添加服务配置。
一旦注册扩展,任何方法你覆盖(如。buildForm ()
)时将调用任何给定类型的字段(文件类型
)建立。
提示
运行以下命令来验证表单类型扩展成功注册的应用程序:
1
美元php bin /控制台调试:形式
如何处理文件上传与教义:你有一个媒体模式与路径属性,对应数据库中的图像路径:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日
/ / src /实体/ Media.php名称空间应用程序\实体;使用欧宝娱乐app下载地址\组件\验证器\约束作为断言;类媒体{/ /……/ * * *@var字符串的路径——通常存储在数据库* /私人美元路径;/ /……公共函数getWebPath():字符串{/ /……美元webPath完整图像的URL,用于模板返回美元webPath;}}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日
/ / src /实体/ Media.php名称空间应用程序\实体;使用欧宝娱乐app下载地址\组件\验证器\约束作为断言;类媒体{/ /……/ * * *@var字符串的路径——通常存储在数据库* /私人美元路径;/ /……公共函数getWebPath():字符串{/ /……美元webPath完整图像的URL,用于模板返回美元webPath;}}
表单类型扩展类需要做两件事来扩展文件类型::类
表单类型:
- 覆盖
configureOptions ()
方法,所以任何文件类型
字段可以有一个image_property
选择; - 覆盖
buildView ()
方法将图像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
/ / src /形式/扩展/ ImageTypeExtension.php名称空间应用程序\形式\扩展;使用欧宝娱乐app下载地址\组件\形式\AbstractTypeExtension;使用欧宝娱乐app下载地址\组件\形式\扩展\核心\类型\文件类型;使用欧宝娱乐app下载地址\组件\形式\FormInterface;使用欧宝娱乐app下载地址\组件\形式\FormView;使用欧宝娱乐app下载地址\组件\OptionsResolver\OptionsResolver;使用欧宝娱乐app下载地址\组件\PropertyAccess\PropertyAccess;类ImageTypeExtension扩展AbstractTypeExtension{公共静态函数getExtendedTypes():iterable{/ /返回(FormType::类)来修改(几乎)系统中各个领域返回(文件类型::类);}公共函数configureOptions(OptionsResolver美元解析器):无效{/ /使它合法的文件类型字段image_property选项美元解析器- >setDefined ([“image_property”]);}公共函数buildView(FormView美元视图,FormInterface美元形式数组,美元选项):无效{如果(收取(美元选项(“image_property”))){/ /这是什么类/实体绑定到表单(例如媒体)美元parentData=美元形式- >getParent ()- >getData ();美元imageUrl=零;如果(零= = !美元parentData){美元访问器= PropertyAccess::createPropertyAccessor ();美元imageUrl=美元访问器- >getValue (美元parentData,美元选项(“image_property”]);}/ /设置一个“image_url”变量,可以在呈现美元视图- >var (“image_url”]=美元imageUrl;}}}
表单片段命名规则。
在您的扩展类,您添加了一个新的变量(image_url
),但是你仍然需要利用这一新的变量在你的模板。具体地说,您需要覆盖file_widget
布洛克:
1 2 3 4 5 6 7 8 9
{/形式/ fields.html #模板。树枝#}{%扩展“form_div_layout.html。嫩枝' %}{%块file_widget %}{{块(“form_widget”)}}{%如果image_url不是零%}<imgsrc=”{{资产(image_url)}}”/ >{%endif%}{%endblock%}
一定要配置这个主题模板形式这样的形式系统。
表单类型引用)。例如,几个表单类型继承TextType
表单类型(如EmailType
,SearchType
,UrlType
等)。一种类型的扩展应用TextType
(即,getExtendedType ()
方法返回TextType::类
)将适用于所有这些形式类型。
以同样的方式,因为大多数在Symfony的继承形式类型本地可用欧宝娱乐app下载地址FormType
形式类型,一种类型的扩展应用FormType
将适用于所有这些(值得注意的例外是吗ButtonType
表单类型)。还请记住,如果你创建(或使用)一个自定义形式类型,它是可能的不扩展FormType
,所以您的表单类型扩展可能无法适用于它。
另一个选择是返回多个表单类型getExtendedTypes ()
方法延长所有人:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ / src /形式/扩展/ DateTimeExtension.php名称空间应用程序\形式\扩展;/ /……使用欧宝娱乐app下载地址\组件\形式\扩展\核心\类型\DateTimeType;使用欧宝娱乐app下载地址\组件\形式\扩展\核心\类型\DateType;使用欧宝娱乐app下载地址\组件\形式\扩展\核心\类型\TimeType;类DateTimeExtension扩展AbstractTypeExtension{/ /……公共静态函数getExtendedTypes():iterable{返回[DateTimeType::类,DateType::类,TimeType::类);}}