简体   繁体   中英

Symfony2 twig throws render error on conditionally added form fields

I currently getting an error if I try to render a conditionally added form element in twig. The form element was added (or not) through the form event listener mechanism and should only add the form element if a specific form option is set.

Error

Argument 1 passed to Symfony\\Component\\Form\\FormRenderer::searchAndRenderBlock() must be an instance of Symfony\\Component\\Form\\FormView, null given

Form

<?php
namespace Vendor\ProjectBundle\Form\Type;

// [...]

abstract class AbstractContextualInfoFormType extends AbstractFormType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('user', new UserFormType($this->getTranslator(), $this->getDoctrine()), array('error_bubbling' => true, 'validation_groups' => 'ValidationGroup'));

        $creditcardForm = new CreditcardFormType($this->getTranslator(), $this->getDoctrine());
        $creditcardForm->setProcess($options['process']);
        $creditcardForm->setProvider($options['provider']);
        if (array_key_exists('cvc', $options)) {
            $creditcardForm->setRequireCvc($options['cvc']);
        }

        if (array_key_exists('types', $options)) {
            $creditcardForm->setAllowedCreditcardTypes($options['types']);
        }

        $builder->addEventListener(
            FormEvents::PRE_SET_DATA,
            function (FormEvent $event) use ($options) {
                if (!array_key_exists('disable_creditcard', $options) OR (array_key_exists('disable_creditcard', $options) AND $options['disable_creditcard'] === true)) {
                    $creditcardForm = new CreditcardFormType($this->getTranslator(), $this->getDoctrine());
                    $creditcardForm->setProcess($options['process']);
                    $creditcardForm->setProvider($options['provider']);
                    if (array_key_exists('cvc', $options)) {
                        $creditcardForm->setRequireCvc($options['cvc']);
                    }

                    if (array_key_exists('types', $options)) {
                        $creditcardForm->setAllowedCreditcardTypes($options['types']);
                    }

                    $form = $event->getForm();

                    $form->add('creditcard', $creditcardForm, array('error_bubbling' => true));
                }
            }
        );
    }
}

// [...]

As you can see i try to add the credit card form only if the option disable_creditcard is not set. This all works fine until the moment I try to browse the page where I implemented the form:

Template

{% if not disable_creditcard %}
<div id="detail_creditcard" class="creditcard">
<legend>{{ 'creditcard.content.title'|trans }}</legend>
<div class="alert alert-info">
    <i class="icon-info-sign"></i>
    Bla bla bla text
</div>
    **{{ form_row(form_data.creditcard.owner) }}**
    {{ form_row(form_data.creditcard.number) }}
    {{ form_row(form_data.creditcard.type) }}
    {{ form_row(form_data.creditcard.validity) }}
    {{ form_rest(form_data.creditcard) }}
</div>
{% endif %}

I also tried it with a surrounded conditional-if, but that doesn't work at all... I think twig needs the "not defined" creditcard form element here but cannot find it.

What is the right way for doing this? I would appreciate any help from you. :-)

Thanks!

try this:

{% if form_data.creditcard is defined %}

... your conditional code here

{% endif %}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM