RomMer
RomMer

Reputation: 1089

Symfony crawler can't access twig form

here is my code. I have a twig form

I want to access it using symfony WebTestCase crawler like this, but it doesn't work. I want to use the Download button for testing purposes.

Does someone have a solution ?

<div class="modal-body">
    {{ form(trackImageForm) }}
</div>
<div class="modal-footer">
    <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
    <button type="button" class="btn btn-primary" onclick="$(this).prop('disabled', true);$('form[name={{ trackImageForm.vars.id }}]').submit()">Download</button>
</div>

i tried this

$form = $crawler->selectButton('Download')->form(array(...));

EDIT :

OK i can access to my form

{{ form_start(trackImageForm, {'attr': {'id': 'add_image_form'}}) }}
{{ form(trackImageForm) }}

i gave an id to my form and can n

$form = $crawler->filter('form#add_image_form')->form();

but will I be able to submit the form ?

Upvotes: 2

Views: 293

Answers (1)

Jakub Matczak
Jakub Matczak

Reputation: 15696

As the documentation that you've referred to says:

The selectButton() method can select button tags and submit input tags. It uses several parts of the buttons to find them:

  • The value attribute value;
  • The id or alt attribute value for images;
  • The id or name attribute value for button tags.

There's no button in your code matching these conditions.

You should give it a name or id attribute and use it in you test.

@About your edit:

If it's not a <form>, you cannot submit it. That's pretty obvious. Instead of making the submit with JavaScript, just put these buttons inside form as they should be. Using JS to submit the form in you case makes no sense.

If you don't want to put the submits in you form class (which is correct), you can do that with something like:

{{ form_start(trackImageForm) }} 
    <div class="modal-body">
        {{ form_rest(trackImageForm) }}
    </div>
    <div class="modal-footer">
        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
        <button type="button" class="btn btn-primary" onclick="$(this).prop('disabled', true);$('form[name={{ trackImageForm.vars.id }}]').submit()">Download</button>
    </div>
{{ form_end(trackImageForm) }}
  • form_start prints <form> opening tag
  • form_rest prints all fields that have not been printed yet (which is all in your case)
  • form_end prints closing </form> tag

Upvotes: 3

Related Questions