Рендеринг контента из строки/базы данных и создание ссылок с помощью twig

По нескольким причинам, включая перевод контента, мне пришлось создать простую CMS для отображения страниц моего приложения Symfony2.

Теперь моя проблема в том, что невозможно отобразить содержимое из строки. Twig принимает только файлы. Мой контент может содержать динамические части, такие как локаль или что-то подобное, поэтому мощность рендеринга twig была бы очень полезна.

Я попытался отрендерить его с помощью TwibstringBundle, но его функциональность довольно ограничена, и он не работает с путь-функция.

Любые предложения по решению проблемы?


person madc    schedule 21.03.2012    source источник
comment
Как они хранятся в базе данных?   -  person max    schedule 22.03.2012
comment
Они хранятся в виде простого текста с небольшой html-разметкой.   -  person madc    schedule 22.03.2012


Ответы (3)


см. http://twig.sensiolabs.org/doc/functions/template_from_string.html и http://symfony.com/doc/current/cookbook/templating/twig_extension.html#register-an-extension-as-a-service

{% include template_from_string("Hello {{ name }}") %}
{% include template_from_string(page.template) %}

Поскольку загрузчик строк не загружается по умолчанию, вам нужно добавить его в свой конфиг.

# src/Acme/DemoBundle/Resources/config/services.yml
acme.twig.extension.loader:
    class:        Twig_Extension_StringLoader
    tags:
         - { name: 'twig.extension' }

Где Acme/acme — это имя вашего приложения, а DemoBundle — пакет, для которого вы хотите его включить.

person Heyflynn    schedule 15.10.2012
comment
Это выглядит очень многообещающе, спасибо за ответ. Я проверю это позже и отчитаюсь. - person madc; 15.10.2012
comment
реализовал это вчера вечером. единственный недостаток, который я обнаружил до сих пор, заключается в том, что любое расширение ветки, которое вы вызываете, также использует загрузчик строк. Исключения и т. д. обрабатываются не очень хорошо. Рекомендуется не использовать загрузчик строк извне, поскольку результаты могут быть не такими, как вы ожидаете (т.е. расширение, в том числе и т.д..) - person Heyflynn; 15.10.2012
comment
добавлен новый поддерживаемый twig способ загрузки строк в качестве шаблонов - person Heyflynn; 29.11.2012
comment
Спасибо за ответ. Работал в Symfony 2.8. - person Skylord123; 08.01.2016

Symfony 2.7 упрощает это и с PHP:

    $twig = $this->get('twig');
    $template = twig_template_from_string($twig, 'Hello, {{ name }}');
    $output = $template->render(['name' => 'Bob']));
person Tac Tacelosky    schedule 04.06.2015
comment
Почему только Symfony 2.7? У меня тоже работает на Symfony 2.3. - person Philipp Rieber; 13.07.2015
comment
Не работает для меня. Я получаю сообщение «Попытка вызвать функцию twig_template_from_string из пространства имен AppBundle\Controller». Однако у меня это сработало: $this->get('twig')->createTemplate('Hello, {{ name }}'); - person Atan; 17.03.2016

Исходный код функции twig_template_from_string выглядит следующим образом:

function twig_template_from_string(Twig_Environment $env, $template)
{
    return $env->createTemplate($template);
}

Это означает, что если у вас уже есть twig environment, то лучше вызывать напрямую:

$template = $env->createTemplate($templateString);
$parsedContent = $template->render(array('a'=>'b'));
person Turdaliev Nursultan    schedule 21.04.2016