gpt4 book ai didi

symfony - 带 Twig 的自定义表单字段模板

转载 作者:行者123 更新时间:2023-12-02 21:14:48 25 4
gpt4 key购买 nike

我想在 twig 中创建一个自定义模板来呈现表单字段。

示例:

{{ form_row(form.field) }}

这可以通过表单主题覆盖

{% block form_row %}
... custom code
{% endblock form_row %}

我想做的是:

{% block custom_row %}
... custom code
{% endblock custom_row %}

并像这样使用它:

{{ custom_row(form.field }}

但是,这会引发找不到方法 custom_row 的异常。

我的理解是这可以通过 Twig 扩展来完成,但我不知道如何将 block 注册为函数。

更新

我真正想要的:

我使用 twitter bootstrap 和一个覆盖所有表单主题的包。并且它在 radio 周围呈现一个 div,因此它无法内联。所以我想做这样的事情:

复制他们的模板并删除 div:

{% block inline_radio_row %}
{% spaceless %}
{% set col_size = col_size|default(bootstrap_get_col_size()) %}

{% if attr.label_col is defined and attr.label_col is not empty %}
{% set label_col = attr.label_col %}
{% endif %}
{% if attr.widget_col is defined and attr.widget_col is not empty %}
{% set widget_col = attr.widget_col %}
{% endif %}
{% if attr.col_size is defined and attr.col_size is not empty %}
{% set col_size = attr.col_size %}
{% endif %}

{% if label is not sameas(false) %}
{% if not compound %}
{% set label_attr = label_attr|merge({'for': id}) %}
{% endif %}
{% if required %}
{% set label_attr = label_attr|merge({'class': (label_attr.class|default('') ~ ' required')|trim}) %}
{% endif %}
{% if label is empty %}
{% set label = name|humanize %}
{% endif %}
{% set label_attr = label_attr|merge({'class': (label_attr.class|default('') ~ ' radio-inline')|trim}) %}
<label{% for attrname, attrvalue in label_attr %} {{ attrname }}="{{ attrvalue }}"{% endfor %}>
{{ block('radio_widget') }}
{{ label|trans({}, translation_domain) }}
</label>
{% else %}
{{ block('radio_widget') }}
{% endif %}
{{ form_errors(form) }}
{% endspaceless %}
{% endblock inline_radio_row %}

然后

{{ inline_radio_row(form.field) }}

我最终只是覆盖了整个主题,并在有问题的 div 周围添加了 if,类(radio-inline)。但我仍然想知道是否有办法让这项工作发挥作用。看起来它让你为如此简单的事情付出如此大的努力。

更新2

我发现了这个功能:

class FormExtension extends \Twig_Extension
{
public function getFunctions()
{
return array(
'inline_radio_row' => new \Twig_Function_Node(
'Symfony\Bridge\Twig\Node\SearchAndRenderBlockNode',
array('is_safe' => array('html'))
),
);
}
}

这正是我想要的,但它说它已被弃用。有人知道如何使用它的更新版本吗?

更新3

类似的功能也可以通过http://twig.sensiolabs.org/doc/tags/include.html来实现。

最佳答案

您可以对表单行的每个部分使用 twig 函数:

例如:

<div class="form_row">
{{ form_label(form.field) }} {# the name of the field #}
{{ form_errors(form.field) }} {# the field #}
{{ form_widget(form.field) }} {# the errors associated to the field #}
</div>

关于symfony - 带 Twig 的自定义表单字段模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20584142/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com