Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Symfony include static html in template

I just started to learn how to use Symfony which i believe is straight forward but i have a little problem with the templating engine. I want to include a static HTML fragment in one of my twig templates in Symfony (2.5.6). For now i created a static subfolder inside the resources directory (this might change but it definitely won't be inside the view folder). However i can't get this done, i always end up with an unable to find template error. I find the documentation on this subject a bit sparse (see http://symfony.com/doc/current/book/templating.html#including-other-templates) also the twig docs can't help me out on this one. I'm not even sure if i can use the magic @Bundle notation or if i have to reside in the view folder as ../ notation is not allowed within the include tag.

I tried the following (and a couple of variations):

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

I guess symfony cannot handle raw html in include but i could use a php template without any template tags as well, so the question is just how to specify a location outside the view folder.

I know of http://github.com/kgilden/KGStaticBundle which will probably solve my issue but i can't believe that is not achievable with the default configuration.

EDIT: i just tried to include a regular template file from the very same directory specifying just the name of the template file (as done in the docs, see link above). Still i get an error also complaining it expects bundle:section:template.format.engine as its format. Is there an error in the docs?

like image 621
patman Avatar asked Nov 14 '14 12:11

patman


2 Answers

Looks like the poster found the solution while I was typing. I guess I'll leave this here for just a bit.

Creating and using twig namespaces is discussed here: http://symfony.com/doc/current/cookbook/templating/namespaced_paths.html

By default, each bundles get's it's own namespace pointing to the views directory. You can add additional directories by adjusting app/config.yml

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

Load the template with: '@FashionMedia/pricing.html'

I won't go into all the details but you can also use a compiler pass(http://symfony.com/doc/current/cookbook/service_container/compiler_passes.html) to add additional paths from inside the bundle itself without having to adjust config.yml:

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'));        
}
}
like image 135
Cerad Avatar answered Nov 15 '22 08:11

Cerad


Try this:

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

If you want to put this file in another directory I suggest you to use a symbolic link (I don't know if Twig can include a file which is not in the Resources directory).

like image 31
A.L Avatar answered Nov 15 '22 08:11

A.L