Current File : /home/kelaby89/jrncommunityhousing.charity/wp-content/plugins/give/src/Session/Accessor.php |
<?php
namespace Give\Session;
use Give\Framework\Exceptions\Primitives\InvalidArgumentException;
use stdClass;
/**
* Class Access
*
* In legacy core session data load in array which contains multiple keys like give_purchase, receipt_access etc.
* This class helps to convert them into objects. Every subclass will treat a specific key as group of session data.
*
* @package Give\Session
*/
abstract class Accessor
{
/**
* Session Id.
*
* @var string
*/
protected $sessionKey;
/**
* Session data as array.
*
* We use this array internally to perform database related operations.
*
* @var mixed
*/
protected $data;
/**
* Session data as object.
* Session data in object format will be return when query.
*
* @var stdClass
*/
protected $dataObj;
/**
* Class constructor.
*/
public function __construct()
{
$this->get();
}
/**
* Convert session data to object.
*
* @since 2.7.0
*
* @param array $data
*
* @return stdClass
*/
protected function convertToObject($data)
{
$dataObj = new stdClass();
$data = $this->renameArrayKeysToPropertyNames($data);
foreach ($data as $key => $value) {
if (is_array($value)) {
$dataObj->{$key} = $this->convertToObject($value);
continue;
}
$dataObj->{$key} = $value;
}
return $dataObj;
}
/**
* Get data from session.
*
* @since 2.7.0
* @return stdClass
*/
public function get()
{
if ($this->dataObj) {
return $this->dataObj;
}
$this->data = Give()->session->get($this->sessionKey, $this->data);
$this->dataObj = $this->convertToObject($this->data);
return $this->dataObj;
}
/**
* Get data from session.
*
* @since 2.7.0
*
* @param string $key
*
* @return stdClass
*/
public function getByKey($key)
{
$result = null;
if (null !== $this->dataObj) {
$result = property_exists($this->dataObj, $key) ? $this->dataObj->{$key} : $result;
}
return $result;
}
/**
* Save/Replace/Remove data into session
*
* @param string $key
* @param mixed $data
*
* @return string
*/
public function store($key, $data)
{
$this->validateData($data);
if ( ! empty($this->data[$key])) {
// Merge data.
$this->data[$key] = array_merge(
$this->data[$key],
$data
);
} else {
$this->data[$key] = $data;
}
return $this->set();
}
/**
* Store data into session.
*
* @since 2.7.0
* @return string
*/
protected function set()
{
$this->dataObj = $this->convertToObject($this->data);
return Give()->session->set($this->sessionKey, $this->data);
}
/**
* Replace session data.
*
* @since 2.7.0
*
* @param mixed $data
*
* @param string $key
*
* @return string
*/
public function replace($key, $data)
{
$this->validateData($data);
$this->data[$key] = $data;
return $this->set();
}
/**
* Delete session data.
*
* @since 2.7.0
*
* @param string $key
*
* @return string
*/
public function delete($key)
{
if (array_key_exists($key, $this->data)) {
unset($this->data[$key]);
}
return $this->set();
}
/**
* Return session data in array format.
*
* @since 2.7.0
* @return array
*/
public function toArray()
{
return $this->data;
}
/**
* Rename array key to property name
*
* @since 2.7.0
*
* @param array $data
*
* @return array
*/
protected function renameArrayKeysToPropertyNames($data)
{
foreach ($data as $key => $value) {
// Convert array key string to property name.
// Remove other then char, dash, give related prefix and hyphen and prefix.
$newName = preg_replace('/[^a-zA-Z0-9_\-]/', '', $key);
$newName = preg_replace('/(-|_)?give(-|_)?/', '', $newName);
$keyParts = preg_split('/(-|_)/', $newName);
$keyParts = array_map('ucfirst', array_filter($keyParts));
$newName = lcfirst(implode('', $keyParts));
// Remove old key/value pair if renamed.
if ($key !== $newName) {
unset($data[$key]);
}
if (is_array($value)) {
// Process array.
$data[$newName] = $this->renameArrayKeysToPropertyNames($value);
continue;
}
$data[$newName] = $value;
}
return $data;
}
/**
* Validate data.
*
* @since 2.7.0
*
* @param mixed $data
*
*/
protected function validateData($data)
{
if (is_array($data) && isset($data[0])) {
throw new InvalidArgumentException('Invalid value. Please pass an associative array');
}
}
}