2014-11-14 144 views
3

我刚开始学习如何使用Symfony,我相信这很直接,但是我对模板引擎有点问题。我想在Symfony中的一个我的树枝模板(2.5.6)中包含一个静态HTML片段。现在我在资源目录中创建了一个静态子文件夹(这可能会改变,但绝对不会在视图文件夹内)。然而,我无法完成这件事,我总是以unable to find template错误结束。我发现关于这个主题的文档有点稀少(参见http://symfony.com/doc/current/book/templating.html#including-other-templates),枝条文档也无法帮助我解决这个问题。我甚至不确定我是否可以使用魔术@Bundle符号,或者如果我必须驻留在视图文件夹中,因为../符号在include标签中是不允许的。Symfony包含模板中的静态html

我尝试了以下(和一对夫妇的变化):

{{ include('@FashionMediaBundle/Resources/static/pricing.html') }} 

我猜包括但我可以使用,没有任何模板标签以及一个PHP模板的symfony不能处理原始的HTML,所以这个问题是只是如何指定视图文件夹之外的位置。

我知道http://github.com/kgilden/KGStaticBundle这可能会解决我的问题,但我不能相信这是不可实现的默认配置。

编辑:我只是试图从指定模板文件的名称(如在文档中完成,请参阅上面的链接)相同的目录中包含一个常规模板文件。尽管如此,我仍然收到一个错误,它也抱怨它预计为bundle:section:template.format.engine作为它的格式。文档中是否有错误?

+1

如果你的包被称为'FashionMediaBundle'然后取出束部,树枝命名空间的路径被称为没有它,就像这样:'@ FashionMedia' – xurshid29 2014-11-14 12:54:09

+0

@ xurshid29不,这不是,但你必须忽略'@ '。我有一个工作测试用于另一个模板,其中包括“FashionMediaBundle:Static:include.html.php”,但不适用于“FashionMedia:Static:include.html.php”。 – patman 2014-11-14 14:13:53

+0

不,它不是但是[阅读此](http: //symfony.com/doc/current/cookbook/templating/namespaced_pa​​ths.html):) – xurshid29 2014-11-14 15:13:16

回答

4

貌似海报找到了解决办法,而我打字。我想我会在这里留下一点点。

创建和使用树枝命名空间在这里讨论:http://symfony.com/doc/current/cookbook/templating/namespaced_paths.html

默认情况下,每束得到的它自己的命名空间指向views目录。您可以通过调整应用程序/ config.yml

twig: 
    debug:   %kernel.debug% 
    strict_variables: %kernel.debug% 
    paths: 
     "%kernel.root_dir%/../../cerad2/src/Cerad/Bundle/FashionMediaBundle/Resources/static": FashionMedia 

装入模板,添加额外的目录:“@ FashionMedia/pricing.html”

我不会进入所有的细节,但你也可以使用一个编译器传递(http://symfony.com/doc/current/cookbook/service_container/compiler_passes.html)可以从bundle内部添加额外的路径,而无需调整配置。阳明:

class Pass implements CompilerPassInterface 
{ 
public function process(ContainerBuilder $container) 
{ 
    $bundleDirAction = $container->getParameter('cerad_api01__bundle_dir') . '/Action'; 

    $twigFilesystemLoaderDefinition = $container->getDefinition('twig.loader.filesystem'); 

    $twigFilesystemLoaderDefinition->addMethodCall('addPath', array($bundleDirAction, 'CeradApi01'));   
} 
} 
+3

感谢您的帮助!请永久保留它,因为它似乎是这个更完整的答案。 – patman 2014-11-14 16:37:03

1

试试这个:如果你希望把其他目录这个文件,我建议你使用

{{ include('FashionMediaBundle:Resources:static:pricing.html') }} 

一个symbolic link(我不知道是否能枝杈包括文件,该文件是不是在Resources目录)。

+0

仍然是相同的结果。 – patman 2014-11-14 14:10:31

+0

您的文件是否位于'FashionMediaBundle/Resources/views/static/pricing.html'路径中? – 2014-11-14 14:13:11

+0

不,如上所述,它不在视图目录中,这是实际的复杂性。我有一个测试用例'{{include('FashionMediaBundle:Static:include.html.php')}}'它在views目录中工作,但是1)呈现为twig而不是php,2)没有捆绑和部分,但我不能这样做... – patman 2014-11-14 14:14:52

1

我找到了解决方案!

在树枝配置中,您可以设置路径并为它们分配一个名称。

twig: 
    [... twig options here ...] 
    paths: 
     "%kernel.root_dir%/../[path to static]": static_pages 

然后你就可以将它们包括在

{% include "@static_pages/pricing.html.twig" %}