在Twig模板中切换主题

时间:2016-01-15 00:31:57

标签: symfony twig

我有一个功能齐全的网站,有Symfony和Twig。

现在我想这样做:在src/AppBundle/Resources/views文件夹中放置两个或多个主题,例如theme1theme2,位于两个不同的目录下:theme1和{{1所以我可以以某种方式快速改变我的网站的主题。

我将模板参考放在我的TWIG模板中:

theme2

类似于:

return $this->render('AppBundle:default:index.html.twig'...

但它不起作用:无法找到模板。

对此有何帮助?

2 个答案:

答案 0 :(得分:2)

而不是:

return $this->render('AppBundle:theme1:default:index.html.twig'...

你应该用这个:

return $this->render('AppBundle:theme1/default:index.html.twig'...

或者这个:

return $this->render('AppBundle:theme1:default/index.html.twig'...

答案 1 :(得分:0)

我已经在我的Symfony项目中完成了这项工作,具体取决于我从哪个域查看我的网站。您可能有不同的用例,但这里是我如何实现结果的示例。

将以下函数添加到 src / YourBundle / DependencyInjection / Configuration.php

public function getConfigTreeBuilder()
{
    $treeBuilder = new TreeBuilder();
    $rootNode = $treeBuilder->root('bundle_name');

    $rootNode
            ->children()
                ->arrayNode('sites')
                ->prototype('array')
                    ->children()
                        ->scalarNode('domain')->isRequired()->cannotBeEmpty()->validate()->ifNull()->thenInValid("Domain name must be set")->end()->end()
                        ->scalarNode('template_directory')->isRequired()->cannotBeEmpty()->validate()->ifNull()->thenInValid("Template Directory must be set")->end()->end()
                    ->end()
                ->end()
            ->end()
    ;

    return $treeBuilder;
}

将bundle_name替换为您选择的名称。

将以下内容添加到 app / config / parameters.yml

bundle_name:
    sites:
        site1:
            domain: first-domain.tld
            template_directory: theme1
        site2:
            domain: second-domain.tld
            template_directory: theme2

您可以根据需要添加任意数量的网站 - 只要您拥有主题设置

创建一个事件监听器 src / YourBundle / EventListener / TemplateListener.php

<?php

    namespace YourBundle\EventListener;

    use Symfony\Component\HttpKernel\Event\FilterControllerEvent;

    class TemplateListener
    {

        /** @var \Twig_Environment */
        private $twig;

        /**
         * @var array
         */
        private $hostsConfig;

        public function __construct(\Twig_Environment $twig, $hostsConfig) {
            $this->twig = $twig;
            $this->hostsConfig = $hostsConfig;
        }

        public function onKernelController(FilterControllerEvent $event) {
            $currentHost = $event->getRequest()->getHost();

            if(isset($this->hostsConfig[$currentHost])) {
                $templateDirectory = $this->hostsConfig[$currentHost]['template_directory'];    
            } else {
                $templateDirectory = 'theme1';
            }

            $this->twig->getLoader()->prependPath(dirname(__DIR__) . '/../YourBundle/Resources/views/' . $this->hostsConfig[$currentHost]['template_directory']);
        }
    }

默认情况下,它会呈现&#39; theme1&#39;但如果它存在于 parameters.yml 中,那么它将匹配模板目录并从该目录中呈现视图。

更新 src / YourBundle / DependencyInjection / YourBundleExtension.php

    public function load(array $configs, ContainerBuilder $container)
    {
        //...

        $sites = array();

        //Re arrange the sites configuration to be easily accessed by domain as index
        foreach ($config['sites'] as $siteConfig) {
            $sites[$siteConfig['domain']]['template_directory'] = $siteConfig['template_directory'];
        }

        $container->setParameter('hosts.config', $sites);

        //...
    }

您需要更新所有控制器(或用于渲染视图的任何内容)。

您只需使用相对路径,就像使用 views / theme1(或)theme2 / 一样,而不是使用 Class:Bundle:Folder 的常规方法

return $this->render(
    'default/index.html.twig',
    array(
        ...
    )
)

这将检查
    的的src / YourBundle /资源/视图/ THEME1 /默认/ index.html.twig


    的的src / YourBundle /资源/视图/ THEME2 /默认/ index.html.twig

取决于您访问的域名。

The original tutorial that I followed was here.