198 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			198 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| /**
 | |
|  * Smarty Extension handler
 | |
|  *
 | |
|  * Load extensions dynamically
 | |
|  *
 | |
|  * @package    Smarty
 | |
|  * @subpackage PluginsInternal
 | |
|  * @author     Uwe Tews
 | |
|  *
 | |
|  * Runtime extensions
 | |
|  * @property   Smarty_Internal_Runtime_CacheModify       $_cacheModify
 | |
|  * @property   Smarty_Internal_Runtime_CacheResourceFile $_cacheResourceFile
 | |
|  * @property   Smarty_Internal_Runtime_Capture           $_capture
 | |
|  * @property   Smarty_Internal_Runtime_CodeFrame         $_codeFrame
 | |
|  * @property   Smarty_Internal_Runtime_FilterHandler     $_filterHandler
 | |
|  * @property   Smarty_Internal_Runtime_Foreach           $_foreach
 | |
|  * @property   Smarty_Internal_Runtime_GetIncludePath    $_getIncludePath
 | |
|  * @property   Smarty_Internal_Runtime_Make_Nocache      $_make_nocache
 | |
|  * @property   Smarty_Internal_Runtime_UpdateCache       $_updateCache
 | |
|  * @property   Smarty_Internal_Runtime_UpdateScope       $_updateScope
 | |
|  * @property   Smarty_Internal_Runtime_TplFunction       $_tplFunction
 | |
|  * @property   Smarty_Internal_Runtime_WriteFile         $_writeFile
 | |
|  *
 | |
|  * Method extensions
 | |
|  * @property   Smarty_Internal_Method_GetTemplateVars    $getTemplateVars
 | |
|  * @property   Smarty_Internal_Method_Append             $append
 | |
|  * @property   Smarty_Internal_Method_AppendByRef        $appendByRef
 | |
|  * @property   Smarty_Internal_Method_AssignGlobal       $assignGlobal
 | |
|  * @property   Smarty_Internal_Method_AssignByRef        $assignByRef
 | |
|  * @property   Smarty_Internal_Method_LoadFilter         $loadFilter
 | |
|  * @property   Smarty_Internal_Method_LoadPlugin         $loadPlugin
 | |
|  * @property   Smarty_Internal_Method_RegisterFilter     $registerFilter
 | |
|  * @property   Smarty_Internal_Method_RegisterObject     $registerObject
 | |
|  * @property   Smarty_Internal_Method_RegisterPlugin     $registerPlugin
 | |
|  * @property   mixed|\Smarty_Template_Cached             configLoad
 | |
|  */
 | |
| #[\AllowDynamicProperties]
 | |
| class Smarty_Internal_Extension_Handler
 | |
| {
 | |
|     public $objType = null;
 | |
| 
 | |
|     /**
 | |
|      * Cache for property information from generic getter/setter
 | |
|      * Preloaded with names which should not use with generic getter/setter
 | |
|      *
 | |
|      * @var array
 | |
|      */
 | |
|     private $_property_info     = array(
 | |
|         'AutoloadFilters' => 0, 'DefaultModifiers' => 0, 'ConfigVars' => 0,
 | |
|         'DebugTemplate'   => 0, 'RegisteredObject' => 0, 'StreamVariable' => 0,
 | |
|         'TemplateVars'    => 0, 'Literals' => 'Literals',
 | |
|     );//
 | |
| 
 | |
|     private $resolvedProperties = array();
 | |
| 
 | |
|     /**
 | |
|      * Call external Method
 | |
|      *
 | |
|      * @param \Smarty_Internal_Data $data
 | |
|      * @param string                $name external method names
 | |
|      * @param array                 $args argument array
 | |
|      *
 | |
|      * @return mixed
 | |
|      */
 | |
|     public function _callExternalMethod(Smarty_Internal_Data $data, $name, $args)
 | |
|     {
 | |
|         /* @var Smarty $data ->smarty */
 | |
|         $smarty = isset($data->smarty) ? $data->smarty : $data;
 | |
|         if (!isset($smarty->ext->$name)) {
 | |
|             if (preg_match('/^((set|get)|(.*?))([A-Z].*)$/', $name, $match)) {
 | |
|                 $basename = $this->upperCase($match[ 4 ]);
 | |
|                 if (!isset($smarty->ext->$basename) && isset($this->_property_info[ $basename ])
 | |
|                     && is_string($this->_property_info[ $basename ])
 | |
|                 ) {
 | |
|                     $class = 'Smarty_Internal_Method_' . $this->_property_info[ $basename ];
 | |
|                     if (class_exists($class)) {
 | |
|                         $classObj = new $class();
 | |
|                         $methodes = get_class_methods($classObj);
 | |
|                         foreach ($methodes as $method) {
 | |
|                             $smarty->ext->$method = $classObj;
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
|                 if (!empty($match[ 2 ]) && !isset($smarty->ext->$name)) {
 | |
|                     $class = 'Smarty_Internal_Method_' . $this->upperCase($name);
 | |
|                     if (!class_exists($class)) {
 | |
|                         $objType = $data->_objType;
 | |
|                         $propertyType = false;
 | |
|                         if (!isset($this->resolvedProperties[ $match[ 0 ] ][ $objType ])) {
 | |
|                             $property = $this->resolvedProperties['property'][$basename] ??
 | |
|                                 $this->resolvedProperties['property'][$basename] = smarty_strtolower_ascii(
 | |
|                                 join(
 | |
|                                     '_',
 | |
|                                     preg_split(
 | |
|                                         '/([A-Z][^A-Z]*)/',
 | |
|                                         $basename,
 | |
|                                         -1,
 | |
|                                         PREG_SPLIT_NO_EMPTY |
 | |
|                                         PREG_SPLIT_DELIM_CAPTURE
 | |
|                                     )
 | |
|                                 )
 | |
|                             );
 | |
|                             if ($property !== false) {
 | |
|                                 if (property_exists($data, $property)) {
 | |
|                                     $propertyType = $this->resolvedProperties[ $match[ 0 ] ][ $objType ] = 1;
 | |
|                                 } elseif (property_exists($smarty, $property)) {
 | |
|                                     $propertyType = $this->resolvedProperties[ $match[ 0 ] ][ $objType ] = 2;
 | |
|                                 } else {
 | |
|                                     $this->resolvedProperties[ 'property' ][ $basename ] = $property = false;
 | |
|                                 }
 | |
|                             }
 | |
|                         } else {
 | |
|                             $propertyType = $this->resolvedProperties[ $match[ 0 ] ][ $objType ];
 | |
|                             $property = $this->resolvedProperties[ 'property' ][ $basename ];
 | |
|                         }
 | |
|                         if ($propertyType) {
 | |
|                             $obj = $propertyType === 1 ? $data : $smarty;
 | |
|                             if ($match[ 2 ] === 'get') {
 | |
|                                 return $obj->$property;
 | |
|                             } elseif ($match[ 2 ] === 'set') {
 | |
|                                 return $obj->$property = $args[ 0 ];
 | |
|                             }
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|         $callback = array($smarty->ext->$name, $name);
 | |
|         array_unshift($args, $data);
 | |
|         if (isset($callback) && $callback[ 0 ]->objMap | $data->_objType) {
 | |
|             return call_user_func_array($callback, $args);
 | |
|         }
 | |
|         return call_user_func_array(array(new Smarty_Internal_Undefined(), $name), $args);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Make first character of name parts upper case
 | |
|      *
 | |
|      * @param string $name
 | |
|      *
 | |
|      * @return string
 | |
|      */
 | |
|     public function upperCase($name)
 | |
|     {
 | |
|         $_name = explode('_', $name);
 | |
|         $_name = array_map('smarty_ucfirst_ascii', $_name);
 | |
|         return implode('_', $_name);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * get extension object
 | |
|      *
 | |
|      * @param string $property_name property name
 | |
|      *
 | |
|      * @return mixed|Smarty_Template_Cached
 | |
|      */
 | |
|     public function __get($property_name)
 | |
|     {
 | |
|         // object properties of runtime template extensions will start with '_'
 | |
|         if ($property_name[ 0 ] === '_') {
 | |
|             $class = 'Smarty_Internal_Runtime' . $this->upperCase($property_name);
 | |
|         } else {
 | |
|             $class = 'Smarty_Internal_Method_' . $this->upperCase($property_name);
 | |
|         }
 | |
|         if (!class_exists($class)) {
 | |
|             return $this->$property_name = new Smarty_Internal_Undefined($class);
 | |
|         }
 | |
|         return $this->$property_name = new $class();
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * set extension property
 | |
|      *
 | |
|      * @param string $property_name property name
 | |
|      * @param mixed  $value         value
 | |
|      *
 | |
|      */
 | |
|     public function __set($property_name, $value)
 | |
|     {
 | |
|         $this->$property_name = $value;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Call error handler for undefined method
 | |
|      *
 | |
|      * @param string $name unknown method-name
 | |
|      * @param array  $args argument array
 | |
|      *
 | |
|      * @return mixed
 | |
|      */
 | |
|     public function __call($name, $args)
 | |
|     {
 | |
|         return call_user_func_array(array(new Smarty_Internal_Undefined(), $name), array($this));
 | |
|     }
 | |
| }
 | 
