Welcome Guest, Not a member yet? Register   Sign In
Sessions with Namespaces
#1

(This post was last modified: 06-08-2016, 10:16 PM by SomeGuy.)

MY_Session extension for CI_Session that will namespace session data. Useful when a site has multiple "portals" (admin, member, etc) and a common codebase (userdata could be shared across multiple portal logins, etc). I'd like to see this in core, but there may be reasons why name spacing may not be desirable?

There should probably be a few new methods added to handle shared data accessible from all namespaces.

public function set_shareddata($key, $value); // Would be a copy of CI_Session:Confusedet_userdata();
public function unset_shareddata($key); // Would be a copy of CI_Session::unset_userdata();
public function shareddata($key); // Would be a copy of CI_Session::userdata();
public function &get_shareddata(); // Would be a copy of CI_Session::&get_userdata();

/application/config/config.php
PHP Code:
...

/* 
|
| Set the session namespace.
| Useful for isolating session keys within portals.
| E.g. Admin area, member area, etc.
|
*/

$dir explode('/'ltrim(getenv('request_uri'), '/'));
$dir strtolower(array_shift($dir));

if( ! empty(
$dir) && in_array($dir, array('admin''account')))
{
$config['sess_namespace'] = $dir;
}
else
{
$config['sess_namespace'] = 'public';
}

... 

/application/libraries/Session/MY_Session.php
PHP Code:
<?php defined('BASEPATH') OR exit('No direct script access allowed');

/**
 * CodeIgniter Session Class Extension
 *
 * Allow for namespacing of session data. Useful within portals.
 *
 * Set namespace in config/config.php
 * $config['sess_namespace'] = 'MyNamespace';
 * 
 * Defaults namespace to 'public'
 *
 * @package CodeIgniter
 * @subpackage Libraries
 * @category Sessions
 *
 * @author Andrey Andreev
 * @author Sean Benoit
**/

class MY_Session extends CI_Session {
 public function 
__construct(array $params = array()) 
 {
 if(
NULL === ($default_namespace config_item('sess_namespace')))
 {
 
$default_namespace 'public';
 }

 isset(
$params['namespace']) OR $params['namespace'] = $default_namespace;
 
parent::__construct($params);
 }

 protected function 
_ci_init_vars()
 {
 if ( ! empty(
$_SESSION['__ci_vars']) && !empty($_SESSION['__ci_vars'][$this->_config['namespace']]))
 {
 
$current_time time();

 foreach (
$_SESSION['__ci_vars'][$this->_config['namespace']] as $key => &$value)
 {
 if (
$value === 'new')
 {
 
$_SESSION['__ci_vars'][$this->_config['namespace']][$key] = 'old';
 }
 
// Hacky, but 'old' will (implicitly) always be less than time() ;)
 // DO NOT move this above the 'new' check!
 
elseif ($value $current_time)
 {
 unset(
$_SESSION[$key], $_SESSION[$this->_config['namespace']][$key], $_SESSION['__ci_vars'][$this->_config['namespace']][$key]);
 }
 }

 if (empty(
$_SESSION['__ci_vars'][$this->_config['namespace']])) 
 {
 unset(
$_SESSION['__ci_vars'][$this->_config['namespace']]);
 }

 if (empty(
$_SESSION['__ci_vars']))
 {
 unset(
$_SESSION['__ci_vars']);
 }
 }

 
$this->userdata =& $_SESSION;
 }

 public function 
__isset($key)
 {
 if (
$key === 'session_id')
 {
 return (
session_status() === PHP_SESSION_ACTIVE);
 }

 return isset(
$_SESSION[$this->_config['namespace']], $_SESSION[$this->_config['namespace']][$key]);
 }

 public function 
__set($key$value)
 {
 if( ! isset(
$_SESSION[$this->_config['namespace']]))
 {
 
$_SESSION[$key][$this->_config['namespace']] = array();
 }

 
$_SESSION[$this->_config['namespace']][$key] = $value;
 }

 public function 
__get($key)
 {
 
// Note: Keep this order the same, just in case somebody wants to
 //       use 'session_id' as a session data key, for whatever reason
 
if (isset($_SESSION[$this->_config['namespace']], $_SESSION[$this->_config['namespace']][$key]))
 {
 return 
$_SESSION[$this->_config['namespace']][$key];
 }
 elseif (
$key === 'session_id')
 {
 return 
session_id();
 }

 return 
NULL;
 }

 public function 
mark_as_temp($key$ttl 300)
 {
 
$ttl += time();

 if (
is_array($key))
 {
 
$temp = array();

 foreach (
$key as $k => $v)
 {
 
// Do we have a key => ttl pair, or just a key?
 
if (is_int($k))
 {
 
$k $v;
 
$v $ttl;
 }
 else
 {
 
$v += time();
 }

 if ( ! isset(
$_SESSION[$this->_config['namespace']], $_SESSION[$this->_config['namespace']][$k]))
 {
 return 
FALSE;
 }

 
$temp[$k] = $v;
 }

 
$_SESSION['__ci_vars'] = isset($_SESSION['__ci_vars']) ? $_SESSION['__ci_vars'] : array();

 
$_SESSION['__ci_vars'][$this->_config['namespace']] = isset($_SESSION['__ci_vars'][$this->_config['namespace']])
 ? 
array_merge($_SESSION['__ci_vars'][$this->_config['namespace']], $temp)
 : 
$temp;

 return 
TRUE;
 }

 if ( ! isset(
$_SESSION[$this->_config['namespace']], $_SESSION[$this->_config['namespace']][$key]))
 {
 return 
FALSE;
 }

 
$_SESSION['__ci_vars'][$this->_config['namespace']][$key] = $ttl;
 return 
TRUE;
 }

 public function 
get_temp_keys()
 {
 if ( ! isset(
$_SESSION['__ci_vars'], $_SESSION['__ci_vars'][$this->_config['namespace']]))
 {
 return array();
 }

 
$keys = array();
 foreach (
array_keys($_SESSION['__ci_vars'][$this->_config['namespace']]) as $key)
 {
 
is_int($_SESSION['__ci_vars'][$this->_config['namespace']][$key]) && $keys[] = $key;
 }

 return 
$keys;
 }

 public function 
userdata($key NULL)
 {
 if (isset(
$key))
 {
 return isset(
$_SESSION[$this->_config['namespace']], $_SESSION[$this->_config['namespace']][$key]) ? $_SESSION[$this->_config['namespace']][$key] : NULL;
 }
 elseif (empty(
$_SESSION) || empty($_SESSION[$this->_config['namespace']]))
 {
 return array();
 }

 
$userdata = array();
 
$_exclude array_merge(
 array(
'__ci_vars'),
 
$this->get_flash_keys(),
 
$this->get_temp_keys()
 );

 foreach (
array_keys($_SESSION[$this->_config['namespace']]) as $key)
 {
 if ( ! 
in_array($key$_excludeTRUE))
 {
 
$userdata[$key] = $_SESSION[$this->_config['namespace']][$key];
 }
 }

 return 
$userdata;
 }

 public function &
get_userdata()
 {
 if(!isset(
$_SESSION[$this->_config['namespace']])) 
 {
 return array();
 }

 return 
$_SESSION[$this->_config['namespace']];
 }

 public function 
set_userdata($data$value NULL)
 {
 if( ! isset(
$_SESSION[$this->_config['namespace']]))
 {
 
$_SESSION[$this->_config['namespace']] = array();
 }

 if (
is_array($data))
 {
 foreach (
$data as $key => &$value)
 {
 
$_SESSION[$this->_config['namespace']][$key] = $value;
 }

 return;
 }

 
$_SESSION[$this->_config['namespace']][$data] = $value;
 }

 public function 
unset_userdata($key)
 {
 if( ! isset(
$_SESSION[$this->_config['namespace']]))
 {
 return;
 }

 if (
is_array($key))
 {
 foreach (
$key as $k)
 {
 unset(
$_SESSION[$this->_config['namespace']][$k]);
 }

 return;
 }

 unset(
$_SESSION[$this->_config['namespace']][$key]);
 }

 public function 
has_userdata($key)
 {
 return isset(
$_SESSION[$this->_config['namespace']]) && isset($_SESSION[$key]);
 }

 public function 
flashdata($key NULL)
 {
 if (isset(
$key))
 {
 return (isset(
$_SESSION['__ci_vars'], $_SESSION['__ci_vars'][$this->_config['namespace']], $_SESSION['__ci_vars'][$this->_config['namespace']][$key], $_SESSION[$this->_config['namespace']], $_SESSION[$this->_config['namespace']][$key]) && ! is_int($_SESSION['__ci_vars'][$this->_config['namespace']][$key]))
 ? 
$_SESSION[$this->_config['namespace']][$key]
 : 
NULL;
 }

 
$flashdata = array();

 if ( ! empty(
$_SESSION['__ci_vars']) && ! empty($_SESSION['__ci_vars'][$this->_config['namespace']]))
 {
 foreach (
$_SESSION['__ci_vars'][$this->_config['namespace']] as $key => &$value)
 {
 
is_int($value) OR $flashdata[$key] = $_SESSION[$this->_config['namespace']][$key];
 }
 }

 return 
$flashdata;
 }

 public function 
set_flashdata($data$value NULL)
 {
 
$this->set_userdata($data$value);
 
$this->mark_as_flash(is_array($data) ? array_keys($data) : $data);
 }

 public function 
mark_as_flash($key)
 {
 if (
is_array($key))
 {
 for (
$i 0$c count($key); $i $c$i++)
 {
 if ( ! isset(
$_SESSION[$this->_config['namespace']], $_SESSION[$this->_config['namespace']][$key[$i]]))
 {
 return 
FALSE;
 }
 }

 
$new array_fill_keys($key'new');

 
$_SESSION['__ci_vars'] = isset($_SESSION['__ci_vars']) ? $_SESSION['__ci_vars'] : array();

 
$_SESSION['__ci_vars'][$this->_config['namespace']] = isset($_SESSION['__ci_vars'][$this->_config['namespace']])
 ? 
array_merge($_SESSION['__ci_vars'][$this->_config['namespace']], $new)
 : 
$new;

 return 
TRUE;
 }

 if ( ! isset(
$_SESSION[$this->_config['namespace']], $_SESSION[$this->_config['namespace']][$key]))
 {
 return 
FALSE;
 }

 
$_SESSION['__ci_vars'][$this->_config['namespace']][$key] = 'new';
 return 
TRUE;
 }

 public function 
unmark_flash($key)
 {
 if (empty(
$_SESSION['__ci_vars']) || empty($_SESSION['__ci_vars'][$this->_config['namespace']]))
 {
 return;
 }

 
is_array($key) OR $key = array($key);

 foreach (
$key as $k)
 {
 if (isset(
$_SESSION['__ci_vars'][$this->_config['namespace']], $_SESSION['__ci_vars'][$this->_config['namespace']][$k]) && ! is_int($_SESSION['__ci_vars'][$this->_config['namespace']][$k]))
 {
 unset(
$_SESSION['__ci_vars'][$this->_config['namespace']][$k]);
 }
 }

 if (empty(
$_SESSION['__ci_vars'][$this->_config['namespace']]))
 {
 unset(
$_SESSION['__ci_vars'][$this->_config['namespace']]);
 }

 if (empty(
$_SESSION['__ci_vars']))
 {
 unset(
$_SESSION['__ci_vars']);
 }
 }


 public function 
get_flash_keys()
 {
 if ( ! isset(
$_SESSION['__ci_vars'], $_SESSION['__ci_vars'][$this->_config['namespace']]))
 {
 return array();
 }

 
$keys = array();
 foreach (
array_keys($_SESSION['__ci_vars'][$this->_config['namespace']]) as $key)
 {
 
is_int($_SESSION['__ci_vars'][$this->_config['namespace']][$key]) OR $keys[] = $key;
 }

 return 
$keys;
 }

 public function 
sess_destory() {
 unset(
$_SESSION[$this->_config['namespace']]);
 
 if(empty(
$_SESSION))
 {
 
session_destroy();
 }
 }

 public function 
tempdata($key NULL)
 {
 if (isset(
$key))
 {
 return (isset(
$_SESSION['__ci_vars'], $_SESSION['__ci_vars'][$this->_config['namespace']], $_SESSION['__ci_vars'][$this->_config['namespace']][$key], $_SESSION[$key]) && is_int($_SESSION['__ci_vars'][$this->_config['namespace']][$key]))
 ? 
$_SESSION[$this->_config['namespace']][$key]
 : 
NULL;
 }

 
$tempdata = array();

 if ( ! empty(
$_SESSION['__ci_vars']) && ! empty($_SESSION['__ci_vars'][$this->_config['namespace']]))
 {
 foreach (
$_SESSION['__ci_vars'][$this->_config['namespace']] as $key => &$value)
 {
 
is_int($value) && $tempdata[$key] = $_SESSION[$this->_config['namespace']][$key];
 }
 }

 return 
$tempdata;
 }

 public function 
unmark_temp($key)
 {
 if (empty(
$_SESSION['__ci_vars']) || empty($_SESSION['__ci_vars'][$this->_config['namespace']]))
 {
 return;
 }

 
is_array($key) OR $key = array($key);

 foreach (
$key as $k)
 {
 if (isset(
$_SESSION['__ci_vars'][$this->_config['namespace']], $_SESSION['__ci_vars'][$this->_config['namespace']][$k]) && is_int($_SESSION['__ci_vars'][$this->_config['namespace']][$k]))
 {
 unset(
$_SESSION['__ci_vars'][$this->_config['namespace']][$k]);
 }
 }

 if (empty(
$_SESSION['__ci_vars'][$this->_config['namespace']]))
 {
 unset(
$_SESSION['__ci_vars'][$this->_config['namespace']]);
 }

 if (empty(
$_SESSION['__ci_vars']))
 {
 unset(
$_SESSION['__ci_vars']);
 }
 }

Reply




Theme © iAndrew 2016 - Forum software by © MyBB