2012-04-04 8 views
16

मैं कस्टम सिम्फनी 2 फॉर्म फ़ील्ड प्रकार एक्सटेंशन में जावास्क्रिप्ट का उपयोग करना चाहता हूं। तो, मैं इस तरह टहनी एक्सटेंशन टेम्प्लेट है:सिम्फनी 2 कस्टम फॉर्म फ़ील्ड प्रकार: केवल एक बार जावास्क्रिप्ट और सीएसएस कैसे जोड़ें?

{% block some_widget %} 
    <input ... /> 

    <script src="some.js"></script> 
    <link href="some.css" /> 
{% endblock %} 

लेकिन मैं इन स्क्रिप्ट और लिंक टैग केवल एक बार मेरी HTML में, आदर्श सिर टैग में, आधार टेम्पलेट modifing बिना करना चाहते हैं। मैंने ट्विग ब्लॉक का विस्तार करने की कोशिश की, लेकिन मेरे पास फॉर्म टेम्पलेट के अंदर एक्शन टेम्पलेट ब्लॉक तक कोई पहुंच नहीं है। या शायद इस तरह कुछ:

{# widget tempate #} 
{% block some_widget %} 
    <input ... /> 

    {{ use_javascript('some.js') }} 
    {{ use_css('some.css') }} 
{% endblock %} 

{# main action template #} 
... 
<head> 
{{ dump_javascripts() }} 
{{ dump_css() }} 
</head> 
... 

सिम्फनी 2 फॉर्म + ट्विग के साथ ऐसा कैसे करें?

पीएस मेरी खराब इंग्लिश के लिए माफ़ कीजिये।

+0

आप बेस टेम्पलेट को संशोधित क्यों नहीं करना चाहते हैं? यह * वह स्थान है जहां आप जेएस \ सीएसएस फाइलों को आयात करना चाहते हैं – tamir

+2

मैं कुछ स्वयं-युक्त फॉर्म विजेट एक्सटेंशन बंडल बनाना चाहता हूं और केवल एक बार AppKernel.php में इस बंडल को सक्षम करना चाहता हूं। इसके अलावा, यदि मैं वर्तमान पृष्ठ में विजेट का उपयोग नहीं करता हूं तो मैं जेएस/सीएसएस शामिल नहीं करना चाहता हूं। –

+0

यह सिम्फनी (अब तक) में एक अनुपलब्ध विशेषता प्रतीत होता है। शायद हमें [django विजेट मीडिया] से प्रेरित होना चाहिए (https://docs.djangoproject.com/en/dev/topics/forms/media/#assets-as-a-static-definition) जिसमें संपत्ति केवल एक बार शामिल होती है विजेट वर्तमान –

उत्तर

0

इस प्रकार मैं इसका उपयोग करता हूं। आशा है कि आप यही खोज रहे हैं।

base.html.twig

<head> 
    {% block stylesheets %} 
     css... 
    {% endblock %} 
</head> 

foo.html.twig

{% extends '::base.html.twig' %} 

{% block stylesheets %} 
    {{ parent() }} 

    css that you need in foo.html.twig 

{% endblock %} 
+1

हां, नियमित दृश्य tempates के लिए यह सामान्य तरीका है (और मैं इसका उपयोग करता हूं)। लेकिन यह फॉर्म प्रकार टेम्पलेट्स के साथ काम नहीं करता है। –

1

सबसे अच्छा तरीका सीएसएस & स्क्रिप्ट लोड हो रहा है के साथ अलग टेम्पलेट प्रदान करना है। रीडमी तो केवल एक चीज डेवलपर में टिप्पणी करना चाहिए जाएगा

{% block stylesheets %} 
    {{ parent() }} 

    include "@MyBestBundle/Resources/view/styles.html.twig" 

{% endblock %} 

है या रूप डि साथ प्रतिपादन रोकना और संपत्तियां जोड़ने के लिए प्रयास करें। लेकिन लागू करना संभव है, तो इसे करना मुश्किल है।

6

मैं एक आत्म निहित प्रपत्र विजेट है कि जावास्क्रिप्ट की आवश्यकता है लिखना पड़ा, मैं प्राप्त करने के लिए आप event_dispatcherkernel.response पर सुन के माध्यम से करने के लिए Symfony\Component\HttpFoundation\Response के अंत में जावास्क्रिप्ट संलग्न करने के लिए कोशिश कर रहे हैं सक्षम था।

<?php 

namespace AcmeBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\EventDispatcher\EventDispatcherInterface; 
use Symfony\Component\Form\FormView; 
use Symfony\Component\Form\FormInterface; 

class AcmeFileType extends AbstractType{ 

    private $twig; 
    private $dispatcher; 

    public function __construct(\Twig_Environment $twig, EventDispatcherInterface $dispatcher){ 
    $this->twig = $twig; 
    $this->dispatcher = $dispatcher; 
    } 

    public function buildView(FormView $view, FormInterface $form, array $options){ 

    $javascriptContent = $this->twig->render('AcmeBundle:Form:AcmeFileType.js.twig', array()); 

    $this->dispatcher->addListener('kernel.response', function($event) use ($javascriptContent) { 

     $response = $event->getResponse(); 
     $content = $response->getContent(); 
     // finding position of </body> tag to add content before the end of the tag 
     $pos = strripos($content, '</body>'); 
     $content = substr($content, 0, $pos).$javascriptContent.substr($content, $pos); 

     $response->setContent($content); 
     $event->setResponse($response); 
    }); 

    } 

    ... 

जब आप अपने services.yml में अपने फ़ॉर्म के प्रकार को परिभाषित यह इस तरह दिखता है:

acme.form.acme_file_type: 
    class: AcmeBundle\Form\AcmeFileType 
    arguments: 
     - @twig 
     - @event_dispatcher 
    tags: 
     - { name: form.type, alias: acmefile } 

तो अब, हर आप acmefile जावास्क्रिप्ट के साथ एक फार्म का निर्माण यहाँ मेरी प्रपत्र प्रकार का एक टुकड़ा है <body> में जोड़ा जाएगा। यह समाधान को होने से जावास्क्रिप्ट को कई बार प्रस्तुत नहीं करता है, लेकिन आपको आसानी से अपनी आवश्यकताओं के अनुरूप इसे सुधारने में सक्षम होना चाहिए।

यदि आप चाहें तो शीर्षलेख को संशोधित करने के लिए आप $response ऑब्जेक्ट के साथ भी खेल सकते हैं।

+0

कानूनी लगता है। वेब डिबग टूलबार लोड करने के लिए सिम्फनी एक समान चाल का उपयोग करता है। – MauganRa

0

मुझे कुछ स्थितियों में कई लोगों द्वारा उपयोग की जाने वाली कुछ 'गंदे' विधि मिली। हम ग्राहक पक्ष पर लिपि की लोडिंग की जांच करते हैं। यदि हमारे पास zlkladr.js फ़ाइल है, तो उसके पास वैश्विक ऑब्जेक्ट 'zlkladr'

{% block our_widget %} 
{% spaceless %} 
    ... 
    <script> 
    // We must load the script only once, even if many widgets on form 
    if (!window.zlkladr) { 
     document.write('<script src="{{ asset('bundles/kladr/js/zlkladr.js') }}"></sc'+'ript>'); 
    } 
    </script> 
{% endspaceless %} 
{% endblock %} 
संबंधित मुद्दे