Вопросы по Twig
- nizsheanez
- Сообщения: 814
- Зарегистрирован: 2011.04.29, 13:09
- Откуда: Москва
Вопросы по Twig
Первый вопрос: как вызвать статический метод какого-нибудь класса в шаблоне twig?
- Svyatov
- Сообщения: 459
- Зарегистрирован: 2010.08.12, 14:50
- Откуда: Санкт-Петербург
- Контактная информация:
Re: Вопросы по Twig
"Просто" - никак. Нужно добавлять либо прокси-объект для статического класса, либо добавлять отдельно функции этого класса так:
Код: Выделить всё
$twigElement = new Twig_Function_Function('CHtml::link');
$twig->addFunction('htmllink', $twigElement);
- nizsheanez
- Сообщения: 814
- Зарегистрирован: 2011.04.29, 13:09
- Откуда: Москва
Re: Вопросы по Twig
А что скажешь насчет такого подхода:
Код: Выделить всё
class Project_Twig_Extension extends Twig_Extension
{
public function getGlobals()
{
return array(
'CHtml' => new CHtml(),
//'lipsum' => new Twig_Function(new Text(), 'getLipsum'),
);
}
public function getName()
{
return 'project';
}
}
- Svyatov
- Сообщения: 459
- Зарегистрирован: 2010.08.12, 14:50
- Откуда: Санкт-Петербург
- Контактная информация:
Re: Вопросы по Twig
Как вариант, пойдет, но я у себя все-таки использую проксирующий класс.
Тогда для твоего кода использование будет таким:
Код: Выделить всё
class ETwigStaticClassProxy
{
private $_staticClassName;
public function __construct($staticClassName) {
$this->_staticClassName = $staticClassName;
}
public function __get($property)
{
return ${$this->_staticClassName}::$property;
}
public function __set($property, $value)
{
return (${$this->_staticClassName}::$property = $value);
}
public function __call($method, $arguments)
{
return call_user_func_array(array($this->_staticClassName, $method), $arguments);
}
}
Код: Выделить всё
class Project_Twig_Extension extends Twig_Extension
{
public function getGlobals()
{
return array(
'CHtml' => new ETwigStaticClassProxy('CHtml'),
);
}
}
- nizsheanez
- Сообщения: 814
- Зарегистрирован: 2011.04.29, 13:09
- Откуда: Москва
Re: Вопросы по Twig
Да, с точки зрения скушанной памяти твое решение правильнее.
А все не статическое наверное лучше вытащить в контроллер
А все не статическое наверное лучше вытащить в контроллер