У меня есть следующая форма, где questionaire.Questions - это набор QuestionType, который является просто да / нет <select>.

Вот как выглядит веточка:

Ожидается:

    {{ form_start(questionaire) }}
    {% for question in questionaire.Questions %}
        <div class="question">
            {{ form_label(question) }}
        </div>
        <div>
            {{ form_widget(question) }}
        </div>
    {% endfor %}
    {{ form_end(questionaire) }}

Однако это выглядит так:

        <div class="question">
            //This is where I want the label. But instead I get this:
            <label></label>//Unsure why it's empty. Maybe it's questionaire.Question's label?
        </div>
        <div>
            <label>lorem ipsum...</label> //Wrong place. Label gets rendered here instead.
            <select>...</select> //Selection widget is correctly rendered.
        </div>

Я думаю, что метка отображается вместе с виджетом. Вот мой тип вопроса на всякий случай.

class QuestionType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->addEventListener(FormEvents::POST_SET_DATA, function (FormEvent $event) {
                $question = $event->getData();
                $form = $event->getForm();

                $form->add('Answer', 'choice', array(
                    'label' => $question->getQuestion(),
                    'choices' => array(
                        '' => 'Select One',
                        'Yes',
                        'No'
                        )
                    )
                );
            }
        );
    }
...
}

Как я могу разместить этикетку там, где я хочу?

1
Tek 20 Май 2014 в 17:49

2 ответа

Лучший ответ

Вы должны вызвать form_widget и form_label для типа ответа

{{ form_label(question.Answer) }}
{{ form_widget(question.Answer) }}
3
Vincent Barrault 20 Май 2014 в 14:06

Вам необходимо определить блок question_row в теме формы и использовать {{form (questionaire_form)}} для визуализации всей формы.

Acme / DemoBundle / Form / Type / QuestionType.php

// ...

public function getName(){
    return 'question';
}

// ...

Acme / DemoBundle / Controller / DefaultController.php

// ...

public function questionaireAction(){

    $form = $this->createForm(new BriefQuestionaireType());

    return $this->render('AcmeDemoBundle:Default:brief_questionaire.html.twig', array(
        'questionaire_form' => $form->createView()
    ));

}

// ...

Acme / DemoBundle / Resources / views / Default / short_questionaire.html.twig

<html>
    <head>
        <title>Questionaire</title>
    </head>
    <body>
        {% form_theme questionaire_form 'AcmeDemoBundle:Form:form.html.twig' %}
        {{ form(questionaire_form) }}
    </body>
</html>

Acme / DemoBundle / Resources / views / Form / form.html.twig

Мы создаем блок с именем [block_prefix] _row, где block_prefix является производным от getName () в QuestionType выше. Когда используется эта тема формы, все строки QuestionType отображаются таким образом.

{% block question_row %}
    <div class="question">
        {{ form_label(form) }}
    </div>
    <div>
        {{ form_widget(form) }}
        {{ form_error(form) }}              
    </div>
{% endblock %}
0
Kyoushu 20 Май 2014 в 14:33