2016-03-21 18:47
浏览 52

Symfony / TWIG:无法为具有唯一ID的表单设置自定义主题(createNamedBuilder)

I wanted to replace Symfony's default radio button widget with Bootstrap's Radio Button Group. I was trying to achieve that by setting a custom theme for an individual field in Symfony's form created with createNamedBuilder function. I failed, because custom field themes require the ID of the field which is dynamic in my case..

I know that having variables in theme names is impossible in TWIG, but maybe there is an alternative approach that I could use to resolve my issue.


I have a Controller which creates multiple instances of one form type in a loop. The name of the form is dynamically created by concatenating requestform_ and the ID of the form:

public function listAction(Request $request)
    $entityManager = $this->getDoctrine()->getManager();
    $requestForms = $entityManager->getRepository('AppBundle:RequestForm')->findBy(array(), array('id' => 'ASC'));
    $forms = array();   
    foreach ($requestForms as $requestForm) {
        $formBuilder = $this->get('form.factory')->createNamedBuilder('requestform_'.$requestForm->getId(), RequestFormType::class, $requestForm);
        $form = $formBuilder->getForm()->handleRequest($request);
        $forms[] = $form->createView();
    return $this->render('form/index.html.twig', array('forms' => $forms));

buildForm function of the RequestFormType prepares radio button widget and looks like this:

public function buildForm(FormBuilderInterface $builder, array $options)
    $builder->add('status', EntityType::class, array(
        'class' => 'AppBundle:Status',
        'choice_label' => 'name',
        'expanded' => true,
        'multiple' => false

The Controller renders the following template:

{% block content %}
    {% for form in forms %}
        {{ form_start(form) }}
            {{ form_widget(form.status) }}
        {{ form_end(form) }}
    {% endfor %}
{% endblock %}

Which is themed to show Bootstrap's button group selector instead of radio buttons:

{% block _requestform_1_status_widget %}
    <div id={{ form.vars.id }} class="btn-group" data-toggle="buttons">
        {% for status in form.children %}
            <label for={{ status.vars.id }} class="btn btn-primary required custom-button-radio">
                <input type="radio" id={{ status.vars.id }} name={{ status.vars.full_name }} required="required" value={{ status.vars.value }}>
                {{ status.vars.label }}
        {% endfor %}
{% endblock _requestform_1_status_widget %}

As you may have noticed this will work only for requestForm ID 1 and will not work for other ID values due to TWIG not allowing variables in block names, i.e. {% block _requestform_VARIABLE_status_widget %}.

Any help much appreciated! Thanks

1条回答 默认 最新

相关推荐 更多相似问题