Zend Framework et Ajax (Prototype & Scriptaculous)

Eléphant du PHP | 130 Messages

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.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

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
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 130 Messages

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 !