[Symfony 2] Rebuild formulaire

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [Symfony 2] Rebuild formulaire

Re: [Symfony 2] Rebuild formulaire

par amel13 » 13 août 2012, 13:36

La ligne que j'ajoute regénère le formulaire avec les nouvelles données (celles qui ont été rendues par mon update) ... le formulaire est donc généré deux fois, mais je suis sure qu'il y a une solution plus propre.

Re: [Symfony 2] Rebuild formulaire

par xTG » 13 août 2012, 12:53

Je vois absolument pas ce que tu règles avec ta ligne de code ajoutée.
Hormi regénérer un cache à la rigueur en y forçant $orders dedans.
Car le comportement de PHP ne peut pas faire appeler $form->createView() avant ton updateOrders().

Bien que ce ne soit qu'une supposition car je ne connais pas ce framework.

[Symfony 2] Rebuild formulaire

par amel13 » 13 août 2012, 11:34

Bonjour à tous,

J'ai un formulaire qui se met à jour une fois qu'on clique sur le bouton valider, il charge un tableau de données appelé $order :
$rateApproval = $this->getRateApprovalManager();
    $orders = $rateApproval->listOrders($this->getUser()->getUsername());
    
    $form = $this->createForm('xmd_rate_collection', $orders);

    if ($this->getRequest()->getMethod() == 'POST') {
    	$form->bindRequest($this->getRequest());
    	
    	if ($form->isValid()) {
    		$data = $form->getClientData();
    		$orders = $rateApproval->updateOrders($data);
    	}
    }
    

    return array(
        'form' => $form->createView()
    );
Le souci c'est que 'form' => $form->createView() charge les données avant la mise à jour, et non après.

Du coup pour que ça marche il faut que je fasse :
$rateApproval = $this->getRateApprovalManager();
    $orders = $rateApproval->listOrders($this->getUser()->getUsername());
    
    $form = $this->createForm('xmd_rate_collection', $orders);

    if ($this->getRequest()->getMethod() == 'POST') {
    	$form->bindRequest($this->getRequest());
    	
    	if ($form->isValid()) {
    		$data = $form->getClientData();
    		$orders = $rateApproval->updateOrders($data);
    		$form = $this->createForm('xmd_rate_collection', $orders);
    	}
    }
    

    return array(
        'form' => $form->createView()
    );
Ce qui n'est pas super propre ...

Voici le twig correspondant :
{% block xmd_rate_collection_row %}

<div {{ block('widget_container_attributes') }}>
{% form_theme form _self %}


{% if form[0].cnu_idn is defined %}
<div id="list-items-0" class="list-items">
<div id="list-items" class="list-items">
<table>
<thead>
<th></th>
<th>
{% if form[0].cnu_idn is defined %}
{{ form[0].cnu_idn.get('label') }}
{% endif %}
</th>
<th>
{% if form[0].ref is defined %}
{{ form[0].ref.get('label') }}
{% endif %}
</th>
<th>
{% if form[0].mtr is defined %}
{{ form[0].mtr.get('label') }}
{% endif %}
</th>
<th>
{% if form[0].obspag is defined %}
{{ form[0].obspag.get('label') }}
{% endif %}
</th>
</thead>
{{ form_errors(form) }}
{{ form_widget(form._token) }}
{% for child in form %}
<tr>
<td>
{% if child.validrate is defined %}
{{ form_widget(child.validrate) }}
{{ form_widget(child.thmann_idc) }}
{% endif %}
</td>
<td>
{% if child.cnu_idn is defined %}
{{ child.cnu_idn.get('value') }}
{{ form_widget(child.cnu_idn) }}
{% endif %}
</td>
<td>
{% if child.ref is defined %}
{{ child.ref.get('value') }}
{{ form_widget(child.ref) }}
{% endif %}
</td>
<td>
{% if child.mtr is defined %}
{{ child.mtr.get('value') }}
{{ form_widget(child.mtr) }}
{% endif %}
{% if child.rsc001 is defined %}
{{ child.rsc001.get('value') }}
{{ form_widget(child.rsc001) }}
{% endif %}
{% if child.rsc002 is defined %}
{{ child.rsc002.get('value') }}
{{ form_widget(child.rsc002) }}
{% endif %}
</td>
<td>
{% if child.obspag is defined %}
{{ child.obspag.get('value') }}
{{ form_widget(child.obspag) }}
{% endif %}
</td>
</tr>
{% endfor %}

</table>


</div>
</div>

<input class="btn btn-primary" type="submit" />
{% else %}
{# random text here #}
{% endif %}
{% endblock xmd_rate_collection_row %}
Quelqu'un aurait une idée ? Merci ;)