- move registerObject / registerClass into extension

This commit is contained in:
Uwe Tews
2015-06-21 13:43:17 +02:00
parent 1a24b3971d
commit dd4cbfac3a
4 changed files with 119 additions and 47 deletions

View File

@@ -3,6 +3,7 @@
- optimization of template/config file normalization - optimization of template/config file normalization
- optimization of directory handling / build realpath - optimization of directory handling / build realpath
- optimization of filter execution - optimization of filter execution
- move registerObject / registerClass into extension
19.06.2015 19.06.2015
- improvement allow closures as callback at $smarty->registerFilter() https://github.com/smarty-php/smarty/issues/59 - improvement allow closures as callback at $smarty->registerFilter() https://github.com/smarty-php/smarty/issues/59

View File

@@ -111,7 +111,7 @@ class Smarty extends Smarty_Internal_TemplateBase
/** /**
* smarty version * smarty version
*/ */
const SMARTY_VERSION = '3.1.28-dev/4'; const SMARTY_VERSION = '3.1.28-dev/5';
/** /**
* define variable scopes * define variable scopes

View File

@@ -0,0 +1,110 @@
<?php
/**
* Smarty Extension Object
*
* Register object methods
*
* @package Smarty
* @subpackage PluginsInternal
* @author Uwe Tews
*/
class Smarty_Internal_Extension_Object
{
/**
* Registers object to be used in templates
*
* @param \Smarty_Internal_Template|\Smarty $obj
* @param string $object_name
* @param object $object_impl the referenced PHP object to register
* @param array $allowed list of allowed methods (empty = all)
* @param boolean $smarty_args smarty argument format, else traditional
* @param array $block_methods list of block-methods
*
* @return \Smarty_Internal_Templatebase
* @throws \SmartyException
*/
static function registerObject($obj, $object_name, $object_impl, $allowed = array(), $smarty_args = true, $block_methods = array())
{
// test if allowed methods callable
if (!empty($allowed)) {
foreach ((array) $allowed as $method) {
if (!is_callable(array($object_impl, $method)) && !property_exists($object_impl, $method)) {
throw new SmartyException("Undefined method or property '$method' in registered object");
}
}
}
// test if block methods callable
if (!empty($block_methods)) {
foreach ((array) $block_methods as $method) {
if (!is_callable(array($object_impl, $method))) {
throw new SmartyException("Undefined method '$method' in registered object");
}
}
}
// register the object
$smarty = isset($obj->smarty) ? $obj->smarty : $obj;
$smarty->registered_objects[$object_name] = array($object_impl, (array) $allowed, (boolean) $smarty_args,
(array) $block_methods);
}
/**
* return a reference to a registered object
*
* @param \Smarty_Internal_Template|\Smarty $obj
* @param string $name object name
*
* @return object
* @throws \SmartyException if no such object is found
*/
static function getRegisteredObject($obj, $name)
{
$smarty = isset($obj->smarty) ? $obj->smarty : $obj;
if (!isset($smarty->registered_objects[$name])) {
throw new SmartyException("'$name' is not a registered object");
}
if (!is_object($smarty->registered_objects[$name][0])) {
throw new SmartyException("registered '$name' is not an object");
}
return $smarty->registered_objects[$name][0];
}
/**
* unregister an object
*
* @param \Smarty_Internal_Template|\Smarty $obj
* @param string $name object name
*
* @return \Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or
* Smarty_Internal_Template) instance for chaining
*/
static function unregisterObject($obj, $name)
{
$smarty = isset($obj->smarty) ? $obj->smarty : $obj;
if (isset($smarty->registered_objects[$name])) {
unset($smarty->registered_objects[$name]);
}
}
/**
* Registers static classes to be used in templates
*
* @param \Smarty_Internal_Template|\Smarty $obj
* @param string $class_name
* @param string $class_impl the referenced PHP class to register
*
* @return \Smarty_Internal_Templatebase
* @throws \SmartyException
*/
static function registerClass($obj, $class_name, $class_impl)
{
// test if exists
if (!class_exists($class_impl)) {
throw new SmartyException("Undefined class '$class_impl' in register template class");
}
// register the class
$smarty = isset($obj->smarty) ? $obj->smarty : $obj;
$smarty->registered_classes[$class_name] = $class_impl;
}
}

View File

@@ -50,9 +50,9 @@ abstract class Smarty_Internal_TemplateBase extends Smarty_Internal_Data
* test if cache is valid * test if cache is valid
* *
* @param string|\Smarty_Internal_Template $template the resource handle of the template file or template object * @param string|\Smarty_Internal_Template $template the resource handle of the template file or template object
* @param mixed $cache_id cache id to be used with this template * @param mixed $cache_id cache id to be used with this template
* @param mixed $compile_id compile id to be used with this template * @param mixed $compile_id compile id to be used with this template
* @param object $parent next higher level of Smarty variables * @param object $parent next higher level of Smarty variables
* *
* @return boolean cache status * @return boolean cache status
*/ */
@@ -251,27 +251,7 @@ abstract class Smarty_Internal_TemplateBase extends Smarty_Internal_Data
*/ */
public function registerObject($object_name, $object_impl, $allowed = array(), $smarty_args = true, $block_methods = array()) public function registerObject($object_name, $object_impl, $allowed = array(), $smarty_args = true, $block_methods = array())
{ {
// test if allowed methods callable Smarty_Internal_Extension_Object::registerObject($this, $object_name, $object_impl, $allowed, $smarty_args, $block_methods);
if (!empty($allowed)) {
foreach ((array) $allowed as $method) {
if (!is_callable(array($object_impl, $method)) && !property_exists($object_impl, $method)) {
throw new SmartyException("Undefined method or property '$method' in registered object");
}
}
}
// test if block methods callable
if (!empty($block_methods)) {
foreach ((array) $block_methods as $method) {
if (!is_callable(array($object_impl, $method))) {
throw new SmartyException("Undefined method '$method' in registered object");
}
}
}
// register the object
$smarty = isset($this->smarty) ? $this->smarty : $this;
$smarty->registered_objects[$object_name] = array($object_impl, (array) $allowed, (boolean) $smarty_args,
(array) $block_methods);
return $this; return $this;
} }
@@ -285,15 +265,7 @@ abstract class Smarty_Internal_TemplateBase extends Smarty_Internal_Data
*/ */
public function getRegisteredObject($name) public function getRegisteredObject($name)
{ {
$smarty = isset($this->smarty) ? $this->smarty : $this; return Smarty_Internal_Extension_Object::getRegisteredObject($this, $name);
if (!isset($smarty->registered_objects[$name])) {
throw new SmartyException("'$name' is not a registered object");
}
if (!is_object($smarty->registered_objects[$name][0])) {
throw new SmartyException("registered '$name' is not an object");
}
return $smarty->registered_objects[$name][0];
} }
/** /**
@@ -306,11 +278,7 @@ abstract class Smarty_Internal_TemplateBase extends Smarty_Internal_Data
*/ */
public function unregisterObject($name) public function unregisterObject($name)
{ {
$smarty = isset($this->smarty) ? $this->smarty : $this; Smarty_Internal_Extension_Object::unregisterObject($this, $name);
if (isset($smarty->registered_objects[$name])) {
unset($smarty->registered_objects[$name]);
}
return $this; return $this;
} }
@@ -326,14 +294,7 @@ abstract class Smarty_Internal_TemplateBase extends Smarty_Internal_Data
*/ */
public function registerClass($class_name, $class_impl) public function registerClass($class_name, $class_impl)
{ {
// test if exists Smarty_Internal_Extension_Object::registerClass($this, $class_name, $class_impl);
if (!class_exists($class_impl)) {
throw new SmartyException("Undefined class '$class_impl' in register template class");
}
// register the class
$smarty = isset($this->smarty) ? $this->smarty : $this;
$smarty->registered_classes[$class_name] = $class_impl;
return $this; return $this;
} }