Revision: 41245
Updated Code
at June 7, 2013 06:54 by freelancephp
Updated Code
<?php /** * Lim_View Class * * View class that contains features like: * - Get vars inside the view in different ways: * 1) $var1 * 2) $this->var1 * 3) $this->getVar('var1', 'defaultValue') * - Manage content filters with priority * - Manage global vars and global filters, which will be available for all views * * @package View * @version 2.0.0 * @author Victor Villaverde Laan * @link http://www.freelancephp.net/lim_view-php-view-class/ * @license MIT license */ class Lim_View { /** * Containing global vars (available for all view instances) * @var array */ protected static $_globalVars = array(); /** * Containing global filter callbacks * @var array */ protected static $_globalFilters = array(); /** * Always able to use the php short open tag (<?= $var ?>), even when * short_open_tag is disabled in the php configuration * @var boolean */ protected static $_shortOpenTag = false; /** * Containing view paths * @var array */ protected static $_paths = array(); /** * View file path * @var string */ protected $_file = null; /** * View vars * @var array */ protected $_vars = array(); /** * Containing filter callbacks * @var array */ protected $_filters = array(); /** * Constructor * @param string $file Optional, can be set later */ public function __construct($file = null) { $this->setFile($file); } /** * Set or get php short open tag support (<?= $var ?>) * @param boolean $shortOpenTag Optional * @return boolean|void Returns php short tag support or nothing */ public static function shortOpenTag($shortOpenTag = null) { if ($shortOpenTag === null) return self::$_shortOpenTag; self::$_shortOpenTag = $shortOpenTag; } /** * Add view path * @param string|array $path */ public static function addPath($path) { if (is_array($path)) { foreach ($path as $val) self::$_paths[$val] = $val; } else { self::$_paths[$path] = $path; } } /** * Remove view path * @param string $path */ public static function removePath($path) { unset(self::$_paths[$path]); } /** * Get array of all paths * @return array */ public static function getPaths() { return self::$_paths; } /** * Remove all view paths */ public static function clearPaths() { foreach (self::$_paths as $path) self::removePath($path); } /** * Set the view file * @param string $file * @return $this */ public function setFile($file) { $this->_file = $file; return $this; } /** * Get the view file * @return string */ public function getFile() { return $this->_file; } /** * Check if view file exists * @param string $file Check if given view file exists * @return boolean */ public static function exists($file) { // check if file exists if (self::_fileExists($file)) return true; // check if file can be found in the paths foreach (self::$_paths as $path) { if (self::_fileExists($path . $file)) return true; } return false; } /** * Set (local) var * @param string|array $key Can also give array of values, f.e. array('var1' => 'value1', 'var2' => 'value2') * @param mixed $value Optional, default null * @return $this */ public function setVar($key, $value = null) { $keys = (is_array($key)) ? $key : array($key => $value); foreach ($keys as $k => $v) $this->_vars[$k] = $v; return $this; } /** * Set var * @param string $key * @param mixed $value */ public function __set($key, $value) { $this->setVar($key, $value); } /** * Get a var value (if not exists it will look for a global var with the given key) * @param string $key * @param mixed $defaultValue Optional, return default when key was not found * @param boolean $includeGlobalVars Optional, default true * @return mixed */ public function getVar($key, $defaultValue = null, $includeGlobalVars = true) { if (array_key_exists($key, $this->_vars)) return $this->_vars[$key]; if ($includeGlobalVars) { if (array_key_exists($key, self::$_globalVars)) return self::$_globalVars[$key]; } return $defaultValue; } /** * Get var value, also checks global vars * @param string $key * @return mixed */ public function __get($key) { if (!$this->hasVar($key)) $this->_throwException('Key "' . $key . '" was not set.'); return $this->getVar($key); } /** * Unset given (local) var * @param string|array $key Can also give array of keys to unset * @return $this */ public function unsetVar($key) { $keys = (is_array($key)) ? $key : array(0 => $key); foreach ($keys as $i => $k) { if (array_key_exists($k, $this->_vars)) unset($this->_vars[$k]); } return $this; } /** * Unset (local) var * @param string $key */ public function __unset($key) { $this->unsetVar($key); } /** * Check if given var exists * @param string $key * @param boolean $includeGlobalVars Optional, default true * @return boolean */ public function hasVar($key, $includeGlobalVars = true) { return (array_key_exists($key, $this->_vars) || ($includeGlobalVars && array_key_exists($key, self::$_globalVars))); } /** * Get all view vars * @return array */ public function getVars($includeGlobalVars = true) { return ($includeGlobalVars) ? array_merge(self::$_globalVars, $this->_vars) : $this->_vars; } /** * Unset all (local) vars * @param string $key * @return $this */ public function clearVars() { foreach ($this->_vars as $key => $val) $this->unsetVar($key); return $this; } /** * Set a global var (available for all views) * @param string|array $key Can also give array of values, f.e. array('var1' => 'value1', 'var2' => 'value2') * @param mixed $value Optional, default null */ public static function setGlobalVar($key, $value = null) { $keys = (is_array($key)) ? $key : array($key => $value); foreach ($keys as $k => $v) self::$_globalVars[$k] = $v; } /** * Set a global var (available for all views) * @param string $key * @param mixed $defaultValue Optional, return default when key was not found */ public static function getGlobalVar($key, $defaultValue = null) { if (array_key_exists($key, self::$_globalVars)) return self::$_globalVars[$key]; return $defaultValue; } /** * Unset global var * @param string|array $key Can also give array of keys to unset */ public static function unsetGlobalVar($key) { $keys = (is_array($key)) ? $key : array(0 => $key); foreach ($keys as $i => $k) { if (array_key_exists($k, self::$_globalVars)) unset(self::$_globalVars[$k]); } } /** * Check if global var exists * @param string $key * @return boolean */ public static function hasGlobalVar($key) { return array_key_exists($key, self::$_globalVars); } /** * Get array of all global vars * @return array */ public static function getGlobalVars() { return self::$_globalVars; } /** * Unset all global vars */ public static function clearGlobalVars() { foreach (self::$_globalVars as $key => $val) self::unsetGlobalVar($key); } /** * Set filter callback. 2 parameters will be passed on to the callback function: * (1) $content: rendered content * (2) $view: this view object * @param mixed $callback * @param string $key Optional * @param integer $priority Optional, default 10 * @return $this */ public function addFilter($callback, $key = null, $priority = 10) { $cb = array('callback' => $callback, 'priority' => $priority); if ($key === null) { $this->_filters[] = $cb; } else { $this->_filters[$key] = $cb; } return $this; } /** * Remove filter * @param string $key * @return $this */ public function removeFilter($key) { if (array_key_exists($key, $this->_filters)) unset($this->_filters[$key]); return $this; } /** * Check if filter exists * @param string $key * @param boolean $includeGlobalFilters Optional, default true * @return boolean */ public function hasFilter($key, $includeGlobalFilters = true) { return (array_key_exists($key, $this->_filters) || ($includeGlobalFilters && array_key_exists($key, self::$_globalFilters))); } /** * Get filter * @param boolean $includeGlobalFilters Optional, default true * @param boolean $prioritizedOrder * @return array */ public function getFilters($includeGlobalFilters = true, $prioritizedOrder = false) { $filters = ($includeGlobalFilters) ? array_merge(self::$_globalFilters, $this->_filters) : $this->_filters; return ($prioritizedOrder) ? self::_getPrioritizedFilters($filters) : $filters; } /** * Remove all filters * @return $this */ public function clearFilters() { foreach ($this->_filters as $key => $val) $this->removeFilter($key); // reset indexes $this->_filters = array(); return $this; } /** * Set global filter (used for all views). 2 parameters will be passed on to the callback function: * (1) $content: rendered content * (2) $view: this view object * @param mixed $callback * @param string $key Optional * @param integer $priority Optional, default 10 */ public static function addGlobalFilter($callback, $key = null, $priority = 10) { $cb = array('callback' => $callback, 'priority' => $priority); // add global filter as a callback function if ($key === null) { self::$_globalFilters[] = $cb; } else { self::$_globalFilters[$key] = $cb; } } /** * Remove filter * @param string $key */ public static function removeGlobalFilter($key) { if (array_key_exists($key, self::$_globalFilters)) unset(self::$_globalFilters[$key]); } /** * Check if filter exists * @param string $key * @return boolean */ public static function hasGlobalFilter($key) { return array_key_exists($key, self::$_globalFilters); } /** * Get filter * @param boolean $prioritizedOrder * @return array */ public static function getGlobalFilters($prioritizedOrder = false) { return ($prioritizedOrder) ? self::_getPrioritizedFilters(self::$_globalFilters) : self::$_globalFilters; } /** * Remove all global filters */ public static function clearGlobalFilters() { foreach (self::$_globalFilters as $key => $val) self::removeGlobalFilter($key); // reset indexes self::$_globalFilters = array(); } /** * Render the view content * @param boolean $echo Optional, default false * @param boolean $applyGlobalFilters Optional, default true * @return string * @throw Exception */ public function render($echo = false, $applyGlobalFilters = true) { // check if view file exists $file = null; if (self::_fileExists($this->_file)) { $file = $this->_file; } else { foreach (self::$_paths as $path) { if (self::_fileExists($path . $this->_file)) $file = $path . $this->_file; } if ($file === null) { $this->_throwException('The file "' . $this->_file . '" could not be fetched.'); return $this; } } // get global and local vars $vars = $this->getVars(true); // extract vars to global namespace extract($vars, EXTR_SKIP); // start output buffer ob_start(); // replace short php tags to normal (in case the server doesn't support it) if (self::$_shortOpenTag) { echo eval('?>' . str_replace('<?=', '<?php echo ', file_get_contents($file))); } else { include($file); } // get the view content $content = ob_get_contents(); // clean output buffer ob_end_clean(); // set filters $filters = $this->getFilters($applyGlobalFilters, true); // call filters foreach ($filters as $key => $value) { if (is_callable($value['callback'])) $content = call_user_func($value['callback'], $content, $this); } // print content if ($echo) echo $content; return $content; } /** * Show rendered view content * @param boolean $applyGlobalFilters Optional, default true * @return $this */ public function show($applyGlobalFilters = true) { $this->render(true, $applyGlobalFilters); return $this; } /** * Renders the view * @return string */ public function __toString() { return $this->render(false); } /** * Throw exception * @param string $msg * @throw Exception */ protected function _throwException($msg) { throw new Exception(get_class($this) . ' - ' . $msg); } /** * File exists * @param string $file * @return boolean */ protected static function _fileExists($file) { return (file_exists($file) && is_file($file)); } /** * Get filters in priority order * @param array $filters * @return array */ protected static function _getPrioritizedFilters($filters) { uasort($filters, array('Lim_View', '_sortPriority')); return $filters; } /** * Sort by priority (callback) * @param array $a * @param array $b * @return integer */ protected static function _sortPriority($a, $b) { if ($a['priority'] == $b['priority']) return 0; return ($a['priority'] > $b['priority']) ? -1 : 1; } } // Lim_View Class
Revision: 41244
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at February 14, 2011 22:42 by freelancephp
Initial Code
<?php /** * LView Class * * View class that contains features like: * - get vars inside the view with: * 1) $var1 * 2) $this->var1 * 3) or $this->get( 'var1', 'defaultValue' ) * - factory method for direct chaining: * LView::factory( 'test.php' )->set( 'var1', 'value1' )->show(); * - set filter callbacks that will be executed right after rendering * - set global vars and global filters to be available for all views * * @version 1.0 * @author Victor Villaverde Laan * @link http://www.freelancephp.net/php-view-class/ * @license MIT license */ class LView { /** * @var string View file */ protected $_file = NULL; /** * @var array Containing global vars ( available for all view instances ) */ protected static $_global_vars = array(); /** * @var array Containing view paths */ protected static $_paths = array(); /** * @var array Containing filter callbacks */ protected $_filters = array(); /** * @var array Containing global filter callbacks */ protected static $_global_filters = array(); /** * @var boolean Always able to use the php short open tag (<?= $var ?>), even * when short_open_tag is disabled in the php configuration */ protected static $_short_open_tag = FALSE; /** * Constructor * @param string $file Optional, can be set later */ public function __construct( $file = NULL ) { $this->file( $file ); } /** * Renders the view * @return string */ public function __toString() { return $this->render(); } /** * Also get global vars when getting a property value * @param string $key * @return mixed */ public function __get( $key ) { return $this->get( $key ); } /** * Factory method for creating new instance * @param string $file * @return LView */ public static function factory( $file = NULL ) { // return new view instance return new LView( $file ); } /** * Set or Get php short open tag support (<?= $var ?>) * @param boolean $replace Optional * @return boolean|void Returns php short tag support or nothing */ public static function short_open_tag( $short_open_tag = NULL ) { if ( $short_open_tag === NULL ) return self::$_short_open_tag; self::$_short_open_tag = $short_open_tag; } /** * Add view path * @param string $path */ public static function add_path( $path ) { self::$_paths[] = $path; } /** * Set or Get the view file * @param string $view_file optional * @return string|this File or this */ public function file( $view_file = NULL ) { if ( $view_file === NULL ) return $this->_file; $this->_file = $view_file; return $this; } /** * Get a var value ( if not exists it will look in the global vars ) * @param string $key * @param mixed $default_value * @return mixed */ public function get( $key, $default_value = NULL ) { if ( isset( $this->{ $key } ) ) return $this->{ $key }; if ( isset( self::$_global_vars[ $key ] ) ) return self::$_global_vars[ $key ]; return $default_value; } /** * Get or Set a var * @param string|array $key Can also give array of values, f.e. array( 'var1' => 'value1', 'var2' => 'value2' ) * @param mixed $value * @return this */ public function set( $key, $value = NULL ) { if ( is_array( $key ) ) { // array of values foreach ( $key AS $k => $value ) $this->{ $k } = $value; } else { $this->{ $key } = $value; } return $this; } /** * Set a global var ( available for all views ) * @param string|array $key Can also give array of values, f.e. array( 'var1' => 'value1', 'var2' => 'value2' ) * @param mixed $value * @return string */ public static function set_global( $key, $value = NULL ) { if ( is_array( $key ) ) { // array of values foreach ( $key AS $k => $value ) self::$_global_vars[ $k ] = $value; } else { self::$_global_vars[ $key ] = $value; } } /** * Check if view file exists * @param string $file Check if given view file exists * @return boolean */ public static function exists( $file ) { // check if file exists if ( file_exists( $file ) ) return TRUE; // check if file can be found in the paths foreach ( self::$_paths AS $path ) { if ( file_exists( $path . $file ) ) return TRUE; } return FALSE; } /** * Add/remove filter for after fetching * @param string $key * @param mixed $callback * @return this */ public function add_filter( $key, $callback = NULL ) { if ( $callback === NULL ) { if ( is_callable( $key ) ) { $callback = $key; $key = NULL; } else { // remove filter if exists if ( isset( $this->_filters[ $key ] ) ) unset( $this->_filters[ $key ] ); } } // add filter as a callback function if ( $key === NULL ) { $this->_filters[] = $callback; } else { $this->_filters[ $key ] = $callback; } return $this; } /** * Add/remove global filter ( used with all views ) * @param string $key * @param mixed $callback * @return this */ public static function add_global_filter( $key, $callback = NULL ) { if ( $callback === NULL ) { if ( is_callable( $key ) ) { $callback = $key; $key = NULL; } else { // remove global filter if exists if ( isset( self::$_global_filters[ $key ] ) ) unset( self::$_global_filters[ $key ] ); } } // add global filter as a callback function if ( $key === NULL ) { self::$_global_filters[] = $callback; } else { self::$_global_filters[ $key ] = $callback; } } /** * Render the view content * @return string * @throw Exception */ public function render() { // check if view file exists $view_file = NULL; if ( file_exists( $this->_file ) ) { $view_file = $this->_file; } else { foreach ( self::$_paths AS $path ) { if ( file_exists( $path . $this->_file ) ) $view_file = $path . $this->_file; } if ( $view_file === NULL ) throw new Exception( get_class( $this ) . ': The file "' . $this->_file . '" could not be fetched.' ); } // get all vars $vars = get_object_vars( $this ); // add global vars $vars = array_merge( self::$_global_vars, $vars ); // extract vars to global namespace extract( $vars, EXTR_SKIP ); // start output buffer ob_start(); // replace short php tags to normal (in case the server doesn't support it) if ( self::$_short_open_tag ) { echo eval( '?>' . str_replace( '<?=', '<?php echo ', file_get_contents( $view_file ) ) ); } else { include( $view_file ); } // get the view content $content = ob_get_contents(); // set filters $filters = array_merge( self::$_global_filters, $this->_filters ); // call filters foreach ( $filters as $key => $callback ) { if ( is_callable( $callback ) ) $content = call_user_func( $callback, $content, $this ); } // clean output buffer ob_end_clean(); return $content; } /** * Echo view * @return this */ public function show() { echo $this->render(); return $this; } } /*?> // ommit closing tag, to prevent unwanted whitespace at the end of the parts generated by the included files */
Initial URL
http://www.freelancephp.net/php-view-class/
Initial Description
View class that contains features like: - get vars inside the view with: 1) $var1 2) $this->var1 3) or $this->get( 'var1', 'defaultValue' ) - factory method for direct chaining: Lim_View::factory( 'test.php' )->set( 'var1', 'value1' )->show(); - set filter callbacks that will be executed right after rendering - set global vars and global filters to be available for all views
Initial Title
Lim_View - PHP View Class
Initial Tags
class
Initial Language
PHP