Which is the best way to display 'flash messages' in kohana v3?
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');
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.