Вызов статических методов в Smarty, использование переменной в качестве имени класса

1

Я хочу сделать что-то вроде этого:

{$foo = 'SomeClassName'}
{$foo::someStaticMethod()}

Когда я скомпилирую свой шаблон, я получаю сообщение об ошибке: Fatal error: Uncaught --> Smarty: Invalid compiled template for...

После компиляции файла при попытке отобразить шаблон я получаю эту ошибку: Parse error: syntax error, unexpected '::' (T_PAAMAYIM_NEKUDOTAYIM), expecting ',' or ';' in... Parse error: syntax error, unexpected '::' (T_PAAMAYIM_NEKUDOTAYIM), expecting ',' or ';' in...

Когда я проверяю скомпилированный шаблон, он содержит следующие выражения: <?php echo $_smarty_tpl->tpl_vars['foo']->value::someStaticMethod();?>, <?php echo $_smarty_tpl->tpl_vars['foo']->value::someStaticMethod();?> явно недействителен синтаксисом PHP (на данный момент),

Из моего понимания последнего примера здесь Smarty должен поддержать это.

Я что-то делаю неправильно, или это ошибка в Smarty?

Теги:
static
smarty

1 ответ

0
Лучший ответ

Согласно документации Smarty, похоже, что она поддерживается только для назначения кода возврата вашей статической функции. Попробуйте это

{assign var=foo value=SomeClassName::someStaticMethod()} 

Если это не поможет, я предлагаю вам написать свой собственный плагин: http://www.smarty.net/docs/en/plugins.writing.tpl, http://www.smarty.net/docs/en/api. register.plugin.tpl

Что-то вроде

<?php
$smarty->registerPlugin("function","callStatic", "smarty_function_callStatic");

function smarty_function_callStatic(array $params, Smarty_Internal_Template $template)
{
  if (isset($params['callable']) && is_callable($params['callable'])
  {
    return call_user_func_array($params['callable'], $params);
  }
}

Затем в синтаксисе smarty используется как:

{callStatic callable='SomeClassName::someStaticMethod()'}

{callStatic callable='SomeClassName::someStaticMethod()' param1='123' param2='123'}

Редактировать:

Я также тестировал тот же самый код, который вы упомянули в своем вопросе, и он отлично работает для меня с последней версией (от https://github.com/smarty-php/smarty). Выходной сигнал "123".

Пример моего кода:

require '../libs/Smarty.class.php';

class DemoClass {
    public static function foobar()
    {
        return '123';
    }
}

$smarty = new Smarty;
$smarty->display('index.tpl');

/**
 * index.tpl
 *
 {$foo = 'DemoClass'}
 {$foo::foobar()}
 */
  • 0
    {assign var=bar value=SomeClassName::someStaticMethod()} работает нормально. Проблема возникает при использовании переменной в качестве имени класса. Это также имеет место при назначении возвращаемого значения: {assign var=foo value="SomeClassName"}{assign var=bar value=$foo::someStaticMethod()} выдает ту же ошибку. Создание плагина - хороший обходной путь. Спасибо! Но все же, не кажется ли это ошибкой в Smarty или ошибкой в документации?
  • 0
    Я использовал старую версию Smarty. Обновление до последней версии решило проблему :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню