Вопросы по Twig

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Ответить
Аватара пользователя
nizsheanez
Сообщения: 814
Зарегистрирован: 2011.04.29, 13:09
Откуда: Москва

Вопросы по Twig

Сообщение nizsheanez »

Первый вопрос: как вызвать статический метод какого-нибудь класса в шаблоне twig?
Аватара пользователя
Svyatov
Сообщения: 459
Зарегистрирован: 2010.08.12, 14:50
Откуда: Санкт-Петербург
Контактная информация:

Re: Вопросы по Twig

Сообщение Svyatov »

"Просто" - никак. Нужно добавлять либо прокси-объект для статического класса, либо добавлять отдельно функции этого класса так:

Код: Выделить всё

$twigElement = new Twig_Function_Function('CHtml::link');
$twig->addFunction('htmllink', $twigElement); 
Аватара пользователя
nizsheanez
Сообщения: 814
Зарегистрирован: 2011.04.29, 13:09
Откуда: Москва

Re: Вопросы по Twig

Сообщение nizsheanez »

А что скажешь насчет такого подхода:

Код: Выделить всё

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

Сообщение Svyatov »

Как вариант, пойдет, но я у себя все-таки использую проксирующий класс.

Код: Выделить всё

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

Сообщение nizsheanez »

Да, с точки зрения скушанной памяти твое решение правильнее.
А все не статическое наверное лучше вытащить в контроллер
Ответить