Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
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 :
+---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 :
<?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
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
Dans la barre d'adresse, au deuxième clic j'ai : http://localhost/resahotels/public/admin/index/admin/index/login
et comme erreur :
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
Peut-être en modifiant ça :
$form->setAction('admin/index/login')
par :
$form->setAction('/public/admin/index/login')
Dernière modification par acharrex (23-10-2008 20:27:49)
Hors ligne
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
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
Hors ligne
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 :
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
Va au plus simple en évitant les redirections.
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 :
$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
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
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 :
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