2012-10-18 9 views
6

मैं एक सरल base.html.twig टेम्पलेट फ़ाइल लोड करने का प्रयास करता हूं जो सिम्फनी के डिफ़ॉल्ट स्थान app/Resources/views/ से कस्टम स्थान theme/ पर ले जाया गया था।Symfony2: Twig: कस्टम स्थान में डिफ़ॉल्ट टेम्पलेट फ़ाइल

टेम्पलेट फ़ाइल में शामिल हैं:

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

नियंत्रक-विशिष्ट टेम्पलेट

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

एक त्रुटि कह Unable to find template "::base.html.twig" in "AcmeCoreCoreBundle:Default:index.html.twig". की ओर जाता है का उपयोग करके नियंत्रक Acme\Core\CoreBundle\Controller से ऊपर टेम्पलेट फ़ाइल का विस्तार।

सिम्फनी को यह बताना संभव है कि वैश्विक अंतरिक्ष में टेम्पलेट फ़ाइलों को कहां खोजें?

अग्रिम धन्यवाद।

+0

'\ Twig_Loader_Filesystem :: addPath ($ पथ, $ नाम स्थान = '__main __')' (देखें [स्रोत] (https के साथ किया जा सकता है : //github.com/fabpot/Twig/blob/master/lib/Twig/Loader/Filesystem.php)) लेकिन यह सुनिश्चित नहीं है कि आप इसे कहां से कॉल करेंगे। TwigBundle कॉन्फ़िगरेशन पर भी एक नज़र डाली, लेकिन ऐसा नहीं लगता कि इसके लिए एक विकल्प है। यदि कोई इस पर आगे बढ़ना है, तो यह मदद कर सकता है। –

उत्तर

7

एडम के संकेत के कारण मैं अपने प्रश्न का उत्तर देने में सक्षम हूं। इसलिए यदि कोई दिलचस्पी लेता है तो मैं अपना उत्तर देना चाहता हूं।

AcmeDemoBundle एक टवीग एक्सटेंशन (कक्षा Acme\DemoBundle\Twig\Extension\DemoExtension) प्रदान करता है जिसे आप आसानी से उपयोग कर सकते हैं। कन्स्ट्रक्टर को

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

अब टिग एक्सटेंशन को पंजीकृत करने के लिए सिम्फनी को बताएं। अपने config.yml फ़ाइल (उदा app/config/config.yml) संपादित करें और संलग्न

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

इतना ही नहीं बल्कि अपने विस्तार टहनी फ़ाइल बदल सकते हैं और आपके डिफ़ॉल्ट टेम्पलेट का नाम स्थान से :: निकालें: {% extends 'base.html.twig' %}

+1

मेरे संकेत ने मुझे सही दिशा में इंगित किया, और साझा करने के लिए धन्यवाद। यह समाधान प्रारंभिक रूप से प्रदान करने के बारे में सोचने की तुलना में अधिक सुरुचिपूर्ण है। –

1

एक कार्रवाई आप (सेवा) -container से 'twig.loader' सेवा प्राप्त कर सकते हैं से:

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

और फिर आप अपने टेम्पलेट में इस पथ का उपयोग कर सकते हैं।

@besta ने इसे टहनक विस्तार के साथ किया, जो कि कन्स्ट्रक्टर में ट्विग लोडर इंजेक्शन लगा रहा था। लेकिन टहनी विस्तार में आप पर्यावरण का उपयोग कर सकते हैं:

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

मैं इस के लिए एक और समाधान जो इसे लागू करना बहुत तेज है खोजने के लिए कामयाब रहे। मैंने पहले इस प्रश्न पर स्वीकृत उत्तर का प्रयास किया था लेकिन अभी भी इस तरह के पथ मुद्दे थे।

से ठीक पहले मेरी प्रस्तुत करना टेम्पलेट मैं इस तरह twig.loader कंटेनर के लिए पथ जोड़ा फोन:

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

अब टहनी टेम्पलेट्स एक निर्देशिका रूट फ़ोल्डर में 'विषय' कहा जाता है से रेंडर किया जाएगा। मुझे यहां एक टिग बग के जवाब पर फैबियन पोंटेन्सीर (सिम्फनी और ट्विग के निर्माता) से यह समाधान मिला: https://github.com/symfony/symfony/issues/1912

+0

यह एक सटीक के लिए देख रहे हैं! – Subdigger

11

एक अच्छी तरह से आप जो चाहते हैं उसे ठीक करने के लिए एक मूल विशेषता है। आकस्मिक रूप से आप ऐप/कॉन्फ़िगरेशन में ट्विग कॉन्फ़िगरेशन में एक ट्विग नेमस्पेस जोड़ सकते हैं।इस तरह YML:

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

यह फ़ोल्डर vendor/acme/foo-bar/templates को एक उपनाम बनाता है और फिर आप अपने टेम्पलेट रेंडर करने के लिए उपयोग कर सकते हैं या तो नियंत्रकों से:

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

या से अन्य टहनी टेम्पलेट्स

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

स्रोत: आधिकारिक कुकबुक http://symfony.com/doc/current/cookbook/templating/namespaced_paths.html

1

मान लीजिए कि आप इसे वैश्विक स्तर पर करना चाहते हैं, इस तरह की चीजें compiler pass में की जानी चाहिए।

यह अधिक स्वच्छ और इस तरह कुशल होगा:

<?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

यह काम नहीं करता है, यह वापस आता है '' आपने एक मौजूदा सेवा का अनुरोध किया है "twig.loader" '। आपको 'twig.loader.filesystem' का उपयोग करने की आवश्यकता है – sschueller

संबंधित मुद्दे