31

我刚开始使用 Twig,我正在尝试构建一个注册表单。要添加密码/重新输入密码字段,我使用“重复”文件类型:

->add('password', 'repeated', array(
    'type' => 'password',
    'invalid_message' => 'Passwords have to be equal.',
    'first_name'      => 'Password',
    'second_name'     => 'Re-enter password',
));

按预期工作。然而,我遇到的问题是我想在我的表单中添加一些自定义类等。所以我的模板看起来像这样:

<form action="{{ path('register') }}" method="post" {{ form_enctype(form) }}>
    {{ form_errors(form) }}
    {{ form_errors(form.username) }}
    <div class="form-field">
        {{ form_label(form.username, null, { 'attr': {'class': 'form-label'} }) }}
        {{ form_widget(form.username, { 'attr': {'class': 'form-input'} }) }}
    </div>
    {{ form_errors(form.email) }}
    <div class="form-field">
        {{ form_label(form.email, null, { 'attr': {'class': 'form-label'} }) }}
        {{ form_widget(form.email, { 'attr': {'class': 'form-input'} }) }}
    </div>
    {{ form_errors(form.password) }}
    <div class="form-field">
        {{ form_label(form.password, null, { 'attr': {'class': 'form-label'} }) }}
        {{ form_widget(form.password, { 'attr': {'class': 'form-input'} }) }}
    </div>

    {{ form_rest(form) }}

    <input type="submit" class="contact-submit" />
</form>

除了密码部分之外,这对所有内容都适用。我想在那里分别渲染两个字段,现在它们都在同一个 div 中渲染。

我该如何解决?有没有办法在 Twig 中选择单独的字段?或者我只是做错了什么,因为我首先遇到了这个问题。

4

5 回答 5

59

经过随机猜测,我解决了自己的问题。我会把它贴在这里,以便其他可能通过搜索找到这个问题的人也知道答案:

{% for passwordField in form.password %}
    <div class="form-field">
        {{ form_label(passwordField, null, { 'attr': {'class': 'form-label'} }) }}
        {{ form_widget(passwordField, { 'attr': {'class': 'form-input'} }) }}
    </div>
{% endfor %}
于 2012-05-20T17:01:16.330 回答
27

如果您想将两个密码字段与树枝模板中的重复方法分开,您只需调用它们各自的名称,例如:

{{ form_label(form.password.pass, "Password :") }}
{{ form_widget(form.password.pass) }}

{{ form_label(form.password.confirm, "Confirm :") }}
{{ form_widget(form.password.confirm) }}

当然在你的功能中:

/..
->add('password', 'repeated', array(
'first_name' => 'pass',
'second_name' => 'confirm',
'type' => 'password'
))

问候。

于 2012-07-18T07:22:55.793 回答
20

这对我有用:

....
{{ form_errors(form.password.first) }}
<div class="form-field">
    {{ form_label(form.password.first, null, { 'attr': {'class': 'form-label'} }) }}
    {{ form_widget(form.password.first, { 'attr': {'class': 'form-input'} }) }}
</div>

{{ form_errors(form.password.second) }}
<div class="form-field">
    {{ form_label(form.password.second, null, { 'attr': {'class': 'form-label'} }) }}
    {{ form_widget(form.password.second, { 'attr': {'class': 'form-input'} }) }}
</div>
....
于 2013-07-06T10:00:19.887 回答
3

如果您使用的是用户包,他们会使用 password.first 和 password.second,最好尝试使用您的分析器来查看哪些变量来自视图和控制器;)

于 2014-04-20T10:47:01.367 回答
0

如果您想为您的标签和输入提供应用程序范围的类,您可以自定义标签和小部件的呈现方式。检查http://symfony.com/doc/current/cookbook/form/form_customization.html

如果您查看此文件:

vendor/symfony/src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig

您可以查看所有小部件的默认设置。为了具体实现您所需要的,您可以覆盖 generic_label 块以添加表单标签类:

{% block generic_label %}
{% spaceless %}
    {% if required %}
        {# We add form-label class in the next line! #}
        {% set attr = attr|merge({'class': attr.class|default('') ~ ' required form-label'}) %}
    {% endif %}
    <label{% for attrname,attrvalue in attr %} {{attrname}}="{{attrvalue}}"{% endfor %}>{{ label|trans }}</label>
{% endspaceless %}
{% endblock %}

和 widget_attributes 块添加表单输入类:

{% block widget_attributes %}
{% spaceless %}
    {# We add form-input class in the next line! #}
    {% set attr = attr|merge({'class': attr.class|default('') ~ ' form-input'}) %}
    id="{{ id }}" name="{{ full_name }}"{% if read_only %} disabled="disabled"{% endif %}{% if required %} required="required"{% endif %}{% if max_length %} maxlength="{{ max_length }}"{% endif %}{% if pattern %} pattern="{{ pattern }}"{% endif %}
    {% for attrname,attrvalue in attr %}{{attrname}}="{{attrvalue}}" {% endfor %}
{% endspaceless %}
{% endblock widget_attributes %}

使用这两个模板,您的所有输入都应该使用您需要的类进行渲染,而不必在整个表单中重复“attr”参数。

我还没有尝试过,但这应该可以解决重复的字段问题。即使没有,您也可以创建一个重复的小部件和/或重复的行模板来自定义重复小部件的呈现方式,从而为所有使用它的表单修复该小部件。

于 2012-05-22T00:54:33.170 回答