forked from SimplesIP/pabx-app
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
197 lines
7.9 KiB
197 lines
7.9 KiB
<?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)); |
|
} |
|
}
|
|
|