Tpl: add register_callable() helper method
This commit is contained in:
parent
23a40c9680
commit
48556822a3
1 changed files with 100 additions and 0 deletions
100
src/Tpl.php
100
src/Tpl.php
|
@ -233,6 +233,106 @@ class Tpl {
|
||||||
self :: $smarty -> registerPlugin("function", $name, $callable);
|
self :: $smarty -> registerPlugin("function", $name, $callable);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register a callable usable from template files
|
||||||
|
* @param callable $callable The callable
|
||||||
|
* @param string|null $name The name of the callable exposed in template files
|
||||||
|
* (optional, default: the function/method name)
|
||||||
|
* @param string|null $type The type of method:
|
||||||
|
* - "display" (default): the result of the callable execution will be
|
||||||
|
* displayed
|
||||||
|
* - "output_variable": the result of the callable execution will be
|
||||||
|
* assign to the template variable (name specified using
|
||||||
|
* $output_variable)
|
||||||
|
* @param string|null $output_variable The name of the output variable (optional, required if
|
||||||
|
* $type == "output_variable")
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function register_callable($callable, $name=null, $type=null, $output_variable=null) {
|
||||||
|
if (!is_callable($callable))
|
||||||
|
self::fatal_error("Tpl::register_callable(): invalid callable provided");
|
||||||
|
if (is_array($callable)) {
|
||||||
|
if (is_object($callable[0]))
|
||||||
|
self::fatal_error(
|
||||||
|
"Tpl::register_callable(): can't register template function from instantiated object."
|
||||||
|
);
|
||||||
|
$class = new \ReflectionClass($callable[0]);
|
||||||
|
$method = $class->getMethod($callable[1]);
|
||||||
|
if (!$method->isStatic())
|
||||||
|
self::fatal_error(
|
||||||
|
"Tpl::register_callable(): can't register template function from non-static method."
|
||||||
|
);
|
||||||
|
$callable_txt = sprintf("['\\%s', '%s']", $callable[0], $callable[1]);
|
||||||
|
$params = $method->getParameters();
|
||||||
|
$default_smarty_function_name = sprintf(
|
||||||
|
"smarty_%s_%s",
|
||||||
|
str_replace("\\", "_", $class->getName()),
|
||||||
|
$method->getName()
|
||||||
|
);
|
||||||
|
$default_smarty_name = $method->getName();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$function = new \ReflectionFunction($callable);
|
||||||
|
$default_smarty_function_name = "smarty_$function";
|
||||||
|
$default_smarty_name = $callable;
|
||||||
|
$callable_txt = $callable;
|
||||||
|
$params = $function->getParameters();
|
||||||
|
}
|
||||||
|
$args = [];
|
||||||
|
foreach($params as $idx => $param) {
|
||||||
|
if ($param->isOptional()) {
|
||||||
|
$args[] = sprintf(
|
||||||
|
"\$params['%s'] ?? %s",
|
||||||
|
$param->getName(),
|
||||||
|
var_export($param->getDefaultValue(), true)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$args[] = sprintf("\$params['%s']", $param->getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$idx = 0;
|
||||||
|
$smarty_function_name = $default_smarty_function_name;
|
||||||
|
while (function_exists($smarty_function_name))
|
||||||
|
$smarty_function_name = $default_smarty_function_name . $idx++;
|
||||||
|
switch($type) {
|
||||||
|
case "output_variable":
|
||||||
|
if (!$output_variable)
|
||||||
|
self::fatal_error("Tpl::register_callable(): no output variable name specified");
|
||||||
|
$code = sprintf(
|
||||||
|
"function %s(\$params, \$smarty) {
|
||||||
|
\$smarty->assign(
|
||||||
|
'%s',
|
||||||
|
call_user_func_array(%s, [%s])
|
||||||
|
);
|
||||||
|
}",
|
||||||
|
$output_variable,
|
||||||
|
$smarty_function_name,
|
||||||
|
$callable_txt,
|
||||||
|
implode(", ", $args)
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case "display":
|
||||||
|
default:
|
||||||
|
$code = sprintf(
|
||||||
|
"function %s(\$params, \$smarty) {
|
||||||
|
echo call_user_func_array(%s, [%s]);
|
||||||
|
}",
|
||||||
|
$smarty_function_name,
|
||||||
|
$callable_txt,
|
||||||
|
implode(", ", $args)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
$smarty_name = $name ?? $default_smarty_name;
|
||||||
|
Log::debug(
|
||||||
|
"Tpl::register_callable(): register template function %s from %s with following middleware ".
|
||||||
|
"function:\n%s",
|
||||||
|
$smarty_name, format_callable($callable), $code
|
||||||
|
);
|
||||||
|
eval($code);
|
||||||
|
self::register_function($smarty_name, $smarty_function_name);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Register a modifier usable from template files
|
* Register a modifier usable from template files
|
||||||
* @param string $name The modifier name
|
* @param string $name The modifier name
|
||||||
|
|
Loading…
Reference in a new issue