यदि क्षेत्र खाली है तो मैं कैसे ठीक से पता लगा सकता हूं? [बन्द है]


11

मेरे पेज टेम्पलेट में क्षेत्रों को प्रिंट करने की शर्त है क्योंकि यह खाली नहीं है , लेकिन यह हमेशा खाली क्षेत्रों को प्रिंट करेगा चाहे कोई भी हो। खाली क्षेत्रों का पता लगाने का उचित तरीका क्या है?

उदाहरण के लिए, {% if page.local_tasks is not empty %}{{ page.local_tasks }}{% endif %}प्रिंट <div class="region region-local-tasks"></div>

अगर मैं इस क्षेत्र में प्रस्तुत करना themename_preprocess_page()साथ var_dump(drupal_render($variables['page']['highlighted']));मैं प्लेसहोल्डर टोकन के माध्यम से SafeString मिल जाएगा:

<div class="region region-highlighted"><drupal-render-placeholder callback="Drupal\Core\Render\Element\StatusMessages::renderMessages" arguments="0" token="a8c34b5e"></drupal-render-placeholder></div>

इसलिए, तकनीकी रूप से क्षेत्र खाली नहीं है, लेकिन मैं इसके बारे में कुछ नहीं कर सकता।


क्या होता page.local_tasksहै जब आपको लगता है कि इसे खाली होना चाहिए?
क्लाइव

यह स्थानीय कार्यों के लिए एक क्षेत्र है।

सही है, लेकिन वस्तु में क्या है? यह रिक्त नहीं है, तो देखो देखने के लिए अन्य संपत्तियों यह है कि आप बंद वहाँ कोई सामग्री है कि टिप सकता है (यह अनिवार्य रूप से एक स्ट्रिंग या एक गैर-प्रदान की गई सरणी में क्या है?)
क्लाइव

मेरे पास एक ही समस्या है, और ऐसा लगता है कि यह एक बग है
युसेफ

जवाबों:


10

टीएल; डीआर इसके लिए यह है कि क्षेत्र खाली है या नहीं, इसकी जांच करने का कोई तरीका नहीं है।

Drupal 8 में उस बिंदु पर जब हम टेम्पलेट स्तर पर होते हैं, हम यह बताने में असमर्थ होते हैं कि इस क्षेत्र में सामग्री है या नहीं क्योंकि सामग्री का आलस्य किया जाता है। इसके लिए ओपन ड्रुपल 8 इश्यू है।

इसे हासिल करने के लिए आपको शायद क्या करना होगा, यह सीएसएस लिखने के लिए है कि क्या परीक्षण खाली है। आप का उपयोग करके कोशिश कर सकते हैं : खाली छद्म चयनकर्ता


मैंने यह निष्कर्ष निकाला है कि इस समस्या को हल करने के लिए सबसे विश्वसनीय तरीका है हुक_theme_suggestions_HOOK_alter में टेम्पलेट सुझाव जोड़ना और उन क्षेत्रों को पूरी तरह से टेम्पलेट से निकालना जहां इसका दृश्य नहीं होना चाहिए।
जोहान

10

इस तरह से रेंडर करने के बाद फिल्टर लगाने की कोशिश करें:

{% set has_sidebar_first = page.sidebar_first|render|striptags|trim is not empty %}
{% if has_sidebar_first %}
    {# ... #}
{% endif %}

इसने मेरे लिए काम किया
एंड्रयू कोज़ोरिज़

यह काफी उपयोगी है।
एसीनैडियनकोडर

3
यह दृष्टिकोण काम नहीं करता है क्योंकि यह ध्यान नहीं देता है कि कुछ क्षेत्र प्लेसहोल्डर्स में प्रदान किए जा सकते हैं, जिन्हें बाद में वास्तविक मार्कअप के साथ बदल दिया जाएगा। Html.html.twig फ़ाइल में कोई क्षेत्र खाली है या नहीं यह निर्धारित करने का कोई तरीका नहीं है। यदि आप इस समस्या की पूरी पृष्ठभूमि को पढ़ना चाहते हैं, तो मैं इस ड्रुपल कोर मुद्दे को
lauriii

जैसा कि @lauriii ने कहा, यह ड्रूपल प्लेसहोल्डर्स के साथ काम नहीं करता है (ब्लॉक में मेरे विचार आम तौर पर फ़िल्टर के कारण फ़िल्टर किए जाते हैं strip_tags)।
डकवामिन

2

टहनी में आपको वास्तव में करने में सक्षम होना चाहिए:

{% if page.local_tasks %}{{ page.local_tasks }}{% endif %}

हालाँकि शायद page.local_tasks (जैसे खाली मार्कअप) के भीतर कुछ है। कृपया निम्नलिखित प्रयास कीजिए:

{% if page.local_tasks|striptags|trim %}{{ page.local_tasks }}{% endif %}

वह डिबग स्निपेट कुछ भी नहीं दिखाता है (यानी, कुछ भी नहीं प्रदर्शित करने के लिए, चर खाली है)।

जब आप कहते debugहैं कि आपका क्या मतलब है dump? यदि आप करते हैं तो क्या होता है {% if page.local_tasks %}Crazy magic{% endif %}?
क्वीनविक्टोरिया

आपके प्रश्न को पढ़कर मैं देखता हूं कि page.local_tasksखाली नहीं है। यह HTML से भरा है। मैं अपना जवाब अपडेट करूंगा।
क्वीनविक्टोरिया

अगर सामग्री है तो आपका स्निपेट दो बार सामग्री को प्रस्तुत नहीं करता है? या अगर यह प्रदान किया जाता है तो इसे कैश किया जाता है और इसका प्रदर्शन पर कोई प्रभाव नहीं पड़ता है? इसके अलावा मुझे समझ में नहीं आता है कि मुझे कोई वर्कअराउंड करने की आवश्यकता क्यों है। यह कोर में बॉक्स से बाहर काम करना चाहिए। @Berdir इस पर कोई टिप्पणी?

परेशानी यह है कि स्थानीय कार्य खाली नहीं हैं। जैसा कि टहनी और ड्रुपल दोनों एमवीसी का अनुसरण कर रहे हैं, कुछ भी नहीं बता रहा है कि टहनी खाली है (यह खाली नहीं है)। या तो आप एक प्रीप्रोसेसर लिख सकते हैं जो खाली होने पर स्थानीय कार्यों को प्रदान करता है, जो 'गणना' प्रकार की संपत्ति के साथ एक और मूल्य प्रदान कर सकता है, जिसके खिलाफ आप परीक्षण कर सकते हैं, या जैसा मैं सुझाव देता हूं। कहीं न कहीं आप एक हिट लेने जा रहे हैं। मुझे लगता है कि प्रदर्शन की टक्कर नगण्य होगी।
रानीविक्टोरिया

1

इसने मेरे लिए काम किया।

{% if page.sidebar_first|render|striptags %}
<aside id="sidebar-first" class="sidebar sidebar-first layout-sidebar-first" role="complementary">{{ page.sidebar_first }}</aside>
{% endif %}

काफी सरल।


मुझे यकीन नहीं है लेकिन यह आपके साइडबार को दो बार (मूल्यांकन के लिए एक बार और प्रदर्शन के लिए दूसरी बार) रेंडर कर सकता है।
जिगैरस

-1

आपको इसके बजाय Rendererसेवा का उपयोग करना चाहिएdrupal_render() जो पदावनत है, इसलिए:

$output = \Drupal::service('renderer')->renderRoot($some_array)

यह drupal-render-placeholderआउटपुट में टैग उत्पन्न करने से बचाएगा।

इसी तरह का मुद्दा: मैन्युअल रूप से ड्रुपल-रेंडर-प्लेसहोल्डर को कैसे बदला जाए?


-1

इसे इस्तेमाल करे :

 {% if page.local_tasks|render|striptags|trim  is not empty %}
    {{ page.local_tasks }}
 {% endif %}

-1

यह वास्तव में मेरे मामले में काम करता है

{% if page.sidebar_second|render|striptags('<drupal-render-placeholder>')|trim|length > 0 %}

स्ट्रिपटैग रखने के लिए टैग की एक स्ट्रिंग को स्वीकार करता है, इसलिए आप जो भी कंटेंट रहित टैग की अपेक्षा करते हैं, उसे भी जोड़ सकते हैं, जैसे <form><img>आदि।


-1

निम्नलिखित भी काम करता है जब टहनी डिबगिंग सक्षम है:

{% set sidebarLength = page.sidebar_first|render|trim|striptags|length %}
{% if sidebarLength > 1 %}
  {% set has_sidebar_first = page.sidebar_first %}
{% else %}
  {% set has_sidebar_first = null %}
{% endif %}

-3

यह पता लगाने के लिए कि क्षेत्र खाली है या नहीं इस तरह कोड:

{% अगर page.local_tasks%}
   {{पेज.लोकल_कट्स}}
{% अगर अंत %}

उपरोक्त कोड में यह जांचता है कि local_tasks क्षेत्र खाली है या नहीं और यदि खाली है तो यह उस क्षेत्र को प्रिंट नहीं करेगा


1
काम नहीं किया, यह हमेशा सच है
युसेफ

ब्लॉक का आलसी प्रतिपादन इस स्निपेट के काम न करने का कारण है। क्योंकि सरणी खाली नहीं है, लेकिन इसे रेंडर करने से कुछ नहीं होता है।
Renrhaf
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.