我想从Twig模板中导入HTML文件。 HTML文件位于/var/files/5
(没有扩展名)。我像这样渲染模板:
$path = $_SERVER['DOCUMENT_ROOT'] . '/../var/files/5';
$content = $this->get('templating')->render('ProConvocationBundle:Default:definitive-view.html.twig', array('path' => $path));
在Twig模板中,我导入HTML文件,如下所示:
{% include path %}
但它找不到路径:无法找到模板“/ myDocumentRoot /../ app / var / files / 5”
我也尝试了几条相对路径而没有成功。知道如何实现它?
答案 0 :(得分:1)
在Symfony中,您应该创建与内核根目录相关的所有内容,即app
目录。
$uploadedTemplatesDir = $this->get('kernel')->getRootDir() . '/../var/files';
然后将其添加到模板加载器
$this->get('twig.loader')->addPath($uploadedTemplatesDir);
答案 1 :(得分:1)
在稍微挖掘Twig代码后,以下似乎会导致此异常:
Twig尝试从已知路径/命名空间加载文件,包括名称(如/var/www/myApplication/src/AcmeBundle/Resources/views
)和app
路径为myApplication/app/Resources/views
)。无论如何它不接受绝对路径,因为它总是试图将已知路径添加到给定文件的开头。
<?php
// Twig/Loader/Filesystem.php
class Twig_Loader_Filesystem {
// ...
protected function findTemplate()
{
// ...
foreach ($this->paths[$namespace] as $path) {
if (is_file($path.'/'.$shortname)) {
return $this->cache[$name] = $path.'/'.$shortname;
}
}
throw new Twig_Error_Loader(sprintf('Unable to find template "%s" (looked into: %s).', $name, implode(', ', $this->paths[$namespace])));
}
因此,基本上不可能通过absolue路径包含文件,就像你的例子一样。
你有很多可能实现这种行为:
见@Adam Elsodaney的帖子
您只需将文件从app/var/files
移至app/Resources/views/var/files
,然后使用路径var/files/5
包含该文件即可。这可能不是一个合适的解决方案,因为您希望保留这些文件。
您可以编写自己的扩展程序,提供名为include_absolute()
的函数,只返回file_get_contents($yourPath)
。
有关Twig扩展程序的更多信息:http://symfony.com/doc/current/cookbook/templating/twig_extension.html
请注意,您可能需要将|raw
过滤器添加到Twig函数的输出中,因为很多东西都会在任何地方被转义。