从Twig模板内导入HTML文件

时间:2014-03-16 10:59:01

标签: php html templates symfony twig

我想从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”

我也尝试了几条相对路径而没有成功。知道如何实现它?

2 个答案:

答案 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函数的输出中,因为很多东西都会在任何地方被转义。