ZendFramework et la gestion des erreurs de formulaire (2 le retour ...)

Tagged:

Je fais suite a mon précédent billet

La RC1 du ZendFramework nous apporte son lot de nouveautés ... En l'occurence, une fonctionalité qui permet de copier le fonctionnement des helper pour la vue, mais cette fois-ci pour le controlleur ... Parmis les helpers de base, il en est un qui a attiré mon attention : Le FlashMessenger !

Bref je me dis pourquoi pas, simplement le soucis c'est qu'il permet de faire des messages mais sans les clés ! Ben oui, les clés ... Dans un formulaire on n'a pas simplement des messages, ces messages sont associés a des données ...

Donc j'ai développé une classe qui hérite de ce messenger que voici :

class Custom_Controller_Action_Helper_FormMessenger extends Zend_Controller_Action_Helper_FlashMessenger {
 
    public function addMessage($key, $message) {
        if (self::$_messageAdded === false) {
            self::$_session->setExpirationHops(1, null, true);
        }
 
        if (!isset(self::$_session->{$this->_namespace})) {
            self::$_session->{$this->_namespace} = array();
        }
 
		$array = self::$_session->{$this->_namespace};
        $array[$key] = $message;
		self::$_session->{$this->_namespace} = $array;
 
        return;
    }
 
	public function direct($key, $message) {
		$this->addMessage($key, $message);
	}
 
    public function hasCurrentMessage($key) {
        if ($this->hasCurrentMessages()) {
	        return array_key_exists($key, $this->getCurrentMessages());
        }
        return false;
    }
 
    public function getCurrentMessage($key) {
        if ($this->hasCurrentMessage($key)) {
            return self::$_session->{$this->_namespace}[$key];
        }
 
        return "";
    }
 
}

J'override simplement les methodes de bases pour leur ajouter un paramètre (au passage j'ai ajouté la méthode direct, j'explique plus loin pourquoi ...)

Du coup ... quand on instancie notre FrontController (la ou ailleur mais il faut que ce soit dit une fois pour toute, genre dans le index.php quelque par) il faut lui dire :

	Zend_Controller_Action_HelperBroker::removeHelper('FlashMessenger');
	Zend_Controller_Action_HelperBroker::addHelper(new Custom_Controller_Action_Helper_FormMessenger());

Juste histoire qu'on puisse s'en servir ... Donc pour ajouter des erreurs dans un controlleur c'est simple .. deux manières :

# manière rapide :
$this->_helper->formMessenger('key', 'value');
 
# manière qui convient a d'autres besoins :
$formMessenger = $this->_helper->getHelper('FormMessenger');
$formMessenger->addMessage('key', 'value');

Magnifique non ? C'est mieux qu'avec symphony hein oué ? private joke =)

Bref pour les récupérer simplement il faut redévelopper le plugin pour la vue, rien de bien compliqué :

class Zend_View_Helper_Message {
    
    public function message($for = null) {
		if (!$for) return "";
		$formMessenger = Zend_Controller_Action_HelperBroker::getExistingHelper('FormMessenger');
		return $formMessenger->getCurrentMessage($for);
    }
    
}

Et voila, on utilise les techno du ZF pour faire quelque chose que j'avais bidouillé auparavant !

PS: utilisation dans la vue :

<?= $this->message('key') ?>

compliqué hein ?

Comments

bonjour,

je n'arrive pas à faire marcher ça :/

dans mon controlleur:
j'ai un attribut privé $_messenger dans la classe du controlleur;
$this->_messenger->addMessage('feedExists','toto');

je vérifie, j'ai bien $_SESSION['FormMessenger']['default']['feedExists']='toto'

ensuite je fais un redirect:
$this->_redirect('/feed/');

dans ma vue:
echo "message:".$this->message('feedExists')."<br/>";

et là , rien ....une idée?

Faut rajouter du debug, la je vois pas ... quand je l'avais fait ça fonctionnait, je reteste ce soir si possible! Et je te redis ça !