Which is the best way to display 'flash messages' in kohana v3?

后端 未结 5 1613
逝去的感伤
逝去的感伤 2021-02-04 13:52

I would like to know the best way to display flash messages in Kohana v3?

Some tutorials or examples would be helpful.

相关标签:
5条回答
  • 2021-02-04 14:12

    Have a look at this module, it might be what you are looking for https://github.com/daveWid/message

    0 讨论(0)
  • 2021-02-04 14:14

    I think the get_once is a great function, but what if you want to keep the data actually separate from the regular data, here's a basic class that overloads "Session" so that you can use "codeigniter" style flashdata calls with any data-store.

    <?php defined('SYSPATH') or die('No direct script access.');
    abstract class Session extends Kohana_Session {
    
    /**
     * This calls the parent Kohana_Session constructor and processes 
     * new flashdata to flashdata, and flashdata to old flashdata
     *
     * @param   array   configuration
     * @param   string  session id
     * @return  void
     * @uses    Kohana_Session::__construct
     */
    public function __construct(array $config = NULL, $id = NULL)
    {
        parent::__construct($config,$id);
    
        if(array_key_exists('___of',$this->_data)){
            //Remove old Flash data
            unset($this->_data['___of']);
        }
    
        if(array_key_exists('___flash',$this->_data)){
            //Move current last requests flash data to old flash data
            $this->_data['___of'] = $this->_data['___flash'];
            unset($this->_data['___flash']);
        }
    
        if(array_key_exists('___nf',$this->_data)){
            //Move Last Requests added data to the flash data
            $this->_data['___flash'] = $this->_data['___nf'];
            unset($this->_data['___nf']);
        }
    }
    
    /**
     * keeps a variable set in the sessions flashdata array.
     *
     *     $session->set_flashdata('foo', 'bar');
     *
     * @param   string   variable name
     * @param   ...
     * @return  $this
     */
    public function keep_flashdata($k)
    {
        $args = func_get_args();
    
        if(array_key_exists('___of',$this->_data)){
            foreach($args as $key){
                if(array_key_exists($key,$this->_data['___of'])){
                    //So we were going to trash it...
                    $this->set_flashdata($k,$this->_data['___of'][$key],true);
                }
            }
        }
    
        $this->_data['___nf'][$key] = $value;
    
        return $this;
    }
    
    /**
     * Set a variable in the sessions flashdata array.
     *
     *     $session->set_flashdata('foo', 'bar');
     *
     * @param   string   variable name
     * @param   mixed    value
     * @return  $this
     */
    public function set_flashdata($key, $value, $current=false)
    {
        if(!array_key_exists('___nf',$this->_data)){
            $this->_data['___nf'] = array();
        }
    
        $this->_data['___nf'][$key] = $value;
    
        if($current){
            if(!array_key_exists('___flash',$this->_data)){
                $this->_data['___flash'] = array();
            }
            $this->_data['flash'][$key] = $value;
        }
    
        return $this;
    }
    
    /**
     * Set a variable by reference in the sessions flashdata array.
     *
     *     $session->bind_flashdata('foo', $foo);
     *
     * @param   string  variable name
     * @param   mixed   referenced value
     * @return  $this
     */
    public function bind_flashdata($key, & $value)
    {
        if(!array_key_exists('___nf',$this->_data)){
            $this->_data['___nf'] = array();
        }
    
        $this->_data['___nf'][$key] =& $value;
    
        return $this;
    }
    
    /**
     * Removes a variable in the session array.
     *
     *     $session->delete_flashdata('foo');
     *
     * @param   string  variable name
     * @param   ...
     * @return  $this
     */
    public function delete_flashdata($key)
    {
        $args = func_get_args();
    
        if(array_key_exists('___nf',$this->_data)){
            foreach ($args as $key)
            {
                if(array_key_exists($key,$this->_data['___nf'])){
                    unset($this->_data['___nf'][$key]);
                }
            }
        }
        return $this;
    }
    
    /**
     * Get a variable from the sessions flashdata array.
     *
     *     $foo = $session->get_flashdata('foo');
     *
     * @param   string   variable name
     * @param   mixed    default value to return
     * @return  mixed
     */
    public function get_flashdata($key, $default = NULL)
    {
        if(array_key_exists('___flash',$this->_data) && array_key_exists($key,$this->_data['___flash'])){
            return $this->_data['___flash'][$key];
        } else if(array_key_exists('___nf',$this->_data) && array_key_exists($key,$this->_data['___nf'])){
            return $this->_data['___nf'][$key];
        }
    
        return $default;
    }
    
    /**
     * Get and delete a variable from the session array.
     *
     *     $bar = $session->get_once('bar');
     *
     * @param   string  variable name
     * @param   mixed   default value to return
     * @return  mixed
     */
    public function get_flashdata_once($key, $default = NULL)
    {
        $value = $this->get_flashdata($key, $default);
    
        if(array_key_exists($key, $this->_data['___flash'])){
            unset($this->_data['___flash'][$key]);
        }
    
        if(array_key_exists($key, $this->_data['___nf'])){
            unset($this->_data['___nf'][$key]);
        }
    
        return $value;
    }
    }
    ?>
    

    I realize there was an answer to this, and like i stated before, the get_once method is great and all, but i enjoy auto garbage collection much more.

    If you have any improvements on this code, let me know, its been great to me so far.

    0 讨论(0)
  • 2021-02-04 14:19

    I am using https://github.com/synapsestudios/kohana-notices in my project and I am very happy with it.

    0 讨论(0)
  • 2021-02-04 14:24

    I've written a really simple class for this once. Check it out below. Usage examples below

    class Notice {
        private static $session;
        private static $initialized = false;
    
        // current notices
        private static $notices = array();
    
        function __construct() {
        }
    
        static function init() {
            self::$session = Session::instance();
            self::$notices['current'] = json_decode(self::$session->get_once('flash'));
            if(!is_array(self::$notices['current'])) self::$notices['current'] = array();
            self::$initialized = true;
        }
    
        static function add($notice, $key=null) {
            if(!self::$initialized) self::init();
            if(!is_null($key)) {
                self::$notices['new'][$key] = $notice;
            } else {
                self::$notices['new'][] = $notice;
            }
            self::$session->set('flash', json_encode(self::$notices['new']));
            return true;
        }
    
        static function get($item = null) {
            if(!self::$initialized) self::init();
            if($item == null) {
                return self::$notices['current'];
            }
            if(!array_key_exists($item, self::$notices['current']))
                    return null;
            return self::$notices['current'][$item];
        }
    }
    

    Examples (provided this class is saved as APPPATH . 'classes/notice.php'):

    Notice::add('Something great has happened!');
    Notice::add('Exciting! I\'ve got something to tell you!', 'message');
    
    echo Notice::get('message'); // "Exciting! I've got ..."
    foreach(Notice::get() as $message) {
       echo $i++ . $message .'<br />';
    }
    

    EDIT: funny... for some reason this question popped up somewhere, didn't notice it was a really old one... sorry for that!

    0 讨论(0)
  • 2021-02-04 14:29

    Do you mean like Kohana 2.x's flash session variables?

    The latest Kohana supports get_once() which is pretty similar to the old flash session variables.

    $session = Session::instance();
    
    $session->set('test', 'Hello, World!');
    
    // The session variable is returned and removed.
    $test = $session->get_once('test');
    
    0 讨论(0)
提交回复
热议问题