如何创建一个表单类型扩展 编辑本页 警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 2.1,现已不再维护。 读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。 自定义表单字段类型当你需要具有特定目的的字段类型时,例如性别选择器或VAT编号输入,它们非常有用。 但是有时候,你真的不需要添加新的字段类型——你想要在现有类型的基础上添加特性。这就是表单类型扩展的用武之地。 表单类型扩展有2个主要用例: 你要加上a几种类型的通用特性(例如在每个字段类型中添加“帮助”文本); 你要加上a单个类型的特定特性(例如在“file”字段类型中添加“download”功能)。 在这两种情况下,都可以使用自定义表单呈现或自定义表单字段类型来实现您的目标。但是使用表单类型扩展可以更简洁(通过限制模板中的业务逻辑数量)和更灵活(可以向单个表单类型添加多个类型扩展)。 表单类型扩展可以实现自定义字段类型所能实现的大部分功能,但它并不是字段类型本身,它们插入到现有类型中. 假设你管理着一个媒体实体,并且每个媒体都关联到一个文件。你的媒体Form使用文件类型,但是在编辑实体时,您希望看到它的图像自动呈现在文件输入旁边。 当然,您可以通过自定义该字段在模板中的呈现方式来实现这一点。但是字段类型扩展允许你以一种很好的DRY方式做到这一点。 ImageTypeExtension.按照标准,表单扩展通常存在于形式\扩展其中一个包的目录。 创建表单类型扩展时,可以实现FormTypeExtensionInterface接口或扩展AbstractTypeExtension类。在大多数情况下,扩展抽象类更容易: 12 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{/** *返回被扩展类型的名称。* *@returnstring被扩展类型的名称*/公共函数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”,数组(“别名”= >“文件”)); 的别名标签的Key是应该应用此扩展的字段类型。在您的情况下,当您想扩展文件字段类型,您将使用文件作为别名。 如何处理文件上传与原则:你有一个Media模型,它有一个file属性(对应表单中的file字段)和一个path属性(对应数据库中的图像路径): 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 / / 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,以便在视图中显示它: 12 34 56 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娱乐下载\组件\形式\跑龙套\PropertyPath;使用ob娱乐下载\组件\OptionsResolver\OptionsResolverInterface;类ImageTypeExtension扩展AbstractTypeExtension{/** *返回被扩展类型的名称。* *@returnstring被扩展类型的名称*/公共函数getExtendedType(){返回“文件”;}/** *添加image_path选项**@param选项sresolverinterface $resolver */公共函数setDefaultOptions(OptionsResolverInterface$解析器){$解析器->setOptional (数组(“image_path”));}/** *将图像url传递给视图**@paramFormView $view *@paramFormInterface $form *@param数组$options */公共函数buildView(FormView$视图, FormInterface$形式数组,$选项){如果(array_key_exists (“image_path”,$选项)) {$parentData=$形式->getParent ()->getData ();如果(零= = !$parentData) {$propertyPath=新PropertyPath ($选项[“image_path”]);$imageUrl=$propertyPath->getValue ($parentData);}其他的{$imageUrl=零;}//设置一个“image_url”变量,在呈现这个字段时可用$视图->var (“image_url”] =$imageUrl;}}} 如何自定义表单渲染篇文章。 在扩展类中,您已经添加了一个新变量(image_url),但您仍然需要在模板中利用这个新变量。具体来说,您需要重写file_widget布洛克: 嫩枝 PHP 12 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不是null %}<imgsrc="{{asset(image_url)}}"/>{%endif%}{%endspaceless%}{%endblock%} 1 2 3 4 5 <!--src/Acme/DemoBundle/Resources/views/Form/file_widget.html.php --><?php回声$视图[“形式”]->小部件($形式)? ><?php如果(零= = !$image_url):? ><imgsrc=“< ?php echo $view['assets']->getUrl($image_url) ?>"/><?phpendif? > 请注意 您需要更改配置文件或显式指定表单的主题,以便Symfony使用您的覆盖块。ob娱乐下载看到如何自定义表单渲染获取更多信息。 文件在表单中,可以指定image_path选项,用于在文件字段旁边显示图像。例如: 12 3 4 5 6 7 8 9 10 11 12 13 14 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(){返回“媒体”;}} 在显示表单时,如果底层模型已经与图像关联,您将看到它显示在文件输入旁边。 此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。