程序员人生 网站导航

Zend Framework教程-Zend_Helpers-动作助手-FlashMessenger

栏目:ZendFramework时间:2013-10-21 07:08:15
FlashMessenger 用来处理Flash Messenger会话;FlashMessenger是一个神奇的助手。
有这么一种场景,在用户注册成功后,需要在提示页面上显示用户的名称,如果不通过get传递请求,当然你也可以通过session传递
要显示的用户名称。但是seesion的操作难免复杂,可以使用Flash Messenger快速的实现这个需求。
FlashMessenger助手允许你传递用户可能需要在下个请求看到的消息。
FlashMessenger也是使用Zend_Session_Namespace来存储消息以备将来或下个请求来读取,但是相对简单一些。




FlashMessenger简单用法


在helper_demo1项目的基础上
新增/helper_demo1/application/controllers/UserController.php


<?phpclass UserController extends Zend_Controller_Action{		protected $_flashMessenger = null;	public function init()	{		$this->_flashMessenger =		$this->_helper->getHelper('FlashMessenger');		$this->initView();	}	public function registerAction()	{		$this->_flashMessenger->addMessage('xxxxx,Welcome!');		$this->_helper->redirector('regtips');	}	public function regtipsAction()	{		$this->view->messages = $this->_flashMessenger->getMessages();	}}



新增/helper_demo1/application/views/scripts/user/regtips.phtml

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>test</title></head><body><?php var_dump($this->messages);?></body></html>



访问http://www.localzend.com/helper_demo1/public/user/register

跳转到http://www.localzend.com/helper_demo1/public/user/regtips



FlashMessager实现源码如下<?php/** * 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://framework.zend.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 license@zend.com so we can send you a copy immediately. * * @category   Zend * @package    Zend_Controller * @subpackage Zend_Controller_Action_Helper * @copyright  Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com) * @license    http://framework.zend.com/license/new-bsd     New BSD License *//** * @see Zend_Session */require_once 'Zend/Session.php';/** * @see Zend_Controller_Action_Helper_Abstract */require_once 'Zend/Controller/Action/Helper/Abstract.php';/** * Flash Messenger - implement session-based messages * * @uses       Zend_Controller_Action_Helper_Abstract * @category   Zend * @package    Zend_Controller * @subpackage Zend_Controller_Action_Helper * @copyright  Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com) * @license    http://framework.zend.com/license/new-bsd     New BSD License * @version    $Id: FlashMessenger.php 23775 2011-03-01 17:25:24Z ralph $ */class Zend_Controller_Action_Helper_FlashMessenger extends Zend_Controller_Action_Helper_Abstract implements IteratorAggregate, Countable{    /**     * $_messages - Messages from previous request     *     * @var array     */    static protected $_messages = array();    /**     * $_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());            foreach (self::$_session as $namespace => $messages) {                self::$_messages[$namespace] = $messages;                unset(self::$_session->{$namespace});            }        }    }    /**     * postDispatch() - runs after action is dispatched, in this     * case, it is resetting the namespace in case we have forwarded to a different     * action, Flashmessage will be 'clean' (default namespace)     *     * @return Zend_Controller_Action_Helper_FlashMessenger Provides a fluent interface     */    public function postDispatch()    {        $this->resetNamespace();        return $this;    }    /**     * 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 flash message     *     * @param  string $message     * @return Zend_Controller_Action_Helper_FlashMessenger Provides a fluent interface     */    public function addMessage($message)    {        if (self::$_messageAdded === false) {            self::$_session->setExpirationHops(1, null, true);        }        if (!is_array(self::$_session->{$this->_namespace})) {            self::$_session->{$this->_namespace} = array();        }        self::$_session->{$this->_namespace}[] = $message;        return $this;    }    /**     * hasMessages() - Wether a specific namespace has messages     *     * @return boolean     */    public function hasMessages()    {        return isset(self::$_messages[$this->_namespace]);    }    /**     * getMessages() - Get messages from a specific namespace     *     * @return array     */    public function getMessages()    {        if ($this->hasMessages()) {            return self::$_messages[$this->_namespace];        }        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::$_messages[$this->_namespace]);            return true;        }        return false;    }    /**     * hasCurrentMessages() - check to see if messages have been added to current     * namespace within this request     *     * @return boolean     */    public function hasCurrentMessages()    {        return isset(self::$_session->{$this->_namespace});    }    /**     * getCurrentMessages() - get messages that have been added to the current     * namespace within this request     *     * @return array     */    public function getCurrentMessages()    {        if ($this->hasCurrentMessages()) {            return self::$_session->{$this->_namespace};        }        return array();    }    /**     * clear messages from the current request & current namespace     *     * @return boolean     */    public function clearCurrentMessages()    {        if ($this->hasCurrentMessages()) {            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);    }}


------分隔线----------------------------
------分隔线----------------------------

最新技术推荐