Я не использовал именно эту интеграцию 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" %}
Я надеюсь, что нет ошибок.