Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Je veux faire la validation de mon form en ajax mais le proleme c'est que je reçois une réponse "text/html" pourtant je revoix une réponse "application/json".
Le code JS
$(function(){ $('input').blur(function(){ var elementId = $(this).attr('id'); doValidation(elementId); }); }); function doValidation(id){ var data = {}; var url = '/backend/index/validateform'; $('input').each(function(){ data[$(this).attr('name')] = $(this).val(); }); $.post(url,data,function(resp){ $('#'+id).parent().append(getErrorHtml(resp[id],id)); },'json'); } function getErrorHtml(formErrors, id){ var o = '<ul id="errors-'+ id + '" class="errors">'; for(errorKey in formErrors){ o += '<li>' + formErrors[errorKey] + '</li>'; } o += '</ul>'; return o; }
Le code de l'action
public function validateformAction(){ $this->_helper->viewRenderer->setNoRender(); $f = new Backend_Form_Index(); $f->isValid($this->_getAllParams()); $messages= $f->getMessages(); header('Content-type: application/json'); echo Zend_Json::encode($messages); }
La reponse
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html> <head>.....................etc
+ que j'ai remarqué quand je fait commentaire aux instructions de l'action validateform je reçois la même réponse.
J'ai besoin de vos aides svp.Merci
Dernière modification par zizou86 (25-10-2011 22:19:33)
Hors ligne
Hello,
Tu dois aussi désactiver le layout.
[lang=php] public function validateformAction() { $this->_helper->layout()->disableLayout(); $this->_helper->viewRenderer->setNeverRender(true); $f = new Backend_Form_Index(); $f->isValid($this->_getAllParams()); $messages= $f->getMessages(); header('Content-type: application/json'); echo Zend_Json::encode($messages); }
Cependant, il y a une meilleur pratique que ça, c'est d'utiliser le helper ContextSwitch qui permet de gérer plusieurs formats de sorties sans changer le code d'une action.
Que ça soit du HTML, du XML ou du JSON, afficher des données reste le rôle de la vue, je conseille donc plutôt d'utiliser cette méthode :
[lang=php] class MyController extends Zend_Controller_Action { public $contexts = array( 'validateform' => array('json'), } public function init() { parent::init(); // Pour éviter ZF de polluer le rendu JSON avec des infos inutiles $contextSwitch = $this->_helper->getHelper('ContextSwitch'); $contextSwitch ->setAutoJsonSerialization(false) ->initContext(); } public function validateformAction() { $f = new Backend_Form_Index(); $f->isValid($this->_getAllParams()); $messages= $f->getMessages(); $this->view->messages = $messages; } }
Vue validateform.json.phtml
[lang=phtml] <?php echo $this->json($this->messages);
Le ContextSwitch se chargera lui même de désactiver le layout et de rendre la vue dans le bon format. De cette manière l'action du contrôleur reste compatible avec tous les formats.
A+ benjamin.
Hors ligne
Dans la méthode init() de ton controller, ajoute :
[lang=php]public function init() { $this->_helper->ajaxContext->addActionContext('validateform', 'json') ->initContext(); }
Ceci désactivera, pour l'action validateform, le layout, et te passera automatiquement le "$this->view->messages = $messages;" en json.
Dernière modification par Polzie (25-10-2011 13:58:27)
Hors ligne
Merci tous les deux delprog et polzie pour vos réponses mais je reçois la même réponse.
Pour la première solution de delprog et la solution de reçois la même solution même lorsque je laisse l'action validateform vide je reçois la même et voilà le code que je reçois et vous devez remarqué que les messages sont affichés :
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html> <head> <title>لوحة التحكم</title> <link href="/css/default.css" media="screen" rel="stylesheet" type="text/css" > <link href="/css/milk.css" media="screen" rel="stylesheet" type="text/css" > <link href="/css/menu.css" media="screen" rel="stylesheet" type="text/css" > <link href="/includes/JQuery/themes/redmond/jquery.ui.all.css" media="screen" rel="stylesheet" type="text/css" > <script type="text/javascript" src="/includes/JQuery/jquery-1.6.2.js"></script> <meta http-equiv="Content-type" content="text/html;charset=utf-8" ></head> <body> <form id="login" enctype="application/x-www-form-urlencoded" class="formular" autocomplete="off" action="" method="post"><dl class="zend_form"> <dt id="username-label"><label for="username" class="required">اسم الدخول</label></dt> <dd id="username-element"> <input type="text" name="username" id="username" value=""> <ul class="errors"><li>Value is required and can't be empty</li></ul></dd> <dt id="password-label"><label for="password" class="required">كلمة السر</label></dt> <dd id="password-element"> <input type="password" name="password" id="password" value=""> <ul class="errors"><li>Value is required and can't be empty</li></ul></dd> <dt id="submit-label"> </dt><dd id="submit-element"> <input type="submit" name="submit" id="submit" value="تسجيل الدخول"></dd> <dt id="csrf-label"> </dt> <dd id="csrf-element"> <input type="hidden" name="csrf" value="b84bbaa72ce77def9719dc5c8ea17c0f" id="csrf"></dd></dl></form><script type="text/javascript"> <!-- $(function(){ $('input').blur(function(){ var elementId = $(this).attr('id'); doValidation(elementId); }); }); function doValidation(id){ var data = {}; var url = '/backend/index/validateform'; $('input').each(function(){ data[$(this).attr('name')] = $(this).val(); }); console.log(data); $.post(url,data,function(resp){ $('#'+id+'-label').append(getErrorHtml(resp[id],id)); },'json'); } function getErrorHtml(formErrors, id){ var o = '<ul id="errors-'+ id + '" class="errors">'; for(errorKey in formErrors){ o += '<li>' + formErrors[errorKey] + '</li>'; } o += '</ul>'; return o; } //--> </script> <br /> </body> </html>
et pour la deuxiéme solution de delprog
Quand j'écris dans le phtml echo $this->json($this->messages) il m'affiche la page en mode code source comme si je génére le code source de la page.
Hors ligne
J'ai résolu le problême.
Ce que j'ai fait c'est que je pointe sur indexAction et j'envoie l'ajax vers validateAction.
Hors ligne
Bonjour,
Je me permets de revenir sur la réponse de Delprog qui semble fort intéressante.
La vue (validateform dans ce cas) doit elle être vide? Pour que le Json dans l'autre vue validateform .json soit interprété ou non?
J'ai essayé de suivre la solution proposée mais celle ci ne semble pas fonctionner.
Seule solution et comme l'a dit notre ami, afficher notre tableau json dans une autre vue en désactiver le layout pour ensuite l'inclure dans la vue désirée. Y'a t il un autre moyen plus simple?
Hors ligne
RTFM : http://framework.zend.com/manual/1.11/e … textswitch
Mais franchement mis à part dans le cadre de développement d'un webservice, c'est pas très utilisé...
Et pour renvoyer du JSON, c'est beaucoup plus simple et pratique d'utiliser le helper json qui set le content-type à application/json et désactive le layout + rendu de vue, même pas besoin de créer un fichier de vue .phtml vide !
[lang=php]$this->_helper->json($ret, array('enableJsonExprFinder' => true));
Dernière modification par Echo (20-02-2012 13:07:13)
Hors ligne
Pages: 1