Nadjib
Nadjib

Reputation: 361

Customising form labels in Symfony

I have a symfony page where I display a form, and I would like to add an * in the labels of all fields that are required.

So I have my form.php.twig, that looks like this:

{% extends "::layout.php.twig" %}

{% block body %}

    <div class="row">

    {% use 'form_div_layout.html.twig' with form_label as base_form_label %}
    {% block form_label %}
        {{ block('base_form_label') }}

        {% if required %}
            <span class="required" title="This field is required">*</span>
        {% endif %}
    {% endblock %}
    </div>

{% endblock %}

I followed the exact documentation of the symfony cookbook on how to customise labels, which is http://symfony.com/doc/current/cookbook/form/form_customization.html#cookbook-form-theming-methods.

But I keep getting this error

Variable "label" does not exist in form_div_layout.html.twig at line 206

I don't have any label variable in the code of my form.php.twig so I don't see why I get this error. And when I remove the

{{ block('base_form_label') }}

I get

Variable "required" does not exist in ATPlatformBundle:Session:create.php.twig

Can anyone help me on this? I don't see where is my mistake? I am not looking to customise it with css, but to add the * .

I have checked the form_div_layout.html.twig at line 206 and this is what there is

{%- block form_label -%}
    {% 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 -%}
            {%- if label_format is not empty -%}
                {% set label = label_format|replace({
                    '%name%': name,
                    '%id%': id,
                }) %}
            {%- else -%}
                {% set label = name|humanize %}
            {%- endif -%}
        {%- endif -%}
        <label{% for attrname, attrvalue in label_attr %} {{ attrname }}="{{ attrvalue }}"{% endfor %}>{{ translation_domain is sameas(false) ? label : label|trans({}, translation_domain) }}</label>
    {%- endif -%}
{%- endblock form_label -%}

Thank you in advance.

Upvotes: 1

Views: 3777

Answers (3)

Nadjib
Nadjib

Reputation: 361

Ok, so at the end, I didn't manage to change labels within my form.php.twig (which is the template I use to display my form), but I used another technique.

I created a new file named fields.php.twig, which I put in MyBundle/Resources/views/Form.

At the beginning of my fields.php.twig, I then added

{% extends 'form_div_layout.html.twig' %} 

and below it, I added

{% block form_label %}
        {{ parent() }}
        {% if required %}
            <span> * </span>
        {% endif %}
{% endblock form_label %}

Then in my form.php.twig, I added

{% form_theme form 'MyBundle:Form:fields.php.twig' %}
{{ form_start(form) }}

Myform here with {{ form_label(form.property) }}

 {{ form_errors(form.property) }}
 {{ form_widget(form.property) }}

{{ form_end(form) }}

It works perfectly, but I had to create the fields.php.twig.

Upvotes: 1

Abdelaziz Dabebi
Abdelaziz Dabebi

Reputation: 1638

Did you try defining the label from inside your form builder?! The below field is a required one because unless you mention required => false, your field will be rendered as required. Something like:

->add('name', 'text', array('label' => '* name'))

Upvotes: 4

Sylvain Martin
Sylvain Martin

Reputation: 2375

With Twig, you should have to test the existence of a variable before using it:

Variable "required" does not exist

{% if required is defined and ... }

You need to test this because you field isn't always required.

if you want further information, you have this page of the documentation:

http://twig.sensiolabs.org/doc/tests/defined.html

Upvotes: 0

Related Questions