2012-10-18 13 views
6

Ich versuche, eine einfache base.html.twig Template-Datei zu laden, die von Symfony Standardposition app/Resources/views/ dem benutzerdefinierten Standort theme/ verschoben wurde.Symfony2: Zweig: Standard-Vorlagendatei in benutzerdefinierten Ort

Die Vorlagendatei enthält:

<!DOCTYPE html> 
    <html> 
    <head> 
    ... 
    </head> 
    <body> 
     {% block body %}{% endblock %} 
    </body> 
    </html> 

die obige Template-Datei von der Steuerung erweitert Acme\Core\CoreBundle\Controller durch die steuerungsspezifische Vorlage

{% extends '::base.html.twig' %} 
    {% block body %} 
     Hello world! 
    {% endblock %} 

zu einem Fehler führt Unable to find template "::base.html.twig" in "AcmeCoreCoreBundle:Default:index.html.twig". sagen.

Wie ist es möglich, Symfony mitzuteilen, wo die Vorlagendateien im globalen Bereich zu finden sind?

Vielen Dank im Voraus.

+0

konnte mit dem '\ Twig_Loader_Filesystem :: addpath ($ path, $ namespace = '__main __')' (siehe [Quelle] (https erfolgen : //github.com/fabpot/Twig/blob/master/lib/Twig/Loader/Filesystem.php)), aber nicht sicher, woher du es nennen würdest. Habe mir auch die TwigBundle-Konfiguration angesehen, sieht aber nicht so aus, als gäbe es da eine Option dafür. Wenn jemand weiter darüber expandieren könnte, könnte es helfen. –

Antwort

7

Aufgrund von Adams Hinweis kann ich die Frage selbst beantworten. So möchte ich meine Antwort geben, wenn jemand interessiert ist.

Die AcmeDemoBundle bietet eine Zweig Erweiterung (Klasse Acme\DemoBundle\Twig\Extension\DemoExtension), die Sie einfach verwenden können. Ändern Sie den Konstruktor in

public function __construct(FilesystemLoader $loader) 
    { 
    $this->loader = $loader; 
    $this->loader->addPath('path/to/your/directory'); 
    } 

Jetzt teilen Sie Symfony die Zweig Erweiterung registrieren. Bearbeiten Sie Ihre config.yml Datei (z app/config/config.yml) und hängen

services: 
    demo.twig.extension 
     class: Acme\DemoBundle\Twig\Extension\DemoExtension 
     tags: 
     - { name: twig.extension } 
     arguments: 
     - @Twig.loader 

Last but not least Ihre Verlängerung Zweig Datei ändern und entfernen Sie die :: aus Standardvorlage Namensraum: {% extends 'base.html.twig' %}.

+1

Froh, dass mein Hinweis Sie in die richtige Richtung wies, und danke für das Teilen. Diese Lösung ist eleganter als die, über die ich ursprünglich nachgedacht habe. –

1

Von einer Aktion den ‚twig.loader'-Service von den (Service) -container bekommen:

$this->get('twig.loader')->addPath('path/to/your/directory'); 

Und dann können Sie diesen Pfad in Ihrer Vorlage verwenden.

@besta hat es mit einer Zweigverlängerung gemacht und den Zweiglader in den Konstruktor eingefügt. Aber in Zweig Erweiterung können Sie die Umgebung verwenden:

class YourTwigExtension extends \Twig_Extension { 
... 
    public function initRuntime(\Twig_Environment $environment) { 
     $this->environment = $environment; 
     $this->environment->getLoader()->addPath(__DIR__ . '/Resources/views'); 
    } 
... 
} 
5

Ich habe es geschafft, eine andere Lösung zu finden, die viel schneller zu implementieren ist. Ich habe zuerst die akzeptierte Antwort zu dieser Frage versucht, hatte aber immer noch Probleme mit dem Pfad.

Kurz vor meiner macht die Vorlage ruft ich den Pfad zum twig.loader Container wie folgt hinzugefügt:

$this->container->get('twig.loader')->addPath('../../../../theme/', $namespace = '__main__'); 

Jetzt Vorlagen Zweig werden aus einem Verzeichnis mit dem Namen ‚Thema‘ im Stammordner wiedergegeben werden. Ich fand diese Lösung von Fabien Pontencier selbst (der Schöpfer von Symfony und Zweig) auf einer Antwort auf einen Zweig Fehler hier: https://github.com/symfony/symfony/issues/1912

+0

auf der Suche nach genau diesem! – Subdigger

11

Es gibt eine native Funktion zu tun genau das, was Sie in einer schönen Weise wollen. Im Wesentlichen können Sie der Zweigkonfiguration in app/config einen Zweig-Namespace hinzufügen.yml wie folgt aus:

twig: 
    # ... 
    paths: 
     "%kernel.root_dir%/../vendor/acme/foo-bar/templates": foo_bar 

Dies erzeugt einen Alias ​​in den Ordner vendor/acme/foo-bar/templates und dann können Sie es verwenden, um Ihre Vorlagen zu machen entweder von den Steuerungen:

return $this->render(
    '@foo_bar/template.html.twig', 
    $data 
); 

oder aus anderen Zweig Vorlagen

{% include '@foo_bar/template.html.twig' %} 

Quelle: amtliches Kochbuch http://symfony.com/doc/current/cookbook/templating/namespaced_paths.html

1

Angenommen, Sie möchten, dass dies global gemacht wird, soll dies in einer compiler pass gemacht werden.

Es wäre viel sauberer und effizienter wie folgt aus:

<?php 

use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; 
use Symfony\Component\DependencyInjection\ContainerBuilder; 

class CustomCompilerPass implements CompilerPassInterface 
{ 
    public function process(ContainerBuilder $container) 
    { 
     $loader = $container->getDefinition('twig.loader'); 
     $loader->addMethodCall('addPath', array('/path/to/views')); 
    } 
} 
+0

Dies funktioniert nicht, es kommt zurück mit ''Sie haben einen nicht existenten Dienst" twig.loader "' angefordert. Sie müssen 'twig.loader.filesystem' verwenden – sschueller

Verwandte Themen