* @link https://github.com/phpalchemy/phpalchemy * @copyright Copyright 2012 Erik Amaru Ortiz * @license http://www.opensource.org/licenses/mit-license.php MIT License * @package Maveriks\Pattern\Mvc */ abstract class View { /** * Contains all variables that are available on template file * * @var array */ protected $data = array(); /** * Contains the absolute paths where templates are stored * * @var array */ protected $templateDir = array(); /** * Contains the absolute path where the engine store the cache files * * @var string */ protected $cacheDir = ''; /** * String to store the output string that is sent by http response * * @var string */ protected $content = ''; /** * Relative path of template file * * @var string */ protected $tpl = ''; /** * Cache flag to specify if templating cache is enabled or not * * @var string */ protected $cache = false; /** * Charset Encodig * * @var string */ protected $charset = 'UTF-8'; /** * Debug flag to indicate to template engine is a debug environment * Defaults false * * @var bool */ public $debug = false; /** * @param string $tpl template file */ public function __construct($tpl = '') { $this->tpl = $tpl; } /** * Sets template file path (absolute or partial path) * * @param string $tpl contains the path of template file */ public function setTpl($tpl) { $this->tpl = $tpl; } /** * Gets template file */ public function getTpl() { return $this->tpl; } /** * Sets the base path where the engine can be find all templates * * @param string $path contains the absolute path where templates are stored */ public function setTemplateDir($path) { $this->templateDir[] = $path; } /** * Gets the templates files base path * * @return array returns the templates base path */ public function getTemplateDir() { return $this->templateDir; } /** * Sets cache directory path * * @param string $path cache directory path */ public function setCacheDir($dir) { $this->cacheDir = $dir; if (! is_dir($this->cacheDir)) { $this->createDir($this->cacheDir); } } /** * Gets cache directory path * * @return string contains cache directory path */ public function getCacheDir() { return $this->cacheDir; } /** * Enable/Disable templating cache * * @param bool $value boolean value to enable or not cache */ public function enableCache($value) { $this->cache = $value ? true: false; } /** * Enable/Disable debug mode of template engine * * @param bool $value boolean value to enable or not debug mode */ public function enableDebug($value) { $this->debug = $value ? true: false; } /** * Sets charset encoding for template engine * @param string $charset conatins a valid charset like UTF-8, ISO-8859-1 (latin), etc. */ public function setCharset($charset) { $this->charset = $charset; } /** * Gets charset encoding * * @return string charset encoding */ public function getCharset() { return $this->charset; } /** * Alias of method assign() * * @param string $name name or key to store teh value passed * @param string $value variable value */ public function set($name, $value = null) { $this->assign($name, $value); } /** * Assings a variable to the template file * * @param string $name name or key to store teh value passed * @param string $value variable value */ public function assign($name, $value = null) { if (is_string($name)) { return $this->data[$name] = $value; } if (is_array($name)) { $this->assignFromArray($name); return null; } throw new \InvalidArgumentException("Invalid data type for key, '" .gettype($name) . "' given."); } /** * Gets a variable that was previously assigned * * @param string $name name or key to store teh value passed * @param string $value variable value */ public function get($name) { if (!isset($this->data[$name])) { throw new \InvalidArgumentException("Variable '$name' doesn't exist."); } return $this->data[$name]; } public function exists($name) { return array_key_exists($name, $this->data); } /** * Gets final template parsed output string * * @return string parsed output */ public function getOutput() { $output = ''; \ob_start(); $this->render(); $output = \ob_get_contents(); \ob_end_clean(); return $output; } /** * Render the output string (To override by child class) */ abstract public function render(); /** * Multiple variable assignment * * @param array $data associative array conatining variables, the keys are used as variables names */ protected function assignFromArray($data) { if (! is_array($data)) { throw new \InvalidArgumentException( "Invalid data type: argument should be array, '" .gettype($data) . "' given." ); } foreach ($data as $key => $value) { $this->assign($key, $value); } } protected function createDir($strPath, $rights = 0777) { $folderPath = array($strPath); $oldumask = umask(0); while (!@is_dir(dirname(end($folderPath))) && dirname(end($folderPath)) != '/' && dirname(end($folderPath)) != '.' && dirname(end($folderPath)) != '' ) { array_push($folderPath, dirname(end($folderPath))); } while ($parentFolderPath = array_pop($folderPath)) { if (! @is_dir($parentFolderPath)) { if (! @mkdir($parentFolderPath, $rights)) { throw new \Exception("Templating Engine Error: Can't create folder '$parentFolderPath'"); } } } umask($oldumask); } }