Current Directory: /home/astoriaah/www/templates/yootheme-BK/vendor/yootheme/framework/modules/view/src
Viewing File: /home/astoriaah/www/templates/yootheme-BK/vendor/yootheme/framework/modules/view/src/View.php
<?php
namespace YOOtheme;
use YOOtheme\Util\Str;
class View implements \ArrayAccess
{
/**
* @var \SplStack
*/
protected $loader;
/**
* @var array
*/
protected $template = [];
/**
* @var array
*/
protected $parameters = [];
/**
* @var array
*/
protected $filters = [];
/**
* @var array
*/
protected $globals = [];
/**
* @var array
*/
protected $helpers = [];
/**
* @var array
*/
protected $functions = [];
/**
* Constructor.
*
* @param callable $loader
*/
public function __construct(callable $loader = null)
{
$this->loader = new \SplStack();
$this->loader->push([$this, 'evaluate']);
if ($loader) {
$this->addLoader($loader);
}
$this->addFunction('e', [$this, 'escape']);
}
/**
* Handles dynamic calls to the class.
*
* @param string $name
* @param array $args
* @return mixed
*/
public function __call($name, $args)
{
if (!isset($this->functions[$key = strtolower($name)])) {
trigger_error(sprintf('Call to undefined method %s::%s()', get_class($this), $name), E_USER_ERROR);
}
return call_user_func_array($this->functions[$key], $args);
}
/**
* Gets the global parameters.
*
* @return array
*/
public function getGlobals()
{
return $this->globals;
}
/**
* Adds a global parameter.
*
* @param string $name
* @param mixed $value
* @return self
*/
public function addGlobal($name, $value)
{
$this->globals[$name] = $value;
return $this;
}
/**
* Adds a helper.
*
* @param string|callable $helper
* @return self
*/
public function addHelper($helper)
{
if (is_callable($helper)) {
$helper($this);
} elseif (class_exists($helper)) {
new $helper($this);
}
return $this;
}
/**
* Adds a custom function.
*
* @param string $name
* @param callable $callback
*/
public function addFunction($name, callable $callback)
{
$this->functions[strtolower($name)] = $callback;
return $this;
}
/**
* Adds a loader callback.
*
* @param callable $loader
* @param string $filter
* @return self
*/
public function addLoader(callable $loader, $filter = null)
{
if (is_null($filter)) {
$next = $this->loader->top();
$this->loader->push(function ($name, array $parameters = []) use ($loader, $next) {
return $loader($name, $parameters, $next);
});
} else {
$this->filters[$filter][] = $loader;
}
return $this;
}
/**
* Applies multiple functions.
*
* @param mixed $value
* @param string $functions
* @return string
*/
public function apply($value, $functions)
{
$functions = explode('|', strtolower($functions));
return array_reduce($functions, function ($value, $function) {
return call_user_func([$this, $function], $value);
}, $value);
}
/**
* Converts special characters to HTML entities.
*
* @param string $value
* @param string $functions
* @return string
*/
public function escape($value, $functions = '')
{
if ($functions) {
$value = $this->apply($value, $functions);
}
return htmlspecialchars($value, ENT_COMPAT, 'UTF-8');
}
/**
* Renders a template.
*
* @param string $name
* @param mixed $parameters
* @return string|false
*/
public function render($name, $parameters = [])
{
if (is_callable($parameters)) {
return function () use ($name, $parameters) {
return $this->render($name, call_user_func_array($parameters, func_get_args()) ?: []);
};
}
$next = $this->loader->top();
foreach ($this->filters as $filter => $loaders) {
if (!Str::is($filter, $name)) {
continue;
}
foreach ($loaders as $loader) {
$next = function ($name, array $parameters = []) use ($loader, $next) {
return $loader($name, $parameters, $next);
};
}
}
return $next($name, array_replace(end($this->parameters) ?: $this->globals, $parameters));
}
/**
* Renders current template.
*
* @param mixed $parameters
* @return string|false
*/
public function self($parameters = [])
{
return $this->render(end($this->template), $parameters);
}
/**
* Evaluates a template.
*
* @param string $template
* @param array $parameters
* @return string|false
*/
public function evaluate($template, array $parameters = [])
{
$this->template[] = $template;
$this->parameters[] = $parameters;
unset($template, $parameters);
extract(end($this->parameters), EXTR_SKIP);
if (is_file(end($this->template))) {
ob_start();
require end($this->template);
$result = ob_get_clean();
}
array_pop($this->template);
array_pop($this->parameters);
return isset($result) ? $result : false;
}
/**
* Checks if a helper is registered.
*
* @param string $name
* @return bool
*/
public function offsetExists($name)
{
return isset($this->helpers[$name]);
}
/**
* Gets a helper.
*
* @param string $name
* @return mixed
*/
public function offsetGet($name)
{
if (!$this->offsetExists($name)) {
throw new \InvalidArgumentException(sprintf('Undefined helper "%s"', $name));
}
return $this->helpers[$name];
}
/**
* Sets a helper.
*
* @param string $name
* @param object $helper
*/
public function offsetSet($name, $helper)
{
$this->helpers[$name] = $helper;
}
/**
* Removes a helper.
*
* @param string $name
*/
public function offsetUnset($name)
{
throw new \LogicException(sprintf('You can\'t remove a helper "%s"', $name));
}
}