2017-05-15 6 views
5

में सशर्त टेम्पलेट का विस्तार निम्नलिखित वृक्ष संरचना लें:टहनी

├───base 
│ ├───0001 
│ │ └───pages 
│ │   file.twig 
│ │   file_content.twig 
│ └───ext 
│  └───store 
│  │ └───pages 
│  │  └───all 
│  │  │  file.twig 
│  │  └───0001 
│  │    file.twig 
│  └───newsletter 
│   └───pages 
│    └───all 
│    │  file.twig 
│    └───0001 
│      file.twig 
└───pages 
    │ file.twig 
    └───0001 
      file.twig 

जैसा कि आप देख सकते हैं, वहाँ चारों ओर बिखरे हुए file.twig का भार है।

मैं फ़ाइल base/0001/pages/file_content.twig फ़ाइल की सामग्री प्रस्तुत करना चाहता हूं।
लेकिन, मैं चाहता हूँ कि निम्न फ़ाइलें ब्लॉक के अंदर सामग्री बदल सकते हैं:

  • ext/<...>/pages/0001/file.twig
  • ext/<...>/pages/all/file.twig
  • /pages/0001/file.twig
  • /pages/file.twig

लेकिन, इन फ़ाइलों को हो सकता है या नहीं हो सकता मौजूद है, हो सकता है या नहीं भी हो सकता है और किसी भी ब्लॉक की सामग्री को बदलने में सक्षम होना चाहिए।

क्या यह काम करने का कोई तरीका है?

{% embed 'base/pages/file_content.twig' %} 
    {% block page_file %} 
     {{ parent() }} 
     {% if data.store_enabled %} 
      {% include [ 
        'base/ext/store/pages/0001/file.twig', 
        'base/ext/store/pages/all/file.twig' 
       ] ignore missing 
      %} 
     {% endif %} 
     {% include ['pages/0001/file.twig', 'pages/file.twig'] ignore missing %} 
    {% endblock %} 
{% endembed %} 

यह "काम", इस अर्थ में कि यह पेज से प्रस्तुत होती है किसी भी ब्लॉक overrided किए जाने की अनुमति नहीं है में:

अब तक, मैं निम्नलिखित है।

मैं यह काम कैसे कर सकता हूं? है

├───base 
    │ ├───0001 
    │ │ └───pages 
    │ │   file.twig 
    │ │   file_content.twig 
    │ └───ext 
    │  └───store 
    │  │ └───pages 
    │  │  └───0001 
    │  │    file.twig 
    └───pages 
      file.twig 

फ़ाइल base/0001/pages/file_content.twig निम्नलिखित:


उदाहरण के लिए, फ़ाइलों की इस संरचना पर विचार करें (हाँ, फ़ाइलें अनुपलब्ध हैं, और कहा कि उम्मीद है)

{% block page_file %} 
    {% block title %}<h1>Nice title</h1>{% endblock %} 
    {% block price %}{% endblock %} 
    <div class="clearfix"></div> 
{% endblock %} 

फ़ाइल base/ext/store/pages/0001/file.twig में निम्न सामग्री है:

{% block price %}<span class="price">55 &euro;</span>{% endblock %} 

और फ़ाइल pages/file.twig है:

{% block title %}{{ parent() }}<hr>{% endblock %} 
{% block price %}<div>{{ parent() }}</div>{% endblock %} 

उत्पादन मैं उम्मीद है निम्नलिखित:

<h1>Nice title</h1><hr> 
<div><span class="price">55 &euro;</span</div> 
<div class="clearfix"></div> 

लेकिन उस कोड के साथ, अन्य सभी फ़ाइलों 'परिवर्तन अनदेखा किया जा रहा है और उत्पादन किया जा रहा है केवल निम्नलिखित:

<h1>Nice title</h1> 
<div class="clearfix"></div> 

नोट:

ऐसा नहीं है कि मैं टहनी 1.33.2 उपयोग कर रहा हूँ, और Twig_Autoloader::register(); विधि का उपयोग कर सूचना के लिए महत्वपूर्ण है।

मैं Twig 2.x का उपयोग नहीं कर सकता, क्योंकि इसे PHP 7.0+ की आवश्यकता है और मैं PHP 5.3.29 तक सीमित हूं।

+0

'उपेक्षा missing' भी एम्बेड नोड – DarkBee

+0

@DarkBee के लिए उपलब्ध है लेकिन आप केवल 1 फ़ाइल एम्बेड कर सकते हैं, और' use' किसी भी 'missing' –

+0

उपेक्षा क्या करें की अनुमति नहीं है आप केवल एक एम्बेड शामिल करने के साथ मतलब है? वर्तमान सेटअप में पहला पाया गया टेम्पलेट शामिल होगा और इसे प्रदर्शित करेगा? यदि आपका मतलब है कि एम्बेड के अंदर एक एम्बेड डालना है, तो यह संभव है [यहां] (https://twigfiddle.com/y9q0yp) – DarkBee

उत्तर

0

कुछ और प्रयासों के बाद, मुझे अंत में ऐसा करने का एक तरीका पता चला है।

इस रूप में बदसूरत यह लग सकता है है ...

संरचना मान लिया जाये:

├───base 
│ ├───0001 
│ │ └───pages 
│ │   file.twig 
│ │   file_content.twig 
│ └───ext 
│  └───store 
│  │ └───pages 
│  │  └───0001 
│  │    file.twig 
└───pages 
     file.twig 

मुख्य फ़ाइल (base/pages/file.twig) निम्नलिखित कोड है:

{% if data.store_enabled %} 
    {% include [ 
      'base/ext/store/pages/0001/file.twig', 
      'base/ext/store/pages/all/file.twig', 

      'base/pages/file_content.twig' 
     ] ignore missing 
    %} 
{% else %} 
    {% include [ 
      'pages/0001/file.twig', 
      'pages/file.twig', 

      'base/pages/file_content.twig' 
     ] ignore missing 
    %} 
{% endif %} 

हो जाएगा ताकि यदि वे मौजूद हैं तो base/ext/store/pages/ के अंदर फ़ाइलों को शामिल करें। अगर वहां कोई फ़ाइल गुम है, तो फ़ाइल base/pages/file_content.twig शामिल है।

सभी base/ext/store/pages/ अंदर फ़ाइलें शीर्ष पर निम्नलिखित कोड होना चाहिए:

{% extends 'base/pages/file_content.twig' %} 

यह अनुमति देता है आप ओवरराइड किसी भी बात की:

{% extends [ 
     'pages/0001/file.twig', 
     'pages/file.twig', 

     'base/pages/file_content.twig' 
    ] 
%} 

और pages/ अंदर फ़ाइलें निम्न होना आवश्यक हैbase/pages/file_content.twig के अंदर ब्लॉक करें और फ़ाइलों को केवल तभी शामिल किया गया है जब वे मौजूद हों।

वहां एक गारंटीकृत फ़ाइल है (इस मामले में, base/pages/file_content.twig हमेशा मौजूद होना चाहिए) अभी भी "डिफ़ॉल्ट" सामग्री प्रदर्शित करेगा और एक बुरा अपवाद नहीं फेंक देगा।


इस उत्तर के दायरे के बाहर, मैं शुरू में एक बहुत ही इसी तरह की aproach, जो सशर्त मानों का उपयोग मिल गया है।

उस पर प्रयास करें: https://twigfiddle.com/u06tur

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