Bonjour à toutes et tous, et merci de l'aide que vous pourrez éventuellement m'apporter.
Tout d'abord j'ai longuement hésité entre poster dans le forum Zend Framework ou dans celui d'Ajax, mais mon problème étant quand même fortement lié à Zend mon post a donc atterrit ici !
Je suis en train de créer une page qui va contenir plusieurs formulaires, la validation du premier entraînant l'apparition du second, etc. C'est donc tout naturellement que j'effectue la soumission des formulaires via Ajax. Voici mon code :
Initialisation de mon controller Planning
Mon formulaire
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 class PlanningController extends Zend_Controller_Action { public function init(){ $ajaxContext = $this->_helper->getHelper('AjaxContext'); $ajaxContext->addActionContext('on-order-form-submit', 'html') ->initContext(); if ($this->_request->isXmlHttpRequest()) { $this->_helper->layout->disableLayout(); } } }
On constate donc que la soumission du formulaire s'effectue vers une autre action (->setAction($view->baseUrl() . '/planning/on-order-form-submit'))
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 class Application_Form_Planning_OrderFamily extends Zend_Form{ public function init() { $view = Zend_Layout::getMvcInstance()->getView(); $this->setAttrib('id', 'orderFamilyForm') ->setAction($view->baseUrl() . '/planning/on-order-form-submit') ->setMethod(Zend_Form::METHOD_POST); $this->addElement('select', 'orderFamily', array( 'Label' => 'Famille d\'intervention', 'MultiOptions' => //..., 'Required' => true )); $this->addElement('text', 'client', array( 'Label' => 'Client', 'Maxlength' => 10, 'Size' => 10, 'Required' => true, 'Validators' => array( new App_Validate_Client() ) )); $this->addElement('submit', 'orderFamilySubmit', array( 'label' => 'Générer' )); } }
Mon action index qui va créer le premier formulaire
Et la vue associée (du moins une partie)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 class PlanningController extends Zend_Controller_Action { public function indexAction() { //... $this->view->formOrderFamily = new Application_Form_Planning_OrderFamily(); } }
Mon action on-order-form-submit qui va être appelée à la soumission du formulaire
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11<div class="grid_24 alpha omega"> <div id="planningProviderContainer" class="grid_7 alpha container"> <h1 class="icon worldLink pngFix">Famille</h1> <?php echo $this->formOrderFamily; ?> </div> <div id="planningQueryContainer" class="grid_17 omega container"> </div> </div>
A terme cette fonction va créer le nouveau formulaire et transmettre la réponse HTML au javascript qui se contentera de l'afficher.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 class PlanningController extends Zend_Controller_Action { public function onOrderFormSubmitAction() { $form = new Application_Form_Planning_OrderFamily(); $this->view->formOrderFamily = $form; if ($this->_request->isPost()){ if ($form->isValid($this->_request->getPost())){ // Valide } else { // Invalide } } } }
Et finalement mon javascript
Le problème qui se pose alors est le suivant : Comment tirer profit des validateurs Zend au travers de cette requête Ajax ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 $("#orderFamilyForm").submit(function(){ // On récupère les paramètres var orderFamily = $('#orderFamilyForm #orderFamily option:selected').val(); var client= $('#orderFamilyForm #client').val(); // On lance notre requête Ajax $.ajax({ type: 'POST', url: baseUrl + '/planning/on-order-form-submit', data: { client: client, orderFamily: orderFamily }, success: function(data, status, jqXHR){ $('#planningQueryContainer').html(data); }, error: function(jqXHR, status, error){ alert(error); }, dataType: 'html' }); // On empêche le navigateur de soumettre le formulaire et //recharger la page return false; });
Lorsque le formulaire est correctement renseigné, parfait je vais pouvoir faire mes traitements, récupérer mon flux HTML (je travaille en HTML et non en JSON) et l'afficher là où il faut dans la page via Javascript.
Mais si le formulaire contient des erreurs, comment alors récupérer le nouveau HTML qui contiendra le code du formulaire en erreur (et toute sa mise en page) pour venir le remplacer à sa position initiale ? Le problème qui se pose est que je réceptionne un flux HTML, je n'ai donc aucun moyen de positionner une variable pour savoir si tout s'est bien passer ou non.
J'avais penser à faire en sorte de me retrouver dans la callback d'erreur Ajax via un
lorsque le formulaire était erroné, mais dans ce cas je perd alors mon flux de données HTML (il n'y a pas de paramètre data dans cette callback) et n'ai alors aucun moyen de mettre à jour le premier formulaire en erreur...
Code : Sélectionner tout - Visualiser dans une fenêtre à part header('HTTP/1.1 400 Bad Request');
(Toutes mes excuses si je ne suis pas des plus clair...)
J'ai également pensé dans ce cas, si dans la callback d'erreur, relancer une requête ajax vers une autre action qui elle sera en charge de me renvoyer le flux HTML du formulaire en erreur et je pourrai alors faire mon remplacement. Mais ça ne me parait pas propre du tout et bien bien lourd. Avez vous vous de meilleurs solutions, des suggestions ?
Pour information contrairement au code montrer, ma vue du premier formulaire est bien isolée dans un partial, donc c'est simplement ce flux qu'il me faudrait récupérer si erreur du formulaire, pour remplacement, ou le flux (partial là aussi) du nouveau formulaire si le premier est correct, pour le mettre là où il faut.
J'espère ne pas vous avoir trop assommé et merci pour votre éventuelle aide.
Partager