Files
nibiru-framework.com/core/l/Dwoo/Data.php
2017-06-16 12:21:21 +02:00

265 lines
7.4 KiB
PHP

<?php
/**
* Copyright (c) 2013-2017
*
* @category Library
* @package Dwoo
* @author Jordi Boggiano <j.boggiano@seld.be>
* @author David Sanchez <david38sanchez@gmail.com>
* @copyright 2008-2013 Jordi Boggiano
* @copyright 2013-2017 David Sanchez
* @license http://dwoo.org/LICENSE Modified BSD License
* @version 1.3.4
* @date 2017-03-01
* @link http://dwoo.org/
*/
namespace Dwoo;
/**
* Dwoo data object, use it for complex data assignments or if you want to easily pass it
* around multiple functions to avoid passing an array by reference.
* This software is provided 'as-is', without any express or implied warranty.
* In no event will the authors be held liable for any damages arising from the use of this software.
*/
class Data implements IDataProvider
{
/**
* Data array.
*
* @var array
*/
protected $data = array();
/**
* Returns the data array.
*
* @return array
*/
public function getData()
{
return $this->data;
}
/**
* Clears a the entire data or only the given key.
*
* @param array|string $name clears only one value if you give a name, multiple values if
* you give an array of names, or the entire data if left null
*/
public function clear($name = null)
{
if ($name === null) {
$this->data = array();
} elseif (is_array($name)) {
foreach ($name as $index) {
unset($this->data[$index]);
}
} else {
unset($this->data[$name]);
}
}
/**
* Overwrites the entire data with the given array.
*
* @param array $data the new data array to use
*/
public function setData(array $data)
{
$this->data = $data;
}
/**
* merges the given array(s) with the current data with array_merge.
*
* @param array $data the array to merge
*/
public function mergeData(array $data)
{
$args = func_get_args();
foreach ($args as $key => $v) {
if (is_array($v)) {
$this->data = array_merge($this->data, $v);
}
}
}
/**
* Assigns a value or an array of values to the data object.
*
* @param array|string $name an associative array of multiple (index=>value) or a string
* that is the index to use, i.e. a value assigned to "foo" will be
* accessible in the template through {$foo}
* @param mixed $val the value to assign, or null if $name was an array
*/
public function assign($name, $val = null)
{
if (is_array($name)) {
reset($name);
foreach ($name as $k => $v){
$this->data[$k] = $v;
}
} else {
$this->data[$name] = $val;
}
}
/**
* Allows to assign variables using the object syntax.
*
* @param string $name the variable name
* @param string $value the value to assign to it
*/
public function __set($name, $value)
{
$this->assign($name, $value);
}
/**
* Assigns a value by reference to the data object.
*
* @param string $name the index to use, i.e. a value assigned to "foo" will be
* accessible in the template through {$foo}
* @param mixed $val the value to assign by reference
*/
public function assignByRef($name, &$val)
{
$this->data[$name] = &$val;
}
/**
* Appends values or an array of values to the data object.
*
* @param array|string $name an associative array of multiple (index=>value) or a string
* that is the index to use, i.e. a value assigned to "foo" will be
* accessible in the template through {$foo}
* @param mixed $val the value to assign, or null if $name was an array
* @param bool $merge true to merge data or false to append, defaults to false
*/
public function append($name, $val = null, $merge = false)
{
if (is_array($name)) {
foreach ($name as $key => $val) {
if (isset($this->data[$key]) && !is_array($this->data[$key])) {
settype($this->data[$key], 'array');
}
if ($merge === true && is_array($val)) {
$this->data[$key] = $val + $this->data[$key];
} else {
$this->data[$key][] = $val;
}
}
} elseif ($val !== null) {
if (isset($this->data[$name]) && !is_array($this->data[$name])) {
settype($this->data[$name], 'array');
} elseif (!isset($this->data[$name])) {
$this->data[$name] = array();
}
if ($merge === true && is_array($val)) {
$this->data[$name] = $val + $this->data[$name];
} else {
$this->data[$name][] = $val;
}
}
}
/**
* Appends a value by reference to the data object.
*
* @param string $name the index to use, i.e. a value assigned to "foo" will be
* accessible in the template through {$foo}
* @param mixed $val the value to append by reference
* @param bool $merge true to merge data or false to append, defaults to false
*/
public function appendByRef($name, &$val, $merge = false)
{
if (isset($this->data[$name]) && !is_array($this->data[$name])) {
settype($this->data[$name], 'array');
}
if ($merge === true && is_array($val)) {
foreach ($val as $key => &$value) {
$this->data[$name][$key] = &$value;
}
} else {
$this->data[$name][] = &$val;
}
}
/**
* Returns true if the variable has been assigned already, false otherwise.
*
* @param string $name the variable name
*
* @return bool
*/
public function isAssigned($name)
{
return isset($this->data[$name]);
}
/**
* Supports calls to isset($dwoo->var).
*
* @param string $name the variable name
*
* @return bool
*/
public function __isset($name)
{
return isset($this->data[$name]);
}
/**
* Unassigns/removes a variable.
*
* @param string $name the variable name
*/
public function unassign($name)
{
unset($this->data[$name]);
}
/**
* Supports unsetting variables using the object syntax.
*
* @param string $name the variable name
*/
public function __unset($name)
{
unset($this->data[$name]);
}
/**
* Returns a variable if it was assigned.
*
* @param string $name the variable name
*
* @return mixed
*/
public function get($name)
{
return $this->__get($name);
}
/**
* Allows to read variables using the object syntax.
*
* @param string $name the variable name
*
* @return mixed
* @throws Exception
*/
public function __get($name)
{
if (isset($this->data[$name])) {
return $this->data[$name];
} else {
throw new Exception('Tried to read a value that was not assigned yet : "' . $name . '"');
}
}
}