Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 28-08-2009 16:23:00

supertino7
Membre
Date d'inscription: 21-02-2009
Messages: 113

Flashmessenger ne fonctionne pas avec des redirections

Bonjour,

je rencontre un souci depuis un p'tit moment avec le composant Flashmessenger.

Dans mon controleur :

Code:

$this->_helper->flashMessenger('Sujet enregistrée !');

$this->_helper->redirector->gotoSimpleAndExit('sujets');

En fait, ce dernier ne marche pas si j'effectue une redirection à la fin de mon action. (quand je reste sur le template lié à l'action, pas de problème.)

Afin de garder un emplacement pour les flashmessenger qui soit tjrs le même et pas repeté dans les templates, j'ai ajouté le code de récupération des messages dans le Layout.phtml

Code:

<div>
        
            <?php foreach (Zend_Controller_Action_HelperBroker::getStaticHelper('FlashMessenger')->getCurrentMessages() as $message): ?>
            <div class="flashmessage">
            <?= $message; ?>
            </div>
            <?php endforeach;?>
        
        <?= $this->layout()->content ?>
</div>

Est ce que c'est le fait qu'il se trouve dans la layout qui pose problème ? où est ce que c'est la redirection qui efface toutes les données de session ? A moins qu'il faille activer les sessions quelquepart ?

Merci pour votre aide.

Dernière modification par Mr.MoOx (08-09-2009 17:26:13)

Hors ligne

 

#2 01-09-2009 16:33:44

supertino7
Membre
Date d'inscription: 21-02-2009
Messages: 113

Re: Flashmessenger ne fonctionne pas avec des redirections

Quelqu'un a une piste que je pourrai explorer pour résoudre ce souci ? sad

Hors ligne

 

#3 03-09-2009 09:21:16

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: Flashmessenger ne fonctionne pas avec des redirections

Le problème avec le FlashMessenger, c'est que on peut pas bien gérer les redirections.
J'avais lors d'un besoin, recoder un messenger qui se vide qu'une fois qu'on récupère les messages.

Hors ligne

 

#4 03-09-2009 11:16:22

supertino7
Membre
Date d'inscription: 21-02-2009
Messages: 113

Re: Flashmessenger ne fonctionne pas avec des redirections

Pourquoi, le messenger se vide avant que la redirection soit effectuée ?

Si t'as un aperçu de ce que tu as pu coder, je veux bien smile

Hors ligne

 

#5 03-09-2009 17:59:20

login
Nouveau membre
Date d'inscription: 06-04-2009
Messages: 8

Re: Flashmessenger ne fonctionne pas avec des redirections

Juste quelque suggestions :
1) As tu essayé en faisant directement : $this->_redirect()
ou
2) Fermer explicitement le fichier de session avant de faire ta redirection.

Hors ligne

 

#6 04-09-2009 11:44:46

throrin19
Membre
Date d'inscription: 01-03-2009
Messages: 318
Site web

Re: Flashmessenger ne fonctionne pas avec des redirections

flashmessenger renvoi les messages sous forme d'un tableau de messages. Quand tu arrive sur ta page de redirection fais tu celà dans le controller??

Code:

$this->view->messages = $this->_flashmessenger->getMessages();

pour ensuite faire ceci dans la vue associée??

Code:

//test si flashmessenger n'est pas nul
if(!empty($this->messages))
{
    foreach($this->messages as $message)
    {
        echo $this->message;
    }
}

et là sa devrai marcher

PS: mon $this->_flashmessenger a été initialisée dans la fonction init() du controller.

Dernière modification par throrin19 (04-09-2009 11:45:35)

Hors ligne

 

#7 06-09-2009 18:28:37

mdelanno
Membre
Lieu: Nord
Date d'inscription: 26-08-2007
Messages: 90
Site web

Re: Flashmessenger ne fonctionne pas avec des redirections

Il faut utiliser la méthode getMessages pour récupérer les messages enregistrés lors de la requête précédente. getCurrentMessages renvoie les messages enregistrés dans la requête en cours.

Si ça t'intéresse, j'ai une aide de vue qui encapsule la récupération et l'affichage des messages : http://wiip.fr/content/zend-framework-u … ages-flash

Dernière modification par mdelanno (06-09-2009 18:31:56)

Hors ligne

 

#8 07-09-2009 11:33:53

supertino7
Membre
Date d'inscription: 21-02-2009
Messages: 113

Re: Flashmessenger ne fonctionne pas avec des redirections

Merci pour votre aide smile

login a écrit:

Juste quelque suggestions :
1) As tu essayé en faisant directement : $this->_redirect()
ou
2) Fermer explicitement le fichier de session avant de faire ta redirection.

1) Oui, avec _redirect ça ne fonctionne pas non plus hmm
2) Qu'appelles-tu par ferme le fichier de session, il y a une commande Zend_Session spéciale ?

throrin19 a écrit:

flashmessenger renvoi les messages sous forme d'un tableau de messages. Quand tu arrive sur ta page de redirection fais tu celà dans le controller??

Code:

$this->view->messages = $this->_flashmessenger->getMessages();

pour ensuite faire ceci dans la vue associée??

Code:

//test si flashmessenger n'est pas nul
if(!empty($this->messages))
{
    foreach($this->messages as $message)
    {
        echo $this->message;
    }
}

et là sa devrai marcher

PS: mon $this->_flashmessenger a été initialisée dans la fonction init() du controller.

Comme je l'ai décrit dans mon post initial, je ne veux pas créer de variables de vue view->messages, je l'ai donc directement inclus dans mon Layout.
La méthode que tu me donnes marche, et c'est celle que j'ai tjrs utilisé, mais je la trouve juste un peu lourde par rapport à toutes les redirections et non-redirections de mon application. smile


mdelanno a écrit:

Il faut utiliser la méthode getMessages pour récupérer les messages enregistrés lors de la requête précédente. getCurrentMessages renvoie les messages enregistrés dans la requête en cours.

Si ça t'intéresse, j'ai une aide de vue qui encapsule la récupération et l'affichage des messages : http://wiip.fr/content/zend-framework-u … ages-flash

Merci, ça avait l'air de marcher, mais non. Quand je reste sur le template actuel, c'est ok.
Dés lors que je fais une redirection ($this->_redirect('/') ou GoToSimple ou autre) , plus rien ne s'affiche.
Que ça soit avec ->getMessages() ou ->getCurrentMessages()

Merci pour votre aide.

Hors ligne

 

#9 07-09-2009 11:41:43

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: Flashmessenger ne fonctionne pas avec des redirections

C'est normal que ça se vide lors de redirections. C'est prévu pour que les messages soient vidé automatiquement à chaque page.

Voici les classes que j'ai utilisé qui permettent de garder les messages en session tant que ils ne sont pas récupérer via getMessages

Code:

<?php
/**
 * Rewix extension for Zend Framework
 *
 * LICENSE
 *
 * This source file is subject to the new BSD license that is bundled
 * with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://www.rewix.com/license/new-bsd
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to contact@rewix.com so we can send you a copy immediately.
 *
 * @category   Rx
 * @package    Rx_Controller
 * @subpackage Rx_Controller_Action_Helper
 * @copyright  Copyright (c) 2007 Rewix (http://www.rewix.com)
 * @license    http://www.rewix.com/license/new-bsd     New BSD License
 */

/**
 * @see Zend_Session
 */
//@@// require_once 'Zend/Session.php';

/**
 * Messenger - implement session-based messages
 *
 * @uses       Zend_Controller_Action_Helper_Abstract
 * @category   Rx
 * @package    Rx_Controller
 * @subpackage Rx_Controller_Action_Helper
 * @copyright  Copyright (c) 2007 Rewix (http://www.rewix.com)
 * @license    http://www.rewix.com/license/new-bsd     New BSD License
 */
class Rx_Controller_Action_Helper_Messenger extends Zend_Controller_Action_Helper_Abstract implements IteratorAggregate, Countable
{
    /**
     * $_session - Zend_Session storage object
     *
     * @var Zend_Session
     */
    static protected $_session = null;

    /**
     * $_messageAdded - Wether a message has been previously added
     *
     * @var boolean
     */
    static protected $_messageAdded = false;

    /**
     * $_namespace - Instance namespace, default is 'default'
     *
     * @var string
     */
    protected $_namespace = 'default';

    /**
     * __construct() - Instance constructor, needed to get iterators, etc
     *
     * @param  string $namespace
     * @return void
     */
    public function __construct()
    {
        if (!self::$_session instanceof Zend_Session_Namespace) {
            self::$_session = new Zend_Session_Namespace($this->getName());
        }
        
    }

    /**
     * setNamespace() - change the namespace messages are added to, useful for
     * per action controller messaging between requests
     *
     * @param  string $namespace
     * @return Zend_Controller_Action_Helper_FlashMessenger Provides a fluent interface
     */
    public function setNamespace($namespace = 'default')
    {
        $this->_namespace = $namespace;
        return $this;
    }

    /**
     * resetNamespace() - reset the namespace to the default
     *
     * @return Zend_Controller_Action_Helper_FlashMessenger Provides a fluent interface
     */
    public function resetNamespace()
    {
        $this->setNamespace();
        return $this;
    }

    /**
     * addMessage() - Add a message to message
     *
     * @param  string $message
     * @return Zend_Controller_Action_Helper_FlashMessenger Provides a fluent interface
     */
    public function addMessage($message, $class='info')
    {
        if (!is_array(self::$_session->{$this->_namespace})) {
            self::$_session->{$this->_namespace} = array();
        }
        self::$_session->{$this->_namespace}[] = array('message'=>$message, 'class'=>$class);
        return $this;
    }

    /**
     * setMessage() - Set a single message to message
     *
     * @param  string $message
     * @return Zend_Controller_Action_Helper_FlashMessenger Provides a fluent interface
     */
    public function setMessage($message)
    {
        self::$_session->{$this->_namespace} = array(array('message'=>$message, 'class'=>$class));
        return $this;
    }

    /**
     * hasMessages() - Wether a specific namespace has messages
     *
     * @return boolean
     */
    public function hasMessages()
    {
        return isset(self::$_session->{$this->_namespace});
    }

    /**
     * getMessages() - Get messages from a specific namespace
     *
     * @return array
     */
    public function getMessages($rxFormat=false)
    {
        if ($this->hasMessages()) {
            $msgs = array_merge(array(),self::$_session->{$this->_namespace});
            $this->clearMessages();
            
            if ($rxFormat) {
                //@@// require_once 'Rx/Messenger/Message.php';
                
                $formatedMsgs = array();
                foreach($msgs as $msg) {
                    $formatedMsgs[] = new Rx_Messenger_Message($msg);
                }
                
                return$formatedMsgs;
            }
            
            return $msgs;
        }

        return array();
    }

    /**
     * Clear all messages from the previous request & current namespace
     *
     * @return boolean True if messages were cleared, false if none existed
     */
    public function clearMessages()
    {
        if ($this->hasMessages()) {
            unset(self::$_session->{$this->_namespace});
            return true;
        }

        return false;
    }

    /**
     * getIterator() - complete the IteratorAggregate interface, for iterating
     *
     * @return ArrayObject
     */
    public function getIterator()
    {
        if ($this->hasMessages()) {
            return new ArrayObject($this->getMessages());
        }

        return new ArrayObject();
    }

    /**
     * count() - Complete the countable interface
     *
     * @return int
     */
    public function count()
    {
        if ($this->hasMessages()) {
            return count($this->getMessages());
        }

        return 0;
    }

    /**
     * Strategy pattern: proxy to addMessage()
     *
     * @param  string $message
     * @return void
     */
    public function direct($message)
    {
        return $this->addMessage($message);
    }
}

Code:

<?php
/**
 * Rewix extension for Zend Framework
 *
 * LICENSE
 *
 * This source file is subject to the new BSD license that is bundled
 * with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://www.rewix.com/license/new-bsd
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to contact@rewix.com so we can send you a copy immediately.
 *
 * @category   Rx
 * @package    Rx_Controller
 * @subpackage Rx_Controller_Action_Helper
 * @copyright  Copyright (c) 2007 Rewix (http://www.rewix.com)
 * @license    http://www.rewix.com/license/new-bsd     New BSD License
 */

/**
 * Messenger - implement session-based messages
 *
 * @category   Rx_Messenger
 * @package    Rx_Controller
 * @subpackage Rx_Controller_Action_Helper
 * @copyright  Copyright (c) 2007 Rewix (http://www.rewix.com)
 * @license    http://www.rewix.com/license/new-bsd     New BSD License
 */
class Rx_Messenger_Message {

    protected $_id = null;
    
    protected $_message = '';
    
    protected $_class = 'info';
    
    protected $_namespace = 'default';
    
    protected $_tag = 'p';

    /**
     * __construct() - Instance constructor
     *
     * @param  string $message
     * @param  string $class class of the message (info, warn, error...)
     * @param  string $options some options :)
     * @return void
     */
    public function __construct($message, $class='info'/*, $options=array()*/)
    {
        if (is_array($message)) {
            $this->setFromArray($message);
        } else {
            $this->setId();
            $this->setMessage($message, $class);
        }
    }
    
    public function setId($id=null) {
        if (!isset($id)) {
            $this->_id = 'rxMessage_'.time();
        }
        $this->_id = $id;
    }

    /**
     * setNamespace() - change the namespace messages are added to, useful for
     * per action controller messaging between requests
     *
     * @param  string $namespace
     * @return Rx_Message Provide sa fluent interface
     */
    public function setNamespace($namespace = 'default')
    {
        $this->_namespace = $namespace;
        return $this;
    }

    /**
     * resetNamespace() - reset the namespace to the default
     *
     * @return Rx_Message Provide sa fluent interface
     */
    public function resetNamespace()
    {
        $this->setNamespace();
        return $this;
    }

    /**
     * setMessage() - Set a single message to message
     *
     * @param  string $message
     * @return Rx_Message Provide sa fluent interface
     */
    public function setMessage($message, $class='info')
    {
        $this->_message = (string)$message;
        return $this->setClass($class);
    }
    
    /**
     * setClass() - Set a the class of the message
     *
     * @param string $class
     * @return Rx_Message Provide sa fluent interface
     */
    public function setClass($class='info')
    {
        $this->_class = (string)$class;
        return $this;
    }

    /**
     * setFromArray() - Set a message from an array (comming from toArray() ?)
     *
     * @return Rx_Message Provide sa fluent interface
     */
    public function setFromArray($data)
    {
        if (!isset($data['id'])) {
            $this->setId();
        } else {
            $this->setId($data['id']);
        }
        $this->_message = $data['message'];
        if (isset($data['class'])) {
            $this->_class = $data['class'];
        }
        return $this;
    }

    /**
     * getMessages() - Get messages from a specific namespace
     *
     * @return array
     */
    public function toArray()
    {
        return array(
            'id' => $this->_id,
            'message' => $this->_message,
            'class'   => $this->_class
        );
    }
    
    /**
     * __toString() - message rendering
     *
     * @return array
     */
    public function __toString()
    {
        return '<'.$this->_tag.' id="'.$this->_id.'" class="'.$this->_class.'">'.$this->_message.'</'.$this->_tag.'>';
    }
}

Hors ligne

 

#10 07-09-2009 21:59:15

mdelanno
Membre
Lieu: Nord
Date d'inscription: 26-08-2007
Messages: 90
Site web

Re: Flashmessenger ne fonctionne pas avec des redirections

Mr.MoOx a écrit:

C'est normal que ça se vide lors de redirections. C'est prévu pour que les messages soient vidé automatiquement à chaque page.

Eh bien non justement. FlashMessenger sauvegarde les messages dans la session par l'intermédiaire de Zend_Session. Il utilise la fonction d'expiration (basée sur le concept des hops).

1ère requête :
- on sauvegarde le message dans la session avec un hop à 1
- on renvoie un code de redirection 30x

2ème requête (page vers laquelle on a redirigé) :
- à la construction de l'objet Zend_Session_Namespace, on décrémente le compteur de hop qui passe donc à 0, les données contenues dans l'espace de nom sont copiées dans un membre statique (Zend_Session_Abstract::_expiringData) et l'espace de nom est supprimé de la session (gros bidouillage pour ne pas utiliser __destruct)

Donc ça marche avec un _redirect (c'est fait pour ça d'ailleurs, pour passer des messages entre deux requêtes).

Tu dois avoir un problème dans ton code. Apparemment, ça ne fonctionne plus quand tu changes de layout. T'as bien le code pour afficher les messages dans tes deux layouts ?

Dernière modification par mdelanno (07-09-2009 22:01:29)

Hors ligne

 

#11 08-09-2009 00:28:55

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: Flashmessenger ne fonctionne pas avec des redirections

J'ai bien étudié le code du flash messenger, c'est pour cette raison que j'ai recodé une classe similaire, mais avec un système différent : tant que les messages ne sont pas récupérés, ils ne disparaissent pas de la session.

Le FlashMessenger ne marche pas dans ce genre d'exemple :

- Page 1 : Action qui ajoute des "flash" messages.

- Page 2 : Action qui effectue une redirection sans affichage.

- Page 3 : Les "flash" messages n'existent plus.

Hors ligne

 

#12 08-09-2009 17:21:02

mdelanno
Membre
Lieu: Nord
Date d'inscription: 26-08-2007
Messages: 90
Site web

Re: Flashmessenger ne fonctionne pas avec des redirections

Ok, on s'est mal compris. Mais on ne peut pas dire que ça se vide lors d'une redirection. Ça se vide à la fin de la requête suivant celle où on a placé les messages.

Hors ligne

 

#13 22-09-2009 16:14:09

supertino7
Membre
Date d'inscription: 21-02-2009
Messages: 113

Re: Flashmessenger ne fonctionne pas avec des redirections

Mr.MoOx a écrit:

C'est normal que ça se vide lors de redirections. C'est prévu pour que les messages soient vidé automatiquement à chaque page.

Voici les classes que j'ai utilisé qui permettent de garder les messages en session tant que ils ne sont pas récupérer via getMessages

Code:

<?php
/**
 * Rewix extension for Zend Framework
 *
 * LICENSE
 *
 * This source file is subject to the new BSD license that is bundled
 * with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://www.rewix.com/license/new-bsd
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to contact@rewix.com so we can send you a copy immediately.
 *
 * @category   Rx
 * @package    Rx_Controller
 * @subpackage Rx_Controller_Action_Helper
 * @copyright  Copyright (c) 2007 Rewix (http://www.rewix.com)
 * @license    http://www.rewix.com/license/new-bsd     New BSD License
 */

/**
 * @see Zend_Session
 */
//@@// require_once 'Zend/Session.php';

/**
 * Messenger - implement session-based messages
 *
 * @uses       Zend_Controller_Action_Helper_Abstract
 * @category   Rx
 * @package    Rx_Controller
 * @subpackage Rx_Controller_Action_Helper
 * @copyright  Copyright (c) 2007 Rewix (http://www.rewix.com)
 * @license    http://www.rewix.com/license/new-bsd     New BSD License
 */
class Rx_Controller_Action_Helper_Messenger extends Zend_Controller_Action_Helper_Abstract implements IteratorAggregate, Countable
{
    /**
     * $_session - Zend_Session storage object
     *
     * @var Zend_Session
     */
    static protected $_session = null;

    /**
     * $_messageAdded - Wether a message has been previously added
     *
     * @var boolean
     */
    static protected $_messageAdded = false;

    /**
     * $_namespace - Instance namespace, default is 'default'
     *
     * @var string
     */
    protected $_namespace = 'default';

    /**
     * __construct() - Instance constructor, needed to get iterators, etc
     *
     * @param  string $namespace
     * @return void
     */
    public function __construct()
    {
        if (!self::$_session instanceof Zend_Session_Namespace) {
            self::$_session = new Zend_Session_Namespace($this->getName());
        }
        
    }

    /**
     * setNamespace() - change the namespace messages are added to, useful for
     * per action controller messaging between requests
     *
     * @param  string $namespace
     * @return Zend_Controller_Action_Helper_FlashMessenger Provides a fluent interface
     */
    public function setNamespace($namespace = 'default')
    {
        $this->_namespace = $namespace;
        return $this;
    }

    /**
     * resetNamespace() - reset the namespace to the default
     *
     * @return Zend_Controller_Action_Helper_FlashMessenger Provides a fluent interface
     */
    public function resetNamespace()
    {
        $this->setNamespace();
        return $this;
    }

    /**
     * addMessage() - Add a message to message
     *
     * @param  string $message
     * @return Zend_Controller_Action_Helper_FlashMessenger Provides a fluent interface
     */
    public function addMessage($message, $class='info')
    {
        if (!is_array(self::$_session->{$this->_namespace})) {
            self::$_session->{$this->_namespace} = array();
        }
        self::$_session->{$this->_namespace}[] = array('message'=>$message, 'class'=>$class);
        return $this;
    }

    /**
     * setMessage() - Set a single message to message
     *
     * @param  string $message
     * @return Zend_Controller_Action_Helper_FlashMessenger Provides a fluent interface
     */
    public function setMessage($message)
    {
        self::$_session->{$this->_namespace} = array(array('message'=>$message, 'class'=>$class));
        return $this;
    }

    /**
     * hasMessages() - Wether a specific namespace has messages
     *
     * @return boolean
     */
    public function hasMessages()
    {
        return isset(self::$_session->{$this->_namespace});
    }

    /**
     * getMessages() - Get messages from a specific namespace
     *
     * @return array
     */
    public function getMessages($rxFormat=false)
    {
        if ($this->hasMessages()) {
            $msgs = array_merge(array(),self::$_session->{$this->_namespace});
            $this->clearMessages();
            
            if ($rxFormat) {
                //@@// require_once 'Rx/Messenger/Message.php';
                
                $formatedMsgs = array();
                foreach($msgs as $msg) {
                    $formatedMsgs[] = new Rx_Messenger_Message($msg);
                }
                
                return$formatedMsgs;
            }
            
            return $msgs;
        }

        return array();
    }

    /**
     * Clear all messages from the previous request & current namespace
     *
     * @return boolean True if messages were cleared, false if none existed
     */
    public function clearMessages()
    {
        if ($this->hasMessages()) {
            unset(self::$_session->{$this->_namespace});
            return true;
        }

        return false;
    }

    /**
     * getIterator() - complete the IteratorAggregate interface, for iterating
     *
     * @return ArrayObject
     */
    public function getIterator()
    {
        if ($this->hasMessages()) {
            return new ArrayObject($this->getMessages());
        }

        return new ArrayObject();
    }

    /**
     * count() - Complete the countable interface
     *
     * @return int
     */
    public function count()
    {
        if ($this->hasMessages()) {
            return count($this->getMessages());
        }

        return 0;
    }

    /**
     * Strategy pattern: proxy to addMessage()
     *
     * @param  string $message
     * @return void
     */
    public function direct($message)
    {
        return $this->addMessage($message);
    }
}

Code:

<?php
/**
 * Rewix extension for Zend Framework
 *
 * LICENSE
 *
 * This source file is subject to the new BSD license that is bundled
 * with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://www.rewix.com/license/new-bsd
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to contact@rewix.com so we can send you a copy immediately.
 *
 * @category   Rx
 * @package    Rx_Controller
 * @subpackage Rx_Controller_Action_Helper
 * @copyright  Copyright (c) 2007 Rewix (http://www.rewix.com)
 * @license    http://www.rewix.com/license/new-bsd     New BSD License
 */

/**
 * Messenger - implement session-based messages
 *
 * @category   Rx_Messenger
 * @package    Rx_Controller
 * @subpackage Rx_Controller_Action_Helper
 * @copyright  Copyright (c) 2007 Rewix (http://www.rewix.com)
 * @license    http://www.rewix.com/license/new-bsd     New BSD License
 */
class Rx_Messenger_Message {

    protected $_id = null;
    
    protected $_message = '';
    
    protected $_class = 'info';
    
    protected $_namespace = 'default';
    
    protected $_tag = 'p';

    /**
     * __construct() - Instance constructor
     *
     * @param  string $message
     * @param  string $class class of the message (info, warn, error...)
     * @param  string $options some options :)
     * @return void
     */
    public function __construct($message, $class='info'/*, $options=array()*/)
    {
        if (is_array($message)) {
            $this->setFromArray($message);
        } else {
            $this->setId();
            $this->setMessage($message, $class);
        }
    }
    
    public function setId($id=null) {
        if (!isset($id)) {
            $this->_id = 'rxMessage_'.time();
        }
        $this->_id = $id;
    }

    /**
     * setNamespace() - change the namespace messages are added to, useful for
     * per action controller messaging between requests
     *
     * @param  string $namespace
     * @return Rx_Message Provide sa fluent interface
     */
    public function setNamespace($namespace = 'default')
    {
        $this->_namespace = $namespace;
        return $this;
    }

    /**
     * resetNamespace() - reset the namespace to the default
     *
     * @return Rx_Message Provide sa fluent interface
     */
    public function resetNamespace()
    {
        $this->setNamespace();
        return $this;
    }

    /**
     * setMessage() - Set a single message to message
     *
     * @param  string $message
     * @return Rx_Message Provide sa fluent interface
     */
    public function setMessage($message, $class='info')
    {
        $this->_message = (string)$message;
        return $this->setClass($class);
    }
    
    /**
     * setClass() - Set a the class of the message
     *
     * @param string $class
     * @return Rx_Message Provide sa fluent interface
     */
    public function setClass($class='info')
    {
        $this->_class = (string)$class;
        return $this;
    }

    /**
     * setFromArray() - Set a message from an array (comming from toArray() ?)
     *
     * @return Rx_Message Provide sa fluent interface
     */
    public function setFromArray($data)
    {
        if (!isset($data['id'])) {
            $this->setId();
        } else {
            $this->setId($data['id']);
        }
        $this->_message = $data['message'];
        if (isset($data['class'])) {
            $this->_class = $data['class'];
        }
        return $this;
    }

    /**
     * getMessages() - Get messages from a specific namespace
     *
     * @return array
     */
    public function toArray()
    {
        return array(
            'id' => $this->_id,
            'message' => $this->_message,
            'class'   => $this->_class
        );
    }
    
    /**
     * __toString() - message rendering
     *
     * @return array
     */
    public function __toString()
    {
        return '<'.$this->_tag.' id="'.$this->_id.'" class="'.$this->_class.'">'.$this->_message.'</'.$this->_tag.'>';
    }
}

Hello !

Je me permets de revenir vers vous.
J'ai implémenté tes deux classes. Et malheureusement, ça ne prends toujours pas. Je ne sais pas si c'est ma manière d'utiliser le flashmessenger qui pose problème...

Code:

// Dans mon controller
$this->_helper->Messenger('Coucou ca va ?');
$this->_redirect('/controller/action');

Code:

// Dans mon layout
<?php foreach (Zend_Controller_Action_HelperBroker::getStaticHelper('Messenger')->getMessages() as $message): ?>
    <div class="<?= $message['class'] ?>">
       <?= $message['message']; ?>
    </div>
<?php endforeach;?>

Alors est ce que c'est le fait de récupérer les messages depuis le layout, en passant par l'HelperBroker qui pose probleme ?

J'ai trouvé une petite solution en faisant un _forward('action'), mais du coup l'URL reste la même que la précédente.


Merci encore pour votre aide.

Hors ligne

 

#14 05-10-2009 11:37:49

supertino7
Membre
Date d'inscription: 21-02-2009
Messages: 113

Re: Flashmessenger ne fonctionne pas avec des redirections

Bon,

je pense avoir trouvé la solution à mon problème.
En fait, pour une démo faite vendredi dernier, j'ai désactivé quelques fonctionnalités du bootstrap, dont celle initialisant la ScientaBar (barre de debug)

Et je me rends compte ce matin que tous les flashmessages s'affichent correctement.

Alors est ce que cette barre joue également avec les données de sessions etc ?

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