Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 23-10-2008 18:46:14

Jean-Marc Rigade
Membre
Lieu: Rennes
Date d'inscription: 25-09-2007
Messages: 314

Gestion des erreurs et formulaire

Bonjour,

j'essaye de démarrer un nouveau projet avec la version 1.6.2 et en utilisant toutes les possibilités de cette version (layout, form, etc...)
J'ai repris l'exemple de la documentation Zend_Form avec comme différence l'existence des modules admin et default dans mon cas

Mon formulaire est un simple login/password, si je ne saisis rien dans le formulaire et que je clique sur le bouton 'connexion', j'ai bien les messages d'erreurs définis dans mon formulaire : "le champs est requis" et ça c'est bien...
Mais si je clique une deuxième fois sur le même bouton toujours sans rien saisir, il est me sort une erreur...

Est-ce normal que dans l'exemple de formulaire donné dans la doc de Zend_Form on ai action="user/login" alors que on est au départ sur index/index ? Bref, je suis perdu là...

Donc voici quelques éléments pour mieux comprendre mon problème :
Arborescence :

Code:

+---application
¦   ¦   bootstrap.php
¦   ¦   Initializer.php
¦   ¦   
¦   +---admin
¦   ¦   +---controllers
¦   ¦   ¦       IndexController.php
¦   ¦   ¦       
¦   ¦   +---helpers
¦   ¦   +---models
¦   ¦   +---views
¦   ¦       +---filters
¦   ¦       +---helpers
¦   ¦       +---scripts
¦   ¦           ¦   main.phtml     
¦   ¦           +---index
¦   ¦                   index.phtml
¦   ¦                   login.phtml
¦   ¦                   
¦   +---default
¦       +---controllers
¦       ¦       ErrorController.php
¦       ¦       IndexController.php
¦       ¦       
¦       +---helpers
¦       +---models
¦       +---views
¦           +---filters
¦           +---helpers
¦           +---scripts
¦               ¦   main.phtml
¦               ¦   
¦               +---error
¦               ¦       error.phtml
¦               ¦       
¦               +---index
¦                       index.phtml
¦                       
+---bin
+---library
¦       config.ini
¦       
+---public
¦   ¦   .htaccess
¦   ¦   index.php
¦   ¦   
¦   +---images
¦   +---scripts             
¦   +---styles

Et le source /admin/controllers/IndexController.php :

Code:

<?php
/**
 * IndexController
 * 
 * @author
 * @version 
 */
require_once 'Zend/Controller/Action.php';
require_once 'Zend/Form.php';
class Admin_IndexController extends Zend_Controller_Action
{
    protected $logger;
    /**
     * @see Zend_Controller_Action::init()
     *
     */
    public function init ()
    {
        parent::init();
        $this->logger = Zend_Registry::get('logger');
        $this->logger->debug('Admin_IndexController');
    }

    public function getForm() {
        $form = new Zend_Form();
        $form->setAction('admin/index/login')
             ->setMethod('post');

        // Identifiant:
        $username = $form->createElement('text', 'username');
        $username->addValidator('alnum')
                 ->addValidator('regex', false, array('/^[a-z]+/'))
                 ->addValidator('stringLength', false, array(6, 20))
                 ->setRequired(true)
                 ->addFilter('StringToLower')
                 ->setLabel('Utilisateur : ');
        
        // Password:
        $password = $form->createElement('password', 'password');
        $password->addValidator('StringLength', false, array(6))
                 ->setRequired(true)
                 ->setLabel('Mot de passe : ');
        
        // Add elements to form:
        $form->addElement($username)
             ->addElement($password)
             // use addElement() as a factory to create 'Login' button:
             ->addElement('submit', 'login', array('label' => 'Connexion'));
             
        $translations = array(
            Zend_Validate_StringLength::TOO_SHORT => "'%value%' fait moins de %min% caractères de long",
            Zend_Validate_StringLength::TOO_LONG => "'%value' dépasse %max% caractères qui est le maximum",
            Zend_Validate_NotEmpty::IS_EMPTY => "Le champ est requis"
            );

        // instancier un translator et le passer son adapter à notre objet Zend_Form
        
        $translate = new Zend_Translate('array', $translations, 'fr');
             
        $form->setDefaultTranslator($translate);
        return $form;
    }
    /**
     * The default action - show the home page
     */
     public function indexAction()
    {
        $this->logger->debug('Admin_IndexController::indexAction');
        $this->_helper->layout()->setLayout('main');
        $this->view->form = $this->getForm();
        $this->render('index');
    }

    public function loginAction()
    {
        $this->logger->debug('Admin_IndexController::loginAction');
        $this->_helper->layout()->setLayout('main');
        if (!$this->getRequest()->isPost()) 
        {
            $this->logger->debug('rien à lire');
            return $this->_forward('index');
        }
        $form = $this->getForm();
        if (!$form->isValid($_POST)) 
        {
            $this->logger->debug('Failed validation; redisplay form');
            $this->view->form = $form;
            return $this->render('index');
        }
        
        $values = $form->getValues();
        // now try and authenticate....
    }
}
?>

Ce qui saute aux yeux, c'est que avant de cliquer la première fois sur le bouton, j'ai ça dans ma barre d'adresse : http://localhost/resahotels/public/admin
Et qu'aprés le premier envoi du formulaire j'ai ça : http://localhost/resahotels/public/admin/index/login
ce qui est normal en un sens, mais du coup au deuxième envoi du formulaire ça part en vrille.

Alors que je voudrais pouvoir cliquer 10 fois sur le bouton sans rien saisir, et à chaque fois avoir les messages d'erreurs définis dans le formulaire...
Et je ne vois pas comment obtenir ça en suivant la logique donnée en exemple dans la doc du Zend_Form.

Merci de me remettre sur la bonne voie.

Hors ligne

 

#2 23-10-2008 19:00:44

acharrex
Membre
Lieu: Suisse
Date d'inscription: 27-04-2008
Messages: 135

Re: Gestion des erreurs et formulaire

Salut,

La deuxième fois que tu cliques sur ton bouton "submit", est-ce que tu es redirigé vers une page de ce style : "http://localhost/resahotels/public/admin/index/login/admin/index/login" ?

Si non, quel message d'erreur obtiens-tu ?

Hors ligne

 

#3 23-10-2008 20:03:22

Jean-Marc Rigade
Membre
Lieu: Rennes
Date d'inscription: 25-09-2007
Messages: 314

Re: Gestion des erreurs et formulaire

Dans la barre d'adresse, au deuxième clic j'ai : http://localhost/resahotels/public/admin/index/admin/index/login
et comme erreur :

Code:

Fatal error: Uncaught exception 'Zend_View_Exception' with message 'script 'layout.phtml' not found in path (F:\Program Files\Zend\Apache2\htdocs\resahotels\application\default\views\scripts\;F:\Program Files\Zend\Apache2\htdocs\resahotels\application\admin\views\scripts\)' in F:\Program Files\Zend\Core\ZendFramework\library\Zend\View\Abstract.php:875 Stack trace: #0 F:\Program Files\Zend\Core\ZendFramework\library\Zend\View\Abstract.php(783): Zend_View_Abstract->_script('layout.phtml') #1 F:\Program Files\Zend\Core\ZendFramework\library\Zend\Layout.php(785): Zend_View_Abstract->render('layout.phtml') #2 F:\Program Files\Zend\Core\ZendFramework\library\Zend\Layout\Controller\Plugin\Layout.php(142): Zend_Layout->render() #3 F:\Program Files\Zend\Core\ZendFramework\library\Zend\Controller\Plugin\Broker.php(331): Zend_Layout_Controller_Plugin_Layout->postDispatch(Object(Zend_Controller_Request_Http)) #4 F:\Program Files\Zend\Core\ZendFramework\library\Zend\Controller\Front.php(945): Zend_Controller_Plugin_Broker->postDispatc in F:\Program Files\Zend\Core\ZendFramework\library\Zend\View\Abstract.php on line 875

En fait je ne suis pas totalement étonné de l'erreur, mais je ne vois pas comment modifier l'exemple fourni dans Zend_Form pour le faire fonctionner correctement, y compris avec des modules...

Dernière modification par Jean-Marc Rigade (23-10-2008 20:04:11)

Hors ligne

 

#4 23-10-2008 20:27:12

acharrex
Membre
Lieu: Suisse
Date d'inscription: 27-04-2008
Messages: 135

Re: Gestion des erreurs et formulaire

Peut-être en modifiant ça :

Code:

$form->setAction('admin/index/login')

par :

Code:

$form->setAction('/public/admin/index/login')

Dernière modification par acharrex (23-10-2008 20:27:49)

Hors ligne

 

#5 23-10-2008 20:30:08

Jean-Marc Rigade
Membre
Lieu: Rennes
Date d'inscription: 25-09-2007
Messages: 314

Re: Gestion des erreurs et formulaire

Je te remercie pour ton aide,
mais dans la mesure ou 'admin' n'est pas sous 'public', ça ne fonctionne pas, et c'est normal...

Hors ligne

 

#6 23-10-2008 20:38:34

acharrex
Membre
Lieu: Suisse
Date d'inscription: 27-04-2008
Messages: 135

Re: Gestion des erreurs et formulaire

Oui effectivement... je m'étais basé sur un de tes messages pour te donner cette URL :

Jean-Marc Rigade a écrit:

Ce qui saute aux yeux, c'est que avant de cliquer la première fois sur le bouton, j'ai ça dans ma barre d'adresse : http://localhost/resahotels/public/admin

J'aurais dû regarder l'arborescence smile

Hors ligne

 

#7 23-10-2008 23:39:55

Jean-Marc Rigade
Membre
Lieu: Rennes
Date d'inscription: 25-09-2007
Messages: 314

Re: Gestion des erreurs et formulaire

J'ai essayé dans tous les sens sans succès, je ne comprends plus rien...
J'ai modifié le code en ne conservant que indexAction :

Code:

public function indexAction()
    {
        $this->logger->debug('Admin_IndexController::indexAction');
        $this->_helper->layout()->setLayout('main');
        $form = $this->getForm();
        $this->view->form = $form;
        if ($this->getRequest()->isPost())
        {
            if (!$form->isValid($_POST)) 
            {
                $this->logger->debug('Failed validation; redisplay form');
                $this->view->form = $form;
                $this->_redirect('admin');
            }
            else 
            {
                $values = $form->getValues();
                // now try and authenticate....
            }
        }
        else 
        {
            $this->view->form = $form;
            return $this->render('index');
        }
    }

Mais ça ne fonctionne toujours pas.
Quelqu'un peut il me mettre sur la voie ?

Merci

Hors ligne

 

#8 24-10-2008 01:43:28

acharrex
Membre
Lieu: Suisse
Date d'inscription: 27-04-2008
Messages: 135

Re: Gestion des erreurs et formulaire

Va au plus simple en évitant les redirections.

Code:

public function indexAction()
    {
        $this->logger->debug('Admin_IndexController::indexAction');
        $this->_helper->layout()->setLayout('main');
        $form = $this->getForm();
        $this->view->form = $form;
        if ($this->getRequest()->isPost())
        {
            if (!$form->isValid($_POST)) 
            {
                $this->logger->debug('Failed validation; redisplay form');
                $this->view->form = $form;
            }
            else 
            {
                $values = $form->getValues();
                // now try and authenticate....
            }
        }
        else 
        {
            $this->view->form = $form;
        }
    }

Et dans la création de ton formulaire :

Code:

$form->setAction('')

Comme ça tu rappeleras autant fois que nécessaire la page "http://www.tonsite.com/admin/index" (tant que les données entrées dans le formulaire ne sont pas valides).

De mon point vue, les redirections sont très superflues et sont moins pratiques.

Hors ligne

 

#9 24-10-2008 10:52:33

Jean-Marc Rigade
Membre
Lieu: Rennes
Date d'inscription: 25-09-2007
Messages: 314

Re: Gestion des erreurs et formulaire

En effet, je reste bien sur le même écran, mais les messages d'erreur disant que les champs sont obligatoires n'apparaissent plus...

C'est à devenir dingue !!

Hors ligne

 

#10 24-10-2008 11:25:18

Jean-Marc Rigade
Membre
Lieu: Rennes
Date d'inscription: 25-09-2007
Messages: 314

Re: Gestion des erreurs et formulaire

acharrex a écrit:

Va au plus simple en évitant les redirections.
Comme ça tu rappeleras autant fois que nécessaire la page "http://www.tonsite.com/admin/index" (tant que les données entrées dans le formulaire ne sont pas valides).

De mon point vue, les redirections sont très superflues et sont moins pratiques.

En effet, j'ai pris une autre action pour être certain de ne pas revenir sur index simplement par défaut et ça marche.
Mais pour avoir les messages d'erreur définis au sein du formulaire, il ne faut pas faire de render :

Code:

public function loginAction()
    {
        $this->logger->debug('Admin_IndexController::loginAction');
        $this->_helper->layout()->setLayout('main');
        $form = $this->getForm();
        $this->view->form = $form;
        if ($this->getRequest()->isPost())
        {
            if (!$form->isValid($_POST)) 
            {
                $this->logger->debug('Failed validation; redisplay form');
                $this->view->form = $form;
            }
            else 
            {
                $values = $form->getValues();
                $this->logger->debug('Traitement de la connexion');
            }
        }
        else 
        {
            $this->view->form = $form;
            return $this->render('login');
        }
    }

Mais du coup je ne vois pas comment faire fonctionner l'exemple de la documentation au sein d'un module en le laissant tel quel...
Quelqu'un peut il m'expliquer d'où vient le problème ?

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages