Кохана 3,2 + веточка Проблемы - PullRequest
1 голос
/ 10 сентября 2011

Я использую этот модуль для интеграции Twig в мой маленький проект Kohana. Я сталкиваюсь со следующими проблемами:

  1. Как использовать помощники / пользовательские функции?
  2. Как использовать основные функции Kohana, напр. __() для перевода, функции для создания URL-адресов?

Если у кого-нибудь есть какие-либо предложения, я был бы рад.

1 Ответ

0 голосов
/ 10 сентября 2011

Я не использовал именно эту интеграцию Twig, но придерживался следующей стратегии (1. помощники / пользовательские функции): добавьте в ваш config / twig.php

'extensions' => array (
  'Twig_Extension_Escaper', // native twig escaper
  'Twig_Extension_Optimizer', // native twig optimizer
  'View_Extensions', // your custom extensions
)

Затем создайте classes / view / Extensions.php

class View_Extensions extends Twig_Extension {

    public function getTokenParsers() {
        return array(
            new View_Extension_Html_TokenParser(), // all HTML methods
        );
    }

    public function getFilters() {
        return array(
            'limit_words' => new Twig_Filter_Function('Text::limit_words'), // {{ text|limit_words(25) }}
        );
    }

    public function getName() {
        return 'view_extension';
    }
}

И создать минимальный парсер HTML-токена

class View_Extension_Html_TokenParser extends View_Extension_Helper_TokenParser {
    public function getTag() {
        return 'html'; // lowercase as all in twig
    }
}

Создать базовый помощник

abstract class View_Extension_Helper_TokenParser extends Twig_TokenParser {
    public function parse(Twig_Token $token) {
        $lineno = $token->getLine();
        // Methods are called like this: html.method, expect a period
        $this->parser->getStream()->expect(Twig_Token::PUNCTUATION_TYPE, '.');
        // Find the html method we're to call
        $method = $this->parser->getStream()->expect(Twig_Token::NAME_TYPE)->getValue();
        $params = $this->parser->getExpressionParser()->parseMultiTargetExpression();
        $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);

        return new View_Extension_Helper_Node(array('expression' => $params), array('method' => $method), $lineno, $this->getTag());
    }
}

И последний - помощник узла

class View_Extension_Helper_Node extends Twig_Node {
    protected $cs_tags = array( // your case sensitive tags
        'html' => 'HTML',
    );

    public function compile(Twig_Compiler $compiler) {
        $params = $this->getNode('expression')->getIterator();
        $nodeTag = $this->getNodeTag();
        $nodeTag = isset($this->cs_tags[strtolower($nodeTag)]) ? $this->cs_tags[strtolower($nodeTag)] : $nodeTag;
        // Output the route     
        $compiler->write('echo ' . $nodeTag . '::' . $this->getAttribute('method') . '(');
        foreach ($params as $i => $row) {
            $compiler->subcompile($row);
            if (($params->count() - 1) !== $i) {
                $compiler->write(',');
            }
        }
        $compiler->write(')')->raw(';');
    }
}

Так что после последнего вы можете использовать все методы HTML, такие как {% html.anchor "/anchor" %} Я надеюсь, что нет ошибок.

...