如何创建一个表单类型扩展 编辑该页面 警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.4,不再维护。 读这个页面的更新版本Symfob娱乐下载ony 6.3(当前的稳定版本)。 自定义表单字段类型是伟大的,当你需要字段类型与一个特定的目的,如性别选择器,或增值税号码输入。 但有时,你真的不需要添加新的字段类型——你想添加特性上现有的类型。这就是表单类型扩展进来。 表单类型扩展主要有两个用例: 你想添加一个通用特性来几种类型(如添加一个“帮助”文本每一个字段类型); 你想添加一个特定的功能单一类型(如添加一个“下载”功能的“文件”字段类型)。 在这两种情况下,有可能实现你的目标和定制的形式呈现,或自定义表单字段类型。但使用表单类型扩展可以清洁(通过限制的业务逻辑模板)和更灵活(您可以添加一些类型扩展到一个表单类型)。 表单类型扩展可以实现自定义字段类型能做什么,而是自己的字段类型,他们插入现有的类型。 假设你管理媒体实体,每个媒体文件相关联。你的媒体表单使用文件类型,但在编辑实体时,你希望看到它的图像自动呈现文件输入。 当然你可以通过定制这个领域是如何呈现在一个模板。但字段类型扩展允许您在一个干燥的时尚。 ImageTypeExtension在这篇文章)。标准,形成扩展通常生活在形式\扩展你的一个包的目录中。 当创建一个表单类型扩展,你可以实现的FormTypeExtensionInterface接口或扩展AbstractTypeExtension类。在大多数情况下,很容易扩展抽象类: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 / / src / Acme / / ImageTypeExtension.php DemoBundle /形式/扩展名称空间Acme\DemoBundle\形式\扩展;使用ob娱乐下载\组件\形式\AbstractTypeExtension;类ImageTypeExtension扩展AbstractTypeExtension{/ * * *返回类型被扩展的名称。* *@return字符串类型的名称* /扩展公共函数getExtendedType(){返回“文件”;}} 唯一的方法必须实现是getExtendedType函数。它是用来表示表单类型的名称,将延长您的扩展。 提示 你返回的值getExtendedType方法返回的值对应getName方法类你想扩展类型。 除了getExtendedType功能,你可能会想要覆盖下列方法之一: buildForm () buildView () setDefaultOptions () finishView () 对这些方法做的更多信息,你可以参考创建自定义字段类型食谱。 form.type_extension标签: YAML XML PHP 1 2 3 4 5 服务:acme_demo_bundle.image_type_extension:类:Acme \ DemoBundle \ \ \ ImageTypeExtension扩展形式标签:- - - - - -{名称:form.type_extension,别名:文件} 1 2 3 4 5 <服务id=“acme_demo_bundle.image_type_extension”类=“Acme \ DemoBundle \ \ \ ImageTypeExtension延伸”><标签的名字=“form.type_extension”别名=“文件”/ >< /服务> 1 2 3 4 5 6 美元容器- >注册(“acme_demo_bundle.image_type_extension”,“Acme \ DemoBundle \ \ \ ImageTypeExtension延伸的形式)- >addTag (“form.type_extension”,数组(“别名”= >“文件”)); 的别名标签的关键字段的类型应该应用于这个扩展。在你的情况下,您想要扩展文件字段类型,您将使用文件作为一个别名。 如何处理文件上传与教义:你有一个媒体模型文件属性(对应文件字段的形式)和一个路径属性(对应于数据库中的图像路径): 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 / / src / Acme / / Media.php DemoBundle /实体名称空间Acme\DemoBundle\实体;使用ob娱乐下载\组件\验证器\约束作为断言;类媒体{/ /……/ * * *@var字符串的路径——通常存储在数据库* /私人美元路径;/ * * *@var\ob娱乐下载 \ HttpFoundation \ \ Symfony \组件文件UploadedFile *@Assert\文件(最大容量=“2 m”) * /公共美元文件;/ /……/ * * * * *得到图像的URL@return空字符串| * /公共函数getWebPath(){/ /……美元webPath完整图像的URL,用于模板返回美元webPath;}} 表单类型扩展类需要做两件事来扩展文件表单类型: 覆盖setDefaultOptions为了添加一个方法image_path选择; 覆盖buildForm和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 / Acme / / ImageTypeExtension.php DemoBundle /形式/扩展名称空间Acme\DemoBundle\形式\扩展;使用ob娱乐下载\组件\形式\AbstractTypeExtension;使用ob娱乐下载\组件\形式\FormView;使用ob娱乐下载\组件\形式\FormInterface;使用ob娱乐下载\组件\PropertyAccess\PropertyAccess;使用ob娱乐下载\组件\OptionsResolver\OptionsResolverInterface;类ImageTypeExtension扩展AbstractTypeExtension{/ * * *返回类型被扩展的名称。* *@return字符串类型的名称* /扩展公共函数getExtendedType(){返回“文件”;}/ * * * * *添加image_path选项@paramOptionsResolverInterface解析器* /美元公共函数setDefaultOptions(OptionsResolverInterface美元解析器){美元解析器- >setOptional (数组(“image_path”));}/ * * * * *图像URL传递给视图@paramFormView $观点*@paramFormInterface美元形式*@param数组* /美元选项公共函数buildView(FormView美元视图,FormInterface美元形式数组,美元选项){如果(array_key_exists (“image_path”,美元选项)){美元parentData=美元形式- >getParent ()- >getData ();如果(零= = !美元parentData){美元访问器= PropertyAccess::createPropertyAccessor ();美元imageUrl=美元访问器- >getValue (美元parentData,美元选项(“image_path”]);}其他的{美元imageUrl=零;}/ /设置一个“image_url”变量,可以在呈现美元视图- >var (“image_url”]=美元imageUrl;}}} 如何自定义形式呈现篇文章。 在您的扩展类,添加了一个新的变量(image_url),但是你仍然需要利用这一新的变量在你的模板。具体地说,您需要覆盖file_widget布洛克: 嫩枝 PHP 1 2 3 4 5 6 7 8 9 10 11 12 13 {# src / Acme / DemoBundle /资源/视图/形式/ fields.html。树枝#}{%扩展“form_div_layout.html。嫩枝' %}{%块file_widget %}{%没有余地的%}{{块(“form_widget”)}}{%如果image_url不是零%}<imgsrc=”{{资产(image_url)}}”/ >{%endif%}{%endspaceless%}{%endblock%} 1 2 3 4 5 < !- - - - - -- - - - - -src/Acme/DemoBundle/Resources/views/Form/file_widget.html.php -->< /span>< ? php回声美元视图(“形式”]- >小部件(美元形式)? >< ? php如果(零= = !美元image_url):? ><imgsrc=“< ?php echo $视图(“资产”)- > getUrl (image_url美元)? > "/ >< ? phpendif? > 请注意 你需要改变你的配置文件或显式地指定您想要如何形成主题为了Symfony使用覆盖块。ob娱乐下载看到如何自定义形式呈现为更多的信息。 文件在表单中,您可以指定一个image_path选项,将用于旁边显示一个图像文件。例如: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 / / src / Acme / DemoBundle /形式/类型/ MediaType.php名称空间Acme\DemoBundle\形式\类型;使用ob娱乐下载\组件\形式\AbstractType;使用ob娱乐下载\组件\形式\FormBuilderInterface;类MediaType扩展AbstractType{公共函数buildForm(FormBuilderInterface美元构建器数组,美元选项){美元构建器- >add (“名字”,“文本”)- >add (“文件”,“文件”,数组(“image_path”= >“webPath”));}公共函数getName(){返回“媒体”;}} 当显示表单时,如果底层模型已经与一个图像,你会看到它旁边显示的文件输入。 这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。