我有一个功能齐全的网站,有Symfony和Twig。
现在我想这样做:在src/AppBundle/Resources/views
文件夹中放置两个或多个主题,例如theme1
和theme2
,位于两个不同的目录下:theme1
和{{1所以我可以以某种方式快速改变我的网站的主题。
我将模板参考放在我的TWIG模板中:
theme2
类似于:
return $this->render('AppBundle:default:index.html.twig'...
但它不起作用:无法找到模板。
对此有何帮助?
答案 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 强>
取决于您访问的域名。