• Symfony4 - Как подключить несколько вариантов оформления/дизайна сайта, и организовать переключение между ними?

    @virtex2000 Автор вопроса
    Спасибо всем, кто ответил, и за идею с Kernel. В очередной раз "полез" в доки, и нашел ещё вариант решения.

    Получается, Symfony4 компилирует конфигурацию, контроллеры, расширения, шаблоны и т.д., и складывает это всё в папку /var/cache, где уже путь к шаблонам жестко прописан. И поменять его после этого в приложении скорее всего не получится.

    Значит нам изначально надо создать 2 конфигурации, и в нашем случае в зависимости от $_SERVER['SERVER_NAME'] выбирать одну из них.

    Для этого вносим правки в сonfig/packages/twig.php

    <?php		
    		if (isset($_SERVER['SERVER_NAME']) && preg_match("/m.example.com/i", $_SERVER['SERVER_NAME'])) {
    	
    			$container->loadFromExtension('twig', [
    				  'paths' => [
    									'%kernel.project_dir%/templates_mobile' => null
    									],
    									
    					// ... другие опции конфига
    			]);
    		} else {
    			$container->loadFromExtension('twig', [
    				  'paths' => [
    									'%kernel.project_dir%/templates' => null
    									],
    									
    					// ... другие опции конфига
    			]);
    		}


    Если у вас конфигурация в файле twig.yaml, перепишите её в формате twig.php, и после этого файл twig.yaml удалите.

    И вносим правки в src/Kernel.php

    <?php
    	 // ...
    	 
    	 public function getCacheDir(): string
    	 {
    		if (isset($_SERVER['SERVER_NAME']) && preg_match("/m.example.com/i", $_SERVER['SERVER_NAME'])) {	
    			return $this->getProjectDir()."/var/cache_mobile/".$this->environment;
    		} else {
    			return $this->getProjectDir()."/var/cache/".$this->environment;
    		}
    	 }
    	 
    	 // ...
    Ответ написан
  • Как правильно в Symfony 4 передавать данные в twig?

    @virtex2000
    Как вариант, для меню делаем отдельный шаблон, затем создаем контроллер для вывода этого меню, и в основном шаблоне base.html.twig вызываем этот контроллер.

    <!DOCTYPE html>
    <html>
        <head>
        </head>
        <body>
           {{ render(controller('App\\Controller\\MenuController::menu')) }}
    
            {% block body %}{% endblock %}
           		  
            {% block footer %}{% endblock %}
        </body>
    </html>
    Ответ написан
  • Как в Twig передать значение переменной из дочернего шаблона в родительский?

    @virtex2000
    index.html.twig
    {% extends 'base.html.twig' %}
    
    {% block footer %}
    {% set TestVar = 'testvalue' %}  // Назначаем значение переменной
    {{ parent() }}
    {% endblock %}
    Ответ написан
    Комментировать