2011-09-28 12 views
17

प्रस्तुत करना मैं एक PHP अनुप्रयोग में जुड़वां templating इंजन intergrating हूँ। विशेष रूप से, मैं रूपों को प्रस्तुत करने के लिए टहन इंजन का उपयोग करना चाहता हूं।ट्विग: कुछ ब्लॉक चुनना और उन्हें

कैसे symfony2 टहनी का उपयोग करता प्रपत्र विजेट प्रस्तुत करना पर एक नज़र था करने के बाद, वे एक बड़े टेम्पलेट फ़ाइल जो इतनी तरह सभी विजेट शामिल है:

(...) 
{% block password_widget %} 
{% spaceless %} 
    {% set type = type|default('password') %} 
    {{ block('field_widget') }} 
{% endspaceless %} 
{% endblock password_widget %} 

{% block hidden_widget %} 
    {% set type = type|default('hidden') %} 
    {{ block('field_widget') }} 
{% endblock hidden_widget %} 

{% block email_widget %} 
{% spaceless %} 
    {% set type = type|default('email') %} 
    {{ block('field_widget') }} 
{% endspaceless %} 
{% endblock email_widget %} 

{% block test_widget %} 
{% spaceless %} 
    <div> 
    {{test}} 
    <div> 
{% endspaceless %} 
{% endblock test_widget %} 

(...) 

सवाल मेरे पास है है कैसे कर सकते हैं मैं "हड़पने" इस टेम्पलेट से बाहर ब्लॉक और उन्हें प्रस्तुत करते हैं?

अब तक, मैं टेम्पलेट लोड, और ब्लॉक पाने फोन सभी ब्लॉक पाने के लिए कर रहा हूँ:

twig = new \Twig_Environment($loader, array('cache' => 'cache')); 
$template = $twig->loadTemplate('view\form_div_layout.html.twig'); 
//var_dump($template->getBlocks()); //try getting all blocks 
$template->displayBlock('test_widget', array('test' => 'test')); 
echo $template->render(); 

दुर्भाग्य से, मैं इस मामले में सिर्फ 'test_widget' ब्लॉक रेंडर करने के लिए सक्षम नहीं हूँ। टेम्पलेट से 'test_widget' ब्लॉक को पुनर्प्राप्त करने के लिए मुझे क्या करना चाहिए और फिर पूरे फॉर्म को प्रस्तुत करने के लिए इसे एक अलग टेम्पलेट में डालें?

+0

यह मेरे लिए काम कर सकता है, क्या आप साझा कर सकते हैं कि आपने कैसे Iinstantiated किया है, या '$ loader' का उपयोग किया है? – blamb

उत्तर

22

यह बताता है कि किसी को इसके बजाय $template->renderBlock('blockname', array('test' => 'test')); का उपयोग करना चाहिए। इससे टिग उस ब्लॉक को रेंडर कर देगा और फिर उस ब्लॉक के लिए मार्कअप युक्त एक स्ट्रिंग वापस कर देगा। इसके बाद कोई इसे प्रदर्शित करने या इसे अन्य टेम्पलेट्स में डालने के लिए गूंज का उपयोग कर सकता है।

पूर्ण उदाहरण:

$loader = new \Twig_Loader_Filesystem(array('/my-template-root')); 
$twig = new \Twig_Environment($loader, array('debug' => true)); 
$template = $twig->loadTemplate('view\form_div_layout.html.twig'); 
$result = $template->renderBlock('blockname', array('test' => 'test')); 
echo $result; 
+1

दूसरे पैरामीटर का उपयोग क्या है? – Aoi

+2

दूसरा पैरामीटर टेम्पलेट में दिखाई देने वाले चरों की एक सरणी है। उदाहरण के लिए, '{{test}}'। – F21

+0

मुझे इस भाग को समझने में बहुत मुश्किल समय है, क्योंकि जब मैं ऐसा करता हूं, तो मुझे अपवाद मिल रहा है, जैसे कि एक यूएसई स्टेटमेंट भी होना चाहिए। क्या आप कह रहे हैं कि अगर यह टहन इंजन का विस्तार करने के लिए आवश्यक है तो यह किसी भी यूईईई स्टेटमेंट को विस्तारित/एम्बेडेड किया गया है? भले ही मैं करता हूं, यह काम नहीं करता है। – blamb

3

यह बहुत अच्छा है! मैं यह भी जोड़ना चाहता था कि hasBlock फ़ंक्शन है जो आपको टेम्पलेट प्रतिपादन करने का प्रयास करने से पहले सत्यापन करने की अनुमति देता है। यह आपको टेम्पलेट को मान्य करने की अनुमति देता है जैसा कि अपेक्षित के रूप में बनाया गया है, या मेरे मामले में वैकल्पिक ब्लॉक हैं। क्या इसके लायक है के लिए, यहाँ मेरे कंसोल ऐप्स से एक उदाहरण है जो सूचना ईमेल

 $templateContent = $this->getContainer()->get('twig')->loadTemplate('FTWGuildBundle:AuctionNotification:notificationEmail.html.twig'); 
     $body = $templateContent->renderBlock('body', array('siteDomain' => $siteClient->getSiteDomain(), 'staticContentDomain' => $siteClient->getStaticContentDomain(), 'batch' => $batch->getNotifications(), 'auction_notification_lockout_period' => $this->getContainer()->getParameter('auction_notification_lockout_period'))); 
     $subject = ($templateContent->hasBlock("subject") 
      ? $templateContent->renderBlock("subject", array('batchSize' => $batch->getSize(), 'batch' => $batch)) 
      : "Auction House Notifications"); 
0

नोट भेजता है: टेम्पलेट का विस्तार या एक माता पिता के ब्लॉक को एम्बेड करता है, तो hasBlock काम नहीं करेगा।

आप Symfony उपयोग कर रहे हैं और अभी भी वैश्विक चर (अनुप्रयोग, app.user, आदि) के लिए उपयोग करने में सक्षम होना चाहता हूँ तो यह अच्छा काम करता है https://github.com/twigphp/Twig/issues/450

+0

जैसा नहीं है अभी पेज पर 404। –

1

देखें:

private function renderBlock($template, $block, $params = array()) 
{ 
    /** @var \Twig_Environment $twig */ 
    $twig = $this->get('twig'); 
    /** @var \Twig_Template $template */ 
    $template = $twig->loadTemplate($template); 

    return $template->renderBlock($block, $twig->mergeGlobals($params)); 
} 

मैंने अभी जोड़ा है कि यह मेरे नियंत्रक पर एक निजी समारोह है। बहुत अच्छा काम करता है। सही दिशा में मुझे इंगित करने के लिए @ एफ 21 के लिए धन्यवाद।

+0

इसके बजाय 'लोड() 'का उपयोग करें, यह @ loadTemplate()' के विपरीत नहीं है – Riki137

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