Управление различными базовыми шаблонами из базы данных в Symfony

Я пытаюсь управлять несколькими шаблонами в 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(), но я не могу найти нужный файл. ИЛИ: У кого-нибудь есть идея, как лучше решить эту проблему.

В чем твоя проблема? Чего вы хотели добиться? Где вы хотите вызвать эту функцию?

Michael Sivolobov 02.02.2019 08:35

метод рендеринга symfony не видит это значение. Вот почему я ищу способ напрямую ввести путь в метод рендеринга, но я не нашел правильного метода (я нашел 8 методов рендеринга(), и ничего не работает). Нет никаких изменений после изменения метода рендеринга.

Daniel Richter 02.02.2019 08:44
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
366
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Функция рендеринга ожидает следующие параметры:

/**
 * 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/.....)?

Daniel Richter 02.02.2019 09:03

Можете ли вы привести пример того, что вы получаете от БД? Если путь указан относительно пакета, вы можете жестко закодировать @Bundle_name и получить имя шаблона из БД.

113408 02.02.2019 09:26

Я получаю имя (приборная панель) по шаблону примера. Если я редактирую путь к шаблону в twig.yaml, он работает нормально. Но мне нужно динамическое решение, когда я изменяю активный шаблон в базе данных.

Daniel Richter 02.02.2019 09:38

@DanielRichter Извините, но я не могу понять вашу проблему. Приведите полный пример : stackoverflow.com/help/mcve

113408 02.02.2019 13:40

я отредактировал свой вопрос, надеюсь, теперь вы можете следовать моим идеям

Daniel Richter 03.02.2019 10:18

@DanielRichter, пожалуйста, проверьте мое обновление и дайте мне знать, если оно отвечает на ваш вопрос.

113408 03.02.2019 12:30

Именно то, что я хочу. Большое спасибо. Это может быть так просто... Спасибо :)

Daniel Richter 03.02.2019 13:50

Другие вопросы по теме