Я пытаюсь управлять несколькими шаблонами в Symfony. Активный шаблон исходит из базы данных, и у меня есть контроллер, который дает правильный путь.
Моя проблема состоит в том, чтобы сообщить symfony об этом пути. Я искал метод рендеринга Twig в нескольких классах, но изменения не были успешными.
Мой TemplateController.php
public function loadtpl() {
$repo = $this->getDoctrine()->getRepository(Templates::class);
$found = $repo->findByActive(1);
$tpl = $found[0]->getPath();
return $tpl;
}
Это дает мне путь к шаблону, но я не могу сообщить об этом Symfony.
ОБНОВИТЬ:
Что у меня есть — 2 разных макета, расположенных в шаблонах/макете1 и шаблоне/макете2
что я получаю — мой TemplateController (выше) возвращает активный путь макета (layout1/)
Теперь я могу отредактировать свой twig.yaml, чтобы указать путь моего шаблона к ../templates/layout1, чтобы я мог использовать render(mysite.html.twig);, который находится в layout1 (и layout2), но это не то, что мне нужно.
Что я хочу — я хочу динамически расширить путь к базовому шаблону с помощью моих путей макета, чтобы я мог использовать метод рендеринга (mysite.html.twig) без редактирования twig.yaml вручную.
Что мне нужно - Мне нужен класс twig или symfony для редактирования основного метода render(), но я не могу найти нужный файл. ИЛИ: У кого-нибудь есть идея, как лучше решить эту проблему.
метод рендеринга symfony не видит это значение. Вот почему я ищу способ напрямую ввести путь в метод рендеринга, но я не нашел правильного метода (я нашел 8 методов рендеринга(), и ничего не работает). Нет никаких изменений после изменения метода рендеринга.






Функция рендеринга ожидает следующие параметры:
/**
* Renders a view.
*
* @param string $view The view name
* @param array $parameters An array of parameters to pass to the view
* @param Response $response A response instance
*
* @return Response A Response instance
*
* @final since version 3.4
*/
Итак, пока вы передаете правильное имя представления: @BUNDLE_NAME:RESOURCE_NAME_FOLDER:TWIG_FILE, все должно быть хорошо.
ОБНОВИТЬ:
Я думаю, что понял, что вам нужно, после того, как вы предоставили более подробную информацию. Поскольку пример не был предоставлен, я попытаюсь работать с реалистичным сценарием.
Представьте, что у вас есть 2 шаблона, синий и красный, они различаются по структуре и цвету, но содержание в основном одинаковое. Тогда у меня будет 2 каталога в папке моего шаблона.
/app
/Resources
/views
/blue
base_template.html.twig
/red
base_template.html.twig (they can have different names it doesn't really matter)
каждый из них будет определять base_template, где вы устанавливаете свой импорт и другие особенности шаблона.
Теперь на вашем контроллере вы получаете значение base_template из БД, как это уже делает ваша функция.
Затем в своем контроллере вы можете использовать это значение и передать его в свой шаблон, который будет динамически расширять его.
public function indexAction()
{
return $this->render('AppBundle:Home:index.html.twig',["base_template"=>loadTpl()]);
}
Наконец, в вашем файле ветки вы должны расширить шаблон следующим образом:
{% extends base_template %}
{% block content %}
<div class = "container">
My content
</div>
{% endblock %}
Вот ссылка на: Динамическое наследование Twig
Хорошо, но тогда мне нужно проверить фактический шаблон в каждом контроллере, верно? Невозможно использовать $this->render('settings/basicsettings.html.twig') и путь (dashboard/settings/.....)?
Можете ли вы привести пример того, что вы получаете от БД? Если путь указан относительно пакета, вы можете жестко закодировать @Bundle_name и получить имя шаблона из БД.
Я получаю имя (приборная панель) по шаблону примера. Если я редактирую путь к шаблону в twig.yaml, он работает нормально. Но мне нужно динамическое решение, когда я изменяю активный шаблон в базе данных.
@DanielRichter Извините, но я не могу понять вашу проблему. Приведите полный пример : stackoverflow.com/help/mcve
я отредактировал свой вопрос, надеюсь, теперь вы можете следовать моим идеям
@DanielRichter, пожалуйста, проверьте мое обновление и дайте мне знать, если оно отвечает на ваш вопрос.
Именно то, что я хочу. Большое спасибо. Это может быть так просто... Спасибо :)
В чем твоя проблема? Чего вы хотели добиться? Где вы хотите вызвать эту функцию?