Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
Niveau débutant Zend.
Niveau PHP5 : avancé.
Je recherche un moyen d'afficher les erreurs d'un formulaire de connexion créé avec Zend_form.
La logique de construction du formulaire est la suivante :
- Dans le répertoire : application\forms\login.php création de la class
"class Application_Form_Users extends Zend_Form" . Puis instanciation de cette class dans l'action "login" du controller "auth". Une première vérification est faite concernant la validité du formulaire par : $form->isValid($formData). Dans le cas ou le formulaire ne serait pas valide, j'aimerai réafficher le formulaire avec les erreurs bloquantes.
Or tout ce qui s'affiche après validation du formulaire c'est : "An error occured Error!", quelle que soit l'erreur volontaire commise dans le formulaire pour le tester.
Après recherches , il s'agit du message fourni par le controlleur de base ErrorController dans son action index.
J'ai beau fouillé le web, je n'ai pas pas pistes. Merci d'avance pour vos commentaires.
Voici la routine de traitement du formulaire dans l'action "login" du controller "auth" :
function loginAction()
{
// Instanciation du formulaire
$form = new Application_Form_Users();
$this->view->form = $form;
$formData = $_POST;
//Si on accède à cette routine à partir du formulaire =>isPost
if($this->getRequest()->isPost()) {
//Si le formulaire est valide
if ($form->isValid($formData)) {
$f = new Zend_Filter_StripTags();
$username = $f->filter($form->getValue('username'));
$password = $f->filter($form->getValue('password'));
// L'adaptateur
$dbAdapter = Zend_Db_Table_Abstract::getDefaultAdapter();
$authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
$authAdapter->setTableName('users');
$authAdapter->setIdentityColumn('username');
$authAdapter->setCredentialColumn('password');
// On assigne les valeurs pour que l'authentification s'effectue
$authAdapter->setIdentity($username);
$authAdapter->setCredential($password);
// On tente l'authentification
$auth = Zend_Auth::getInstance();
$result = $auth->authenticate($authAdapter);
// On test si tout s'est bien passé
if($result->isValid())
{
$data = $authAdapter->getResultRowObject(null, 'password');
//permet de regénérer l'identifiant de session
Zend_Session::regenerateId();
$auth->getStorage()->write($data);
$this->_helper->redirector('index', 'index');
//$this->_redirect('/');
}
else
{
$this->view->error = 'Mauvais login ou mauvais mot de passe.';
$form->populate($formData);
$this->view->form=$form;
}
}
// Si le formulaire n'est pas valide
else {
// $this->view->error = 'Vous devez remplir tous les champs.';
echo $form;
// $form->populate($formData);
// $this->view->form= $form;
}
//redirection si la page n'a pas été appelée à partir d'un formulaire
$this->_redirect($this->view->url(array('controller' => 'Auth','action' => 'index'), 'default', true));
}
}
-Voici le contenu de ErrorController :
class ErrorController extends Zend_Controller_Action
{
public function errorAction()
{
$this->view->message = "Error !";
}
public function denyAction()
{
$this->view->message = "You are not allowed to see this page !";
}
}
-Voici la création du formulaire :
class Application_Form_Users extends Zend_Form
{
public function init()
{
$this->setName('login_form');
->setMethod('post');
//Redefinition des validators
$notEmpty = new Zend_Validate_NotEmpty();
$notEmpty->setMessage('foo');
$isMatch = new Zend_Validate_IsMatch();
$isMatch->setMessage('bar');
$yourElement->addValidators(array($notEmpty, $isMatch));
//Champ login
$login = new Zend_Form_Element_Text('username');
$login->setLabel('Login : ')
->setRequired(true)
->addFilter('StripTags')
->addFilter('StringTrim')
->addErrorMessage('Please, type your phone here!')
->addValidator('NotEmpty', true, array('messages'=>'Cannot be empty'))
->addValidators(array($notEmpty, $isMatch));
//Champ mdp
$password = new Zend_Form_Element_Password('password');
$password->setLabel('Mot de passe : ')
->setRequired(true)
->addFilter('StripTags')
->addFilter('StringTrim')
->addErrorMessage('Please, type your phone here!')
->addValidators(array($notEmpty, $isMatch))
->addValidator('NotEmpty', true, array('messages'=>'Cannot be empty'));
//->addValidator('NotEmpty');
$submit = new Zend_Form_Element_Submit('Login');
$submit->setAttrib('id', 'submitbutton');
$submit->setValue('Login');
$this->addElements(array($username, $password, $submit));
}
}
Dernière modification par zendalf (28-05-2012 22:55:58)
Hors ligne
Salut, j'ai plusieurs remarques.
Pour commencer utilise les balises codes pour présenter ton code.
- Revois eventuellement ce bout de code
[lang=php] $formData = $_POST; //Si on accède à cette routine à partir du formulaire =>isPost if($this->getRequest()->isPost()) {
par
[lang=php] if($this->getRequest()->isPost()) { $formData = $this->getRequest()->getPost();
- Ce bout de code
[lang=php] $this->view->form=$form;
Écris le une seule fois à la fin de ton action.
- $form->populate($formData); ne sert à rien si tu n'a rien à pré afficher dans ton formulaire lorsque l'utilisateur demande la page. On l'utilise plutôt sur une page d’édition de compte par exemple. En fait le $form->populate($formData); se fait implicitement dans if ($form->isValid($formData)) { il me semble.
Quand tu lance la validation du formulaire celui ci va donc remplir les champs ainsi que les messages d'erreurs. Tu n'a rien à faire.
- Ton filtre $f = new Zend_Filter_StripTags(); dans ton action est je crois inutile puisque déjà écrite dans ta classe formulaire
- Dans cette partie
[lang=php] else { // $this->view->error = 'Vous devez remplir tous les champs.'; echo $form; // $form->populate($formData); // $this->view->form= $form; }
Tu devrais juste assigner un éventuel message d'erreur comme la première ligne que tu as commenté
Fais un peu le ménage dans tout ça on devrais y voir plus clair
Dernière modification par mbret (18-06-2012 15:11:03)
Hors ligne
Pages: 1