2011-06-30 11 views
5

मैं विचारों कि कर सकते हैं खुद को कुछ html कोड प्रिंट, और एक ही समय में, नीचे करने के लिए जावास्क्रिप्ट कोड भेज बनाना चाहते हैं, लेआउट के विस्तार के बिना (सिम्फोनी 2 में)नीचे जावास्क्रिप्ट कैसे भेजें?

विचार यह है कि मैं एक लेआउट है , तो वर्तमान यूआरएल के लिए विशिष्ट दृश्य उस लेआउट को बढ़ाता है, और उस दृश्य के अंदर, मैं अन्य विचारों को शामिल करता हूं, जिनमें स्कोप से बाहर होने वाले अन्य ब्लॉक में कोड जोड़ने की शक्ति होती है (क्योंकि वे लेआउट से प्राप्त नहीं होते हैं या देखें कि इससे विरासत मिलती है)। क्या यह संभव है?

मान लीजिए यह मेरी लेआउट का एक हिस्सा है:

{# ::layout.html.twig #} 
. 
. 
{% block javascripts %} 
{% endblock %} 
</body> 
. 
. 

और यह मेरा दृष्टिकोण है:

{# Company:Bundle:about.html.twig #} 
{% extends '::layout.html.twig' %} 
. 
. 
{% include 'Company:buttons:google_button.html.twig' %} 
. 
. 

और इस दृश्य मैं शामिल करना चाहते हैं, उदाहरण के लिए, एक गूगल +1 है बटन:

{# Company:buttons:google_button.html.twig #} 
<gb></gb> {# or whatever #} 

{# somehow send '<script>blabla</script>' to the 'javascripts' block #} 

क्या यह इस तरह कुछ ऐसा करना संभव है जो twig और symfony2 के साथ ऐसा करना संभव है?

उत्तर

2

मुझे लगता है कि आपको अपना खुद का ट्विग एक्सटेंशन लिखना होगा जो दो कार्यों को परिभाषित करेगा, मान लें कि add_js और print_js

टहनी एक्सटेंशन:

namespace Me\MyBundle\Twig\Extension; 

class MyExtension extends \Twig_Extension { 
    private $js = array(); 

    /** 
    * {@inheritdoc} 
    */ 
    public function getFunctions() { 
     return array(
      'put_js' => new \Twig_Function_Method($this, 'putJs', array('is_safe' => array('html'))), 
      'print_js' => new \Twig_Function_Method($this, 'printJs', array('is_safe' => array('html'))) 
     ); 
    } 

    public function putJs($js) { 
     $this->js[] = $js; 
    } 

    public function printJs() { 
     return implode(PHP_EOL, $this->js); 
    } 

    /** 
    * Returns the name of the extension. 
    * 
    * @return string The extension name 
    */ 
    public function getName() { 
     return 'my'; 
    } 
} 

निर्भरता इंजेक्शन विन्यास:

<service id="twig.extension.me.my" class="Me\MyBundle\Twig\Extension\MyExtension" public="false"> 
    <tag name="twig.extension" /> 
</service> 

अंतिम उपयोग:

{# ::layout.html.twig #} 

    ... 
    {{ print_js() }} 
</body> 

{# Company:buttons:google_button.html.twig #} 

{% put_js('<script>...</script>') %} 
1

मैं सिर्फ सटीक समस्या आप प्रयोग करें 'का उपयोग कर सामना कर रहे हैं लागू कर दिया है: http://twig.sensiolabs.org/doc/tags/use.html

कुछ रिफैक्टरिंग की आवश्यकता होगी क्योंकि आपको जावास्क्रिप्ट ब्लॉक को अपनी मुख्य बेस फ़ाइल से निकालना होगा और इसे एक जावास्क्रिप्ट ट्विग फ़ाइल में फिर से शामिल करना होगा। फिर अपने दृश्य के अंदर, आप पहली बार परिभाषित द्वारा जावास्क्रिप्ट ब्लॉक पहुँच सकते हैं:

:

{% use 'ExampleBundle::javascript.html.twig' with javascript' %}

+1

क्या आप कह रहे हैं कि मुझे लेआउट और दृश्य दोनों में 'उपयोग' ब्लॉक रखना है? अन्यथा, मेरा 'google_button' अंतिम आउटपुट के नीचे जावास्क्रिप्ट कोड भेजने में सक्षम कैसे होगा? यदि मैं लेआउट और दृश्य दोनों में 'उपयोग' ब्लॉक डालता हूं, तो क्या यह अंतिम आउटपुट में दो बार नहीं दिखाई देगा? – HappyDeveloper

2

सिर्फ मैं एक पहले से ही समाप्त हो गया बंडल नहीं मिला एक बंडल @Crozin से लेकिन packagist.org पर कोड युक्त लागू करने के लिए करना चाहता था Asset Managment Bundle