*/
protected $_session = NULL;
- /**
- * Current php Session ID : needed to detect if the session is changed
- *
- * @var string
- */
- protected $sessionID;
-
/**
* We only need one instance of this object. So we use the singleton
* pattern and cache the instance in this variable
return self::$_singleton;
}
+ /**
+ * Replace the session object with a fake session.
+ */
+ public static function useFakeSession() {
+ self::$_singleton = new class() extends CRM_Core_Session {
+
+ public function initialize($isRead = FALSE) {
+ if ($isRead) {
+ return;
+ }
+
+ if (!isset($this->_session)) {
+ $this->_session = [];
+ }
+
+ if (!isset($this->_session[$this->_key]) || !is_array($this->_session[$this->_key])) {
+ $this->_session[$this->_key] = [];
+ }
+ }
+
+ public function isEmpty() {
+ return empty($this->_session);
+ }
+
+ };
+ self::$_singleton->_session = NULL;
+ // This is not a revocable proposition. Should survive, even with things 'System.flush'.
+ if (!defined('_CIVICRM_FAKE_SESSION')) {
+ define('_CIVICRM_FAKE_SESSION', TRUE);
+ }
+ return self::$_singleton;
+ }
+
/**
* Creates an array in the session.
*
* Is this a read operation, in this case, the session will not be touched.
*/
public function initialize($isRead = FALSE) {
- // remove $_SESSION reference if session is changed
- if (($sid = session_id()) !== $this->sessionID) {
- $this->_session = NULL;
- $this->sessionID = $sid;
+ // reset $this->_session in case if it is no longer a reference to $_SESSION;
+ if (isset($_SESSION) && isset($this->_session) && $_SESSION !== $this->_session) {
+ unset($this->_session);
}
// lets initialize the _session variable just before we need it
// hopefully any bootstrapping code will actually load the session from the CMS
unset($this->_session[$this->_key]);
}
else {
- $this->_session = [];
+ $this->_session[$this->_key] = [];
+ unset($this->_session);
}
-
}
/**
if (!is_numeric($session->get('userID'))) {
return NULL;
}
- return $session->get('userID');
+ return (int) $session->get('userID');
}
/**