Zend Framework et Ajax (Prototype & Scriptaculous)

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 : Zend Framework et Ajax (Prototype & Scriptaculous)

par logikstik » 08 juil. 2008, 13:18

J'ai fait une petite avancée dans la résolu de mon problème. J'ai modifié le code javascript comme suit, rien de bien extraordinaire si ce n'est que j'ai supprimer la ligne "requestHeaders:{ Accept:'application/json' }, "?

Code : Tout sélectionner

<script type="text/javascript"> function sendForm() { new Ajax.Request( '<?php echo $this->baseUrl(); ?>/Index/Auth/', { method:'post', asynchronous:true, parameters:Form.serialize( $('login') ), onSuccess:function( e ) { alert( e.responseText ) ; } } ) ; } </script>
Dans mon code PHP J'ai modifié le renvoi des réponses comme suis :
public function authAction() {
        
    	$translate = Zend_Registry::get( 'Translate' ) ;
    	
    	$this->view->title = 'Connexion' ;
    	
        $form = new FormLogin() ;
    	$this->view->form = $form ;
    	
		if ( $this->_request->isXmlHttpRequest() ) {
			
			if ( $this->_request->isPost() ) {				
				
				$username = $this->_request->getPost( 'username' ) ;
				$password = $this->_request->getPost( 'password' ) ;

				if ( empty( $username ) ) {
					
        			$this->getResponse()->setBody( $translate->_( 'Veuillez saisir votre identifiant' ) ) ;
				} 
				elseif ( empty( $password ) ) {
						
					$this->getResponse()->setBody( $translate->_( 'Veuillez saisir votre mot de passe' ) ) ;
				} 
				else {
					
					$dbAdapter   = Zend_Registry::get( 'Db' ) ;
					$authAdapter = new Zend_Auth_Adapter_DbTable( $dbAdapter ) ;
					$authAdapter->setTableName( new TblMembers() )
								->setIdentityColumn( 'username' )
								->setCredentialColumn( 'password' )
								->setCredentialTreatment( 'MD5(?)' )
								->setIdentity( $username )
								->setCredential( $password ) ;
	
					$auth   = Zend_Auth::getInstance() ;
					$result = $auth->authenticate( $authAdapter ) ;
	
					if ( $result->isValid() ) {
						
						$data = $authAdapter->getResultRowObject( null, 'password' ) ;
						$auth->getStorage()->write( $data ) ;
						$this->_redirect( '/Auth/' ) ;	
					} 
					else {
	
						$this->getResponse()->setBody( $translate->_( 'Mot de passe et/ou identifiant incorrect' ) ) ;
					}
				}
			}
    	      }
    }
Si je ne rentre pas d'identifiant dans le formulaire, il me renvoi bien "Veuillez saisir votre identifiant" dans le retour de la requête AJAX mais ne l'affiche pas pas dans l'alert() du javascript.


P.S. :

Le problème est résolu ! J'ai simplement rajouter "$this->_helper->layout->disableLayout() ;" à mon action pour désactiver le layout qu'il me renvoyai à chaque fois et changer ma requête AJAX par new Ajax.Updater().
Du coup, ça marche nickel !

par zeus » 08 juil. 2008, 09:25

Modération :
logikstik, j'ai supprimé ton second message, visiblement non complet.

Tu peux également le faire toi-même tant que personne n'a répondu à ton message, en appuyant sur le bouton Image en haut de tes message

Zend Framework et Ajax (Prototype & Scriptaculous)

par logikstik » 08 juil. 2008, 01:36

Bonsoir,

Suite à mon dernier post et quelques recherches sur le Net, je me suis mis sous l'architecture MVC pour mon application. :)

Je souhaite y rajouter un système AJAX pour certaines parties, notamment pour les formulaires mais après 2 jours de recherches, je ne trouve rien de très concluant mise à part d'utiliser la méthode JSON pour envoyer et recevoir des données.

En fait je comprends pas comment envoyer correctement les données d'un formulaire depuis une requête AJAX à une action de mon contrôleur et comment réceptionner correctement ces même données dans l'action de mon contrôleur.

Je vous montre mon code JS :

Code : Tout sélectionner

<script type="text/javascript"> function sendForm() { new Ajax.Request( '<?php echo $this->baseUrl(); ?>/Index/Auth/', { method:'post', asynchronous:true, parameters:Form.serialize( $('login') ), requestHeaders:{ Accept:'application/json' }, onSuccess:function( e ) { alert( e.responseText.evalJSON() ) ; } } ) ; } </script>
L'action de mon Contrôleur :
public function authAction() {
    	
    	$translate = Zend_Registry::get( 'Translate' ) ;
		
    	if ( $this->_request->isXmlHttpRequest() ) {

			if ( $this->_request->isPost() ) {
				
				$username = $this->_request->getPost( 'username' ) ;
				$password = $this->_request->getPost( 'password' ) ;
	
				if ( empty( $username ) ) {
					
					echo $translate->_( 'Veuillez saisir votre identifiant' ) ;
				} 
				elseif ( empty( $password ) ) {
					
					echo $translate->_( 'Veuillez saisir votre mot de passe' ) ;
				} 
				else {
					
					$dbAdapter = Zend_Registry::get( 'Db' ) ;
					$authAdapter = new Zend_Auth_Adapter_DbTable( $dbAdapter ) ;
					$authAdapter->setTableName( new TblMembers() )
								->setIdentityColumn( 'username' )
								->setCredentialColumn( 'password' )
								->setCredentialTreatment( 'MD5(?)' )
								->setIdentity( $username )
								->setCredential( $password ) ;
	
					$auth   = Zend_Auth::getInstance() ;
					$result = $auth->authenticate( $authAdapter ) ;
	
					if ( $result->isValid() ) {
						
						$data = $authAdapter->getResultRowObject( null, 'password' ) ;
						$auth->getStorage()->write( $data ) ;
						$this->_redirect( '/auth/' ) ;
						
					} else {
	
						echo $translate->_( 'Mauvais identifiant et/ou mot de passe' ) ;
					}
				}
			}
    	     }
 }
Voilà, j'espère avoir été clair dans mes explications.

Je vous remercie d'avance pour votre aide

P.S. : J'utilise WAMP pour mes tests local et quand j'envoie mon formulaire, Firebug me retourne une erreur "406 Not Acceptable" alors que je n'est pas installer de mod_security.