[Symfony 2] Rebuild formulaire

amel13
Invité n'ayant pas de compte PHPfrance

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 ;)

ViPHP
xTG
ViPHP | 7331 Messages

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.

amel13
Invité n'ayant pas de compte PHPfrance

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.