2014-01-10 3 views
3

Я хочу использовать Twig (v1.15.0) в своем проекте, чтобы заменить наш самодельный шаблонный движок. Он использует специальные разделители для замены переменных, [[...]] или для управления локализованными строками, [% ...%].Twig lexer: добавить разделитель

Я не хочу изменять все существующие шаблоны, чтобы заменить каждый разделитель, по причинам устаревших и совместимых.

Для переменных, это не имеет большого значения, я просто должен установить параметры прутик LeXeR в:

$twig = new Twig_Environment(); 

$lexer = new Twig_Lexer($twig, array(
    'tag_comment' => array('{#', '#}'), 
    'tag_block'  => array('{%', '%}'), 
    'tag_variable' => array('[[', ']]'), // was array('{{', '}}') 
    'interpolation' => array('#{', '}'), 
)); 
$twig->setLexer($lexer); 

В случае локализации разделителей не так просто. Первоначально я хотел сделать что-то вроде этого:

$twig = new Twig_Environment(); 
$lexer = new Twig_Lexer($twig); 
$lexer->addDelimiter('tag_localize', array('[%', '%]'), 'functionToCall'); 

Но оно, похоже, не реализовано.

Конечным решением является расширение класса Lexer и использование его в моей окружающей среде. Но я бы хотел этого избежать.

Есть ли лучшее решение?

+0

Можете привести пример, как выглядит тег локализации в вашем старом шаблоне? –

+0

Это переведет «Hello world» в соответствии с пользовательским языком: [% Hello world%] – user3182058

ответ

0

Уверен, вы уже знаете это: в Twig вы выполняете переводы с использованием расширения I18n. Это расширение обеспечивает «транс» тег: see i18n docs

Я не вижу, как вы можете превратить ваш синтаксис перевода [%Hello world%] в пути Twig {% trans %}Hello world{% endtrans %} по extendling класса LeXeR, потому что {% является блок-элементом и trans тега определен в I18n расширение. Вы могли бы построить свою собственную логику перевода, но я думаю, что намного проще создать препроцессор, который заменяет [%{% trans %] и %} с {% endtrans %}.

Я предполагаю, что это может работать, как это (непроверенные):

class MYTwigEnvironment extends Twig_Environment { 
    public function compileSource($source, $name = null) { 
    /* 
     * code to replace '[%' with '{% trans %}' in $source 
     * comes here ... 
     */ 
    return parent::compileSource($source, $name = null); 
    } 
} 

Насколько я понимаю, этот способ кэширования шаблон должен остаться без изменений.

Отношения

+0

Спасибо за ответ. В настоящее время в моих контроллерах с логическим я выбираю между веткой или нашим самодельным шаблоном. Я думаю, ваше решение удовлетворит мои потребности и позволит мне удалить этот ужас. Фактически это то, что я делаю вручную при перезаписи некоторых существующих шаблонов (программное обеспечение претендует на реализацию MVC, но из-за плохо написанного механизма экс-шаблона контроллеры могут содержать html ...). Было бы проще, если бы Twig позволил создавать другие разделители ... возможно, для будущего выпуска! – user3182058

Смежные вопросы