2013-08-09 3 views
3

В настоящее время я пытаюсь переопределить рендеринг блоков по умолчанию в Symfony 2, но я не могу достичь желаемого результата.Как переопределить флажок в шаблоне формы Twig формы Symfony

Я создал объект «Доктрина», называемый «Категории», и все представления были правильно созданы.

Но метки меток по умолчанию в форме Twig не находятся в правильном положении.

PS .: Я удалил атрибуты из элементов здесь, чтобы сделать их более чистыми для чтения.

Как:

<label>Field</label> 
<input type="checkbox" /> 

Должно быть:

<label><input type="checkbox" />Field</label> 

Я создал шаблон для подмены самого блока:

{% block checkbox_widget %} 
{% spaceless %} 
<label for="{{ id }}"> 
<input type="checkbox" {{ block('widget_attributes') }}{% if value is defined %} value="{{ value }}"{% endif %}{% if checked %} checked="checked"{% endif %} /> 
{{ label|trans({}, translation_domain) }}</label> 
{% endspaceless %} 
{% endblock checkbox_widget %} 

И назвал его в моем редактировать .html.twig:

{% extends '::base.html.twig' %} 
{% form_theme edit_form 'AppGallerySiteBundle:Form:fields.html.twig' %} 

Внутри формы я поместил строки:

{{ form_errors(edit_form) }} 
{{ form_row(edit_form) }} 
{{ form_widget(edit_form) }} 
{{ form_rest(edit_form) }} 

Это работает и Флажки перекрытые, но продолжает отображается обычный ярлык из шаблона формы веточки по умолчанию и моя перекрытая флажок не отображается ярлык внутри него в результате:

<label>Field</label> 
<label><input type="checkbox" /></label> 

Где он должен быть:

<label><input type="checkbox" />Field</label> 

Надеюсь, кто-то может помочь. Спасибо заранее.

+0

У меня точно такая же проблема. Вы нашли решение? Благодаря! – Acyra

ответ

3

Вы должны отключить метку рендеринга для флажков. Таким образом, вы должны переопределить блок form_label так:

{% block form_label %} 
{% if 'checkbox' not in block_prefixes %} 
    {{ parent() }} 
{% endif %} 
{% endblock form_label %} 
+0

ваш ответ помог мне разобраться с частью проблемы, и теперь я могу удалить сам ярлык, однако «{{label | trans ({}, translation_domain)}}" возвращает null. –

+0

Использование родителя внутри form_label является незаконным, поскольку form_label не имеет родителя. –

0

Тот же вопрос был преследующих наш проект.

Отдельное поле Entity типа PHP Array (поэтому ORM хранит его в ячейке записи базы данных в виде строки JSON, прозрачно автоматически декодирует и кодирует его) должен разбивать список логических предпочтений для пользователя, каждый отображается как флажок.

Так в EntityType.php, внутри

public function buildForm(FormBuilderInterface $builder, array $options) 

$builder 
->add('prefs','collection', 

Затем в главном шаблоне веточку, а {{ form(form) }} это итерация по рядам:

{% for j,child in form %} 
    <div id="form-child-{{ j }}" title="form-child-{{ j }}; loop={{loop.index}}"> 
     {{ form_row(child) }} 
    </div> 
{% endfor %}  

Хотя это не может быть необходимым здесь ,

Выше в этом файле, я переопределить визуализацию формы с темой:

{% form_theme form 'SystemExtMainBundle:Blocks:checkbox.html.twig' %} 

, который содержит:

{% block form_row %} 
     {% if form.vars.block_prefixes.1 == 'checkbox' %} 
<div class="col-xs-12 checkbox-margins checkbox-label-padding"> 
    <div class="errors-container"> 
    {{ form_errors(form)}} 
    </div> 
    {{ form_widget(form,{'attr': {'class': ' form-checkbox-widget'}}) }}{{ form_label(form) }} 


</div> 


     {% elseif form.vars.block_prefixes.1 == 'choice' %} 
<div class="col-xs-12 top-form-title"> 
         {{ form_label(form) }} 
</div> 
<div class="col-xs-12 select-margins"> 
    <div class="errors-container"> 
    {{ form_errors(form)}} 
    </div> 
        {{ form_widget(form,{'attr': {'class': 'select-style form-control'}}) }} 

</div> 
     {% elseif form.vars.block_prefixes.1 == 'submit'%} 
     {{ form_widget(form,{'attr': {'class': 'top-form-button form-control pull-rigth'}}) }} 
     {% elseif form.vars.block_prefixes.1 == 'text'%} 

<div class="col-xs-12 top-form-title"> 
         {{ form_label(form) }} 
</div> 
<div class="col-xs-12 "> 
    <div class="errors-container"> 
    {{ form_errors(form)}} 
    </div> 

{% набор атр = атр | слияния ({ 'класса ': (attr.class | default (' ') ~' form-control top-form-input ') | trim})%} {{form_widget (form, {' attr ': attr})}

</div> 
{% else %} 

<div class="col-xs-12 top-form-title "> 
         {{ form_label(form) }} 
</div> 
<div class="col-xs-12 "> 
    <div class="errors-container"> 
    {{ form_errors(form)}} 
    </div> 
         {{ form_widget(form) }} 
</div> 
     {% endif %} 


{% endblock form_row %} 

Существенной частью была строка № 7 выше: {{ form_widget(form,{'attr': {'class': ' form-checkbox-widget'}}) }}{{ form_label(form) }} для флажков, которая меняет порядок виджета и метки на то, что я хотел (сначала поставить интерактивный флажок перед его текстовой меткой).

2

Для того, чтобы исправить порядок ввода и этикетки, вы можете переопределить form_row блок:

{% block form_row %} 
    {% spaceless %} 
    {% if 'checkbox' in block_prefixes %} 
     {{ form_widget(form) }} 
     {{ form_label(form) }} 
    {% else %} 
     {{ form_label(form) }} 
     {{ form_widget(form) }} 
    {% endif %} 
    {{ form_errors(form) }} 
    {% endspaceless %} 
{% endblock form_row %} 
Смежные вопросы