如何创建一个表单类型扩展
编辑本页
你要加上a单个表单类型的特定特性(例如添加“下载”功能文件类型
字段类型);
你要加上a几种类型的通用特性(比如在每个类似“输入文本”的类型中添加“帮助”文本)。
想象你有一个媒体
实体,并且每个媒体都关联到一个文件。你的媒体
Form使用文件类型,但是在编辑实体时,您希望看到它的图像自动呈现在文件输入旁边。
AbstractTypeExtension(您可以实现FormTypeExtensionInterface如果你愿意的话):
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ / src /形式/扩展/ ImageTypeExtension.php名称空间应用程序\形式\扩展;使用ob娱乐下载\组件\形式\AbstractTypeExtension;使用ob娱乐下载\组件\形式\扩展\核心\类型\文件类型;类ImageTypeExtension扩展AbstractTypeExtension{/** *返回扩展类型数组* /公共静态函数getExtendedTypes():可迭代的{//返回[FormType::class]来修改(几乎)系统中的每个字段返回(文件类型::类);}}
你唯一的方法必须实现是getExtendedTypes ()
,用于配置哪一个要修改的字段类型。
根据你的用例,你可能需要重写下面的一些方法:
buildForm ()
buildView ()
configureOptions ()
finishView ()
有关这些方法的详细信息,请参见自定义表单字段类型篇文章。
注册为服务而且标记与form.type_extension
标签。如果你在用默认的服务。yaml的配置,这已经为你做了,感谢自动配置.
提示
有一个可选的标记属性称为优先级
,默认为0
并控制加载表单类型扩展的顺序(优先级越高,加载扩展越早)。当您需要保证一个扩展在另一个扩展之前或之后加载时,这很有用。使用此属性需要显式地添加服务配置。
一旦扩展被注册,你所覆盖的任何方法(例如。buildForm ()
)将在任何时候被调用任何指定类型的字段(文件类型
)。
提示
运行以下命令验证表单类型扩展是否成功注册到应用程序中:
1
$PHP bin/控制台调试:表单
如何处理文件上传与原则:你有一个带有path属性的Media模型,对应于数据库中的图像路径:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/ / src /实体/ Media.php名称空间应用程序\实体;使用ob娱乐下载\组件\验证器\约束作为断言;类媒体{/ /……/ * * *@var路径-通常存储在数据库*/私人$路径;/ /……公共函数getWebPath():字符串{/ /……$webPath是完整的图像URL,用于模板返回$webPath;}}
的表单类型扩展类需要做两件事文件类型::类
表单类型:
- 覆盖
configureOptions ()
方法,以便任何文件类型
场可以有一个image_property
选择;
- 覆盖
buildView ()
方法将图像URL传递给视图。
例如:
12 34 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名称空间应用程序\形式\扩展;使用ob娱乐下载\组件\形式\AbstractTypeExtension;使用ob娱乐下载\组件\形式\扩展\核心\类型\文件类型;使用ob娱乐下载\组件\形式\FormInterface;使用ob娱乐下载\组件\形式\FormView;使用ob娱乐下载\组件\OptionsResolver\OptionsResolver;使用ob娱乐下载\组件\PropertyAccess\PropertyAccess;类ImageTypeExtension扩展AbstractTypeExtension{公共静态函数getExtendedTypes():可迭代的{//返回[FormType::class]来修改(几乎)系统中的每个字段返回(文件类型::类);}公共函数configureOptions(OptionsResolver$解析器):无效{//使FileType字段具有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被定义,Image_url不是null %}<imgsrc="{{asset(image_url)}}"/>{%endif%}{%endblock%}
一定要配置此表单主题模板这样形式系统才能看到它。
表格类型参考).类型继承的一些表单类型TextType
表单类型(如EmailType
,SearchType
,UrlType
等)。应用于的表单类型扩展TextType
(即,getExtendedType ()
方法返回TextType::类
)将适用于所有这些表单类型。
以同样的方式,自从大多数类型继承自ob娱乐下载FormType
表单类型,一种应用于表单类型的扩展FormType
将适用于所有这些(值得注意的例外是ButtonType
表单类型)。还请记住,如果您创建(或正在使用)一个自定义表单类型,这是有可能的不扩展FormType
,因此您的表单类型扩展可能不会应用到它。
方法中返回多个表单类型getExtendedTypes ()
方法来扩展所有对象:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ / src /形式/扩展/ DateTimeExtension.php名称空间应用程序\形式\扩展;/ /……使用ob娱乐下载\组件\形式\扩展\核心\类型\DateTimeType;使用ob娱乐下载\组件\形式\扩展\核心\类型\DateType;使用ob娱乐下载\组件\形式\扩展\核心\类型\TimeType;类DateTimeExtension扩展AbstractTypeExtension{/ /……公共静态函数getExtendedTypes():可迭代的{返回[DateTimeType::类,DateType::类,TimeType::类);}}
文件类型
字段类型);媒体
实体,并且每个媒体都关联到一个文件。你的媒体
Form使用文件类型,但是在编辑实体时,您希望看到它的图像自动呈现在文件输入旁边。AbstractTypeExtension(您可以实现FormTypeExtensionInterface如果你愿意的话):
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ / src /形式/扩展/ ImageTypeExtension.php名称空间应用程序\形式\扩展;使用ob娱乐下载\组件\形式\AbstractTypeExtension;使用ob娱乐下载\组件\形式\扩展\核心\类型\文件类型;类ImageTypeExtension扩展AbstractTypeExtension{/** *返回扩展类型数组* /公共静态函数getExtendedTypes():可迭代的{//返回[FormType::class]来修改(几乎)系统中的每个字段返回(文件类型::类);}}
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ / src /形式/扩展/ ImageTypeExtension.php名称空间应用程序\形式\扩展;使用ob娱乐下载\组件\形式\AbstractTypeExtension;使用ob娱乐下载\组件\形式\扩展\核心\类型\文件类型;类ImageTypeExtension扩展AbstractTypeExtension{/** *返回扩展类型数组* /公共静态函数getExtendedTypes():可迭代的{//返回[FormType::class]来修改(几乎)系统中的每个字段返回(文件类型::类);}}
你唯一的方法必须实现是getExtendedTypes ()
,用于配置哪一个要修改的字段类型。
根据你的用例,你可能需要重写下面的一些方法:
buildForm ()
buildView ()
configureOptions ()
finishView ()
有关这些方法的详细信息,请参见自定义表单字段类型篇文章。
注册为服务而且标记与form.type_extension
标签。如果你在用默认的服务。yaml的配置,这已经为你做了,感谢自动配置.
提示
有一个可选的标记属性称为优先级
,默认为0
并控制加载表单类型扩展的顺序(优先级越高,加载扩展越早)。当您需要保证一个扩展在另一个扩展之前或之后加载时,这很有用。使用此属性需要显式地添加服务配置。
提示
有一个可选的标记属性称为优先级
,默认为0
并控制加载表单类型扩展的顺序(优先级越高,加载扩展越早)。当您需要保证一个扩展在另一个扩展之前或之后加载时,这很有用。使用此属性需要显式地添加服务配置。
一旦扩展被注册,你所覆盖的任何方法(例如。buildForm ()
)将在任何时候被调用任何指定类型的字段(文件类型
)。
提示
运行以下命令验证表单类型扩展是否成功注册到应用程序中:
1
$PHP bin/控制台调试:表单
如何处理文件上传与原则:你有一个带有path属性的Media模型,对应于数据库中的图像路径:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/ / src /实体/ Media.php名称空间应用程序\实体;使用ob娱乐下载\组件\验证器\约束作为断言;类媒体{/ /……/ * * *@var路径-通常存储在数据库*/私人$路径;/ /……公共函数getWebPath():字符串{/ /……$webPath是完整的图像URL,用于模板返回$webPath;}}
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/ / src /实体/ Media.php名称空间应用程序\实体;使用ob娱乐下载\组件\验证器\约束作为断言;类媒体{/ /……/ * * *@var路径-通常存储在数据库*/私人$路径;/ /……公共函数getWebPath():字符串{/ /……$webPath是完整的图像URL,用于模板返回$webPath;}}
的表单类型扩展类需要做两件事文件类型::类
表单类型:
- 覆盖
configureOptions ()
方法,以便任何文件类型
场可以有一个image_property
选择; - 覆盖
buildView ()
方法将图像URL传递给视图。
例如:
12 34 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名称空间应用程序\形式\扩展;使用ob娱乐下载\组件\形式\AbstractTypeExtension;使用ob娱乐下载\组件\形式\扩展\核心\类型\文件类型;使用ob娱乐下载\组件\形式\FormInterface;使用ob娱乐下载\组件\形式\FormView;使用ob娱乐下载\组件\OptionsResolver\OptionsResolver;使用ob娱乐下载\组件\PropertyAccess\PropertyAccess;类ImageTypeExtension扩展AbstractTypeExtension{公共静态函数getExtendedTypes():可迭代的{//返回[FormType::class]来修改(几乎)系统中的每个字段返回(文件类型::类);}公共函数configureOptions(OptionsResolver$解析器):无效{//使FileType字段具有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被定义,Image_url不是null %}<imgsrc="{{asset(image_url)}}"/>{%endif%}{%endblock%}
一定要配置此表单主题模板这样形式系统才能看到它。
表格类型参考).类型继承的一些表单类型TextType
表单类型(如EmailType
,SearchType
,UrlType
等)。应用于的表单类型扩展TextType
(即,getExtendedType ()
方法返回TextType::类
)将适用于所有这些表单类型。
以同样的方式,自从大多数类型继承自ob娱乐下载FormType
表单类型,一种应用于表单类型的扩展FormType
将适用于所有这些(值得注意的例外是ButtonType
表单类型)。还请记住,如果您创建(或正在使用)一个自定义表单类型,这是有可能的不扩展FormType
,因此您的表单类型扩展可能不会应用到它。
方法中返回多个表单类型getExtendedTypes ()
方法来扩展所有对象:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ / src /形式/扩展/ DateTimeExtension.php名称空间应用程序\形式\扩展;/ /……使用ob娱乐下载\组件\形式\扩展\核心\类型\DateTimeType;使用ob娱乐下载\组件\形式\扩展\核心\类型\DateType;使用ob娱乐下载\组件\形式\扩展\核心\类型\TimeType;类DateTimeExtension扩展AbstractTypeExtension{/ /……公共静态函数getExtendedTypes():可迭代的{返回[DateTimeType::类,DateType::类,TimeType::类);}}
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。