如何处理形式的主题

编辑该页面

警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 5.3,不再维护。

这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。

如何处理形式的主题

这篇文章解释了如何使用你的应用程序的任何形式的Symfony提供的主题以及如何创建您自己的自定义表单的主题。欧宝娱乐app下载地址

欧宝娱乐app下载地址Symfony内置形式主题

欧宝娱乐app下载地址Symfony提供了几个内置形式主题让表单看起来伟大在使用的一些最受欢迎的CSS框架。每个主题是定义在一个树枝模板中启用twig.form_themes选择:

5.3

bootstrap_5_layout.html.twig,bootstrap_5_horizontal_layout.html.twigtailwind_2_layout.html.twig在Symfony 5.3中引入的。欧宝娱乐app下载地址

运用各种形式的主题

欧宝娱乐app下载地址默认情况下使用Symfony形式form_div_layout.html.twig主题。如果你想使用另一个主题的所有形式的应用程序,配置的twig.form_themes选择:

  • YAML
  • XML
  • PHP
1 2 3 4
#配置/包/ twig.yaml枝:form_themes:(“bootstrap_5_horizontal_layout.html.twig”)#……

可以通过多个主题这个选项,因为有时形式主题只定义几个元素。这样,如果一些主题并不覆盖一些元素,Symfony查找其他的主题。欧宝娱乐app下载地址

订单的主题twig.form_themes选择是很重要的。每个主题将覆盖以前的所有主题,所以你必须把最重要的主题列表的最后。

应用主题单一的形式

虽然大多数时候你会全球应用形式的主题,您可能需要主题只适用于一些特定的形式。你可以做的form_theme树枝标签:

1 2 3 4 5 6
{#这种形式的主题将仅适用于该模板的形式#}{%form_theme“foundation_5_layout.html形式。嫩枝' %}{{form_start(形式)}}{#……#}{{form_end(形式)}}

的第一个参数form_theme标记(形式在这个例子中)是变量的名称,它存储表单视图对象。第二个参数是树枝的路径模板定义了主题。

应用多个主题单一的形式

一种形式也可以定制应用几个主题。要做到这一点,通过路径的所有树枝模板使用数组关键字(它们的顺序是很重要的,因为每个主题覆盖所有之前的):

1 2 3 4 5 6 7
{#应用多种形式的主题,但只有这个模板的形式#}{%form_theme与[' foundation_5_layout.html形式。嫩枝”、“形式/ my_custom_theme.html。嫩枝']%}{#……#}

应用不同的主题儿童形式

你也可以应用一种主题特定的子表单:

1
{%form_theme的形式。/ my_custom_theme.html a_child_form”形式。嫩枝' %}

这是非常有用的,当你想有一个自定义主题的嵌套形式不同于你的主要形式之一。指定你的主题:

1 2
{%form_theme表单的表单/ my_custom_theme.html。嫩枝' %}{%form_theme的形式。/ my_other_theme.html a_child_form”形式。嫩枝' %}

禁用全球主题单一的形式

全球表单应用程序中定义的主题总是应用于所有形式,甚至那些使用form_theme标签应用自己的主题。你可能想要禁用这个例如当创建一个管理界面的包可以安装在不同的Symfony应用程序(所以你不能控制什么主题启用全球)。欧宝娱乐app下载地址为此,添加只有关键字后的列表形式主题:

1 2 3
{%form_theme与[' foundation_5_layout.html形式。嫩枝']只有%}{#……#}

谨慎

当使用只有关键字,没有一个Symfony的内欧宝娱乐app下载地址置形式主题(form_div_layout.html.twig等)将被应用。为了正确渲染表单,您需要提供一个平台形成自己的主题,或扩展的一个内置的主题与树枝的形式使用关键字,而不是扩展重用原来的主题内容。

1 2 3 4
{/形式/ common.html #模板。树枝#}{%使用“form_div_layout.html。树枝“%}{#……#}

创建自己的主题

欧宝娱乐app下载地址Symfony使用树枝块呈现每个表单的一部分——字段标签错误,<输入>文本字段,<选择>标签,等等主题一根树枝模板与一个或多个时要使用的那些块呈现形式。

考虑例如表单字段表示一个整数属性年龄。如果你添加这个模板:

1
{{form_widget (form.age)}}

生成的HTML内容将是这样的(它会有所不同取决于形式主题启用应用程序):

1
<输入类型=“数量”id=“form_age”的名字=“形式[时代]”要求=“要求”价值=“33”/ >

欧宝娱乐app下载地址Symfony使用一块树枝integer_widget来呈现。这是因为字段类型整数你呈现它小部件(相对于它的标签错误帮助)。创建一个表单主题的第一步是知道这枝块覆盖,下一节中解释。

表单片段命名

表单片段的命名不同取决于您的需求:

  • 如果你想定制相同类型的所有字段(例如,所有textarea > <)使用field-type_field-part模式(如。textarea_widget)。<李>如果你想定制只有一个特定的领域(例如,textarea > <用于描述表单的字段,编辑产品)使用_field-id_field-part模式(如。_product_description_widget)。< /ul>

    在这两种情况下,字段部分可以是任何有效的表单字段的部分:

    碎片命名为相同类型的所有字段

    按照这些片段的名字type_part模式,类型对应的字段类型(如被呈现。文本区域,复选框,日期等)和部分对应于什么(如被呈现。标签,小部件等)。

    片段的名字是几个例子:

    • form_row——使用form_row ()呈现大多数字段;<李>textarea_widget——使用form_widget ()呈现一个文本区域字段类型;<李>form_errors——使用form_errors ()为一个字段来呈现错误;< /ul>< /div>

      片段为单个字段命名

      按照这些片段的名字_id_part模式,id对应的字段id属性(如。product_description,user_age等)和部分对应于什么(如被呈现。标签,小部件等)。

      id属性包含表单名和字段名(如。product_price)。表单名称可以设置手动或自动生成基于表单类型名称(如。ProductType相当于产品)。如果你不确定你的表单名称是什么,看看HTML代码形式呈现。您还可以定义这个值显式的block_name选择:

      1 2 3 4 5 6 7 8 9 10 11
      使用欧宝娱乐app下载地址\组件\形式\扩展\核心\类型\TextType;使用欧宝娱乐app下载地址\组件\形式\FormBuilderInterface;公共函数buildForm(FormBuilderInterface美元构建器数组,美元选项):无效{/ /……美元构建器- >add (“名字”,TextType::类,“block_name”= >“custom_name”]);}

      在这个例子中,将片段的名字_product_custom_name_widget而不是默认的_product_name_widget

    自定义片段为单个字段命名

    block_prefix选项允许表单字段定义自己的自定义片段的名字。这是很有用的定制一些相同的实例字段不用创建一个自定义表单类型:

    1 2 3 4 5 6 7 8 9
    使用欧宝娱乐app下载地址\组件\形式\扩展\核心\类型\TextType;使用欧宝娱乐app下载地址\组件\形式\FormBuilderInterface;公共函数buildForm(FormBuilderInterface美元构建器数组,美元选项):无效{美元构建器- >add (“名字”,TextType::类,“block_prefix”= >“wrapped_text”]);}

    现在你可以使用wrapped_text_row,wrapped_text_widget块名称等。

    碎片命名为集合

    当使用一个集合的形式定制的,你可以有好几种方式收集和它的每个条目。首先,使用以下模块自定义集合的每个部分形式:

    1 2 3 4 5
    {%collection_row %}{%endblock%}{%collection_label %}{%endblock%}{%collection_widget %}{%endblock%}{%collection_help %}{%endblock%}{%collection_errors %}{%endblock%}

    您还可以自定义每个条目的集合与以下模块:

    1 2 3 4 5
    {%collection_entry_row %}{%endblock%}{%collection_entry_label %}{%endblock%}{%collection_entry_widget %}{%endblock%}{%collection_entry_help %}{%endblock%}{%collection_entry_errors %}{%endblock%}

    5.1

    collection_entry_ *块在Symfony 5.1中引入的。欧宝娱乐app下载地址

    最后,您可以定制特殊形式集合,而不是全部。例如,考虑下面的复杂的例子TaskManagerType有一个集合TaskListType反过来的集合TaskType:

    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
    TaskManagerType扩展AbstractType{公共函数buildForm(FormBuilderInterface美元构建器数组,美元选项= []):无效{/ /……美元构建器- >add (“taskLists”,CollectionType::类,“entry_type”= > TaskListType::类,“block_name”= >“task_lists”]);}}TaskListType扩展AbstractType{公共函数buildForm(FormBuilderInterface美元构建器数组,美元选项= []):无效{/ /……美元构建器- >add (“任务”,CollectionType::类,“entry_type”= > TaskType::类,]);}}TaskType扩展AbstractType{公共函数buildForm(FormBuilderInterface美元构建器数组,美元选项= []):无效{美元构建器- >add (“名字”);/ /……}}

    然后你得到所有以下(可定制的块*可以更换的,小部件,标签,或帮助):

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
    {%_task_manager_task_lists_ * %}{#收集TaskManager领域#}{%endblock%}{%_task_manager_task_lists_entry_ * %}{#内TaskListType #}{%endblock%}{%_task_manager_task_lists_entry_tasks_ * %}{#收集TaskListType领域#}{%endblock%}{%_task_manager_task_lists_entry_tasks_entry_ * %}{#内TaskType #}{%endblock%}{%_task_manager_task_lists_entry_tasks_entry_name_ * %}{# TaskType领域#}{%endblock%}

    模板片段继承

    每个字段类型都有(如父类型的类型文本区域文本和父类型的文本形式)和Symf欧宝娱乐app下载地址ony的片段使用父类型如果基本片段不存在。

    当Symf欧宝娱乐app下载地址ony呈现例如文本区域的错误类型,它看起来第一的textarea_errors片段之前回下降text_errorsform_errors碎片。

    提示

    “父”类型的每个字段类型是可用的表单类型引用每个字段类型。

创建一个表单主题相同的模板形式

这是建议在做定制特定于单个表单在您的应用程序,如改变所有textarea > <元素的一种形式或定制一个非常特殊的表单字段将处理JavaScript。

你只需要添加特殊的{% form_theme形式_self %}标签相同的模板的形式呈现。这导致树枝看起来在任何覆盖形式的模板:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
{%扩展“base.html.twig”%}{%form_theme形式_self %}{#这将覆盖任何领域的小部件类型的整数,但只有在形式呈现在这个模板#}{%integer_widget %}<div=“…”>{#……呈现的HTML元素来显示这个领域……#}< /div>{%endblock%}{#这覆盖整个行字段的“id”=“product_stock”(和他的“名称”=“产品[股票]”),但只有在形式呈现在这个模板#}{%_product_stock_row %}<div=“…”id=“…”>{#……渲染整个字段内容,包括它的错误……#}< /div>{%endblock%}{#……呈现形式……#}

这种方法的主要缺点是它只能如果模板扩展另一个(“base.html.twig”在前面的例子)。如果你的模板不,你必须点form_theme一个单独的模板,在下一节中解释。

另一个缺点是定制表单模块不能被重用在呈现其他形式在其他模板。如果你需要什么,在一个单独的模板创建一个表单的主题,在下一节中解释。

创建一个主题在一个单独的模板形式

这是建议在创建主题形式在整个应用程序中使用,甚至在不同的Symfony应用程序中重用。欧宝娱乐app下载地址您只需要创建一个树枝模板和遵循表单片段命名知道哪个树枝块定义规则。

例如,如果您的形式主题很简单,你只希望覆盖< input type = "整" >元素,创建这个模板:

1 2 3 4 5 6
{/形式/ my_theme.html #模板。树枝#}{%integer_widget %}{#……添加所有的HTML, CSS和JavaScript需要渲染这一领域#}{%endblock%}

现在你需要告诉Symfony使用这种形式的欧宝娱乐app下载地址主题而不是(或补充)默认主题。正如这篇文章的前面部分中解释的一样,如果你想将全球主题应用于所有形式,定义了twig.form_themes选择:

  • YAML
  • XML
  • PHP
1 2 3 4
#配置/包/ twig.yaml枝:form_themes:['形式/ my_theme.html.twig ']#……

如果你只是想把它应用到一些特定的形式,使用form_theme标签:

1 2 3 4 5
{%form_theme表单的表单/ my_theme.html。嫩枝' %}{{form_start(形式)}}{#……#}{{form_end(形式)}}

重用的部分一个内置的主题形式

创建一个完整的形式主题需要很多工作,因为有太多不同的表单字段类型。而不是定义所有这些树枝块,您可以定义只有你感兴趣的街区,然后配置多种形式的主题在你的应用程序或模板。这个作品,因为当呈现一块没有覆盖在您的自定义主题,Symfony回落到另一个主题。欧宝娱乐app下载地址

另一种解决方案是让表单模板主题扩展内置主题使用的树枝“使用”标签而不是扩展标签你可以继承所有的块(如果你不确定,从默认的扩展form_div_layout.html.twig主题):

1 2 3 4
{/形式/ my_theme.html #模板。树枝#}{%使用“form_div_layout.html。嫩枝' %}{#……只覆盖块你有兴趣#}

最后,您还可以使用树枝父()函数重用内置的主题的原创内容。这是非常有用的,当你想做些小的改变,如包装与某个元素生成的HTML:

1 2 3 4 5 6 7 8
{/形式/ my_theme.html #模板。树枝#}{%使用“form_div_layout.html。嫩枝' %}{%integer_widget %}<div=“some-custom-class”>{{()}}< /div>{%endblock%}

这种技术也可以在定义形式在同一模板,主题呈现形式。然而,进口的块内置主题比较复杂:

1 2 3 4 5 6 7 8 9 10 11 12 13
{%form_theme形式_self %}{#从内置的主题和进口一块重命名它不冲突与同一块中定义该模板#}{%使用“form_div_layout.html。嫩枝' with integer_widget as base_integer_widget %}< /span>{%integer_widget %}<div=“some-custom-class”>{{(“base_integer_widget”)}}< /div>{%endblock%}{#……呈现形式……#}

自定义表单验证错误

如果您定义验证规则为你的对象,你会看到一些验证错误消息时提交的数据是无效的。这些消息的显示form_errors ()函数和可定制form_errors树枝阻止任何形式的主题,在前面的小节解释道。

一个重要的考虑是,某些错误有关整个表单,而不是一个特定的领域。为了区分全球和本地错误,使用的一个变量可以在形式被称为复合。如果它是真正的,这意味着目前所呈现的是字段的集合(例如,整个形式),而不仅仅是一个单独的字段:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
{/形式/ my_theme.html #模板。树枝#}{%form_errors %}{%如果错误|长度> 0%}{%如果复合%}{#……显示全球表单错误#}<ul>{%错误的错误%}<>{{错误。消息}}< />{%endfor%}< /ul>{%其他的%}{#……显示单个字段的错误#}{%endif%}{%endif%}{%endblockform_errors %}
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。
< /article>
欧宝娱乐app下载地址Symfony 5.3支持通过JoliCode