प्रोग्राम को टहनी टेम्पलेट में ब्लॉक रेंडर करें


28

मुझे अपने page.html.twig टेम्प्लेट में एक व्यू ब्लॉक को प्रस्तुत करना होगा। D7 में मैं यह करूंगा:

<?php
  $block = module_invoke('module_name', 'block_view', 'block_delta');
  print render($block['content']);
?>

Drupal 8 में मॉड्यूल_invoke को पदावनत किया गया है और इसे उपयोग करने की सिफारिश की गई है: (मैंने दूसरे पैरामीटर के रूप में ब्लॉक का नाम जोड़ा है)

Drupal::moduleHandler()->invoke($block, 'views_block__blog_block_1', $args = array());

मैंने कुछ चीजों की कोशिश की। पहले इसे एक टहनी टेम्पलेट में करने की कोशिश की लेकिन मुझे नहीं पता कि कैसे एक टहनी टेम्पलेट में php फ़ंक्शन को कॉल करना है, ताकि यह अच्छी तरह से बाहर न निकले।

फिर मैंने .theme फ़ाइल में प्रीप्रोसेस_पेज () फ़ंक्शन में फ़ंक्शन को कॉल किया, लेकिन इससे पहले कि मैं इसे काम करने के लिए प्राप्त कर सकूं मैंने कुछ आसान बनाने की कोशिश की बस टहनी टेम्पलेट के अंदर एक चर काम करने की कोशिश की जो या तो काम नहीं किया, उदाहरण के लिए:

खाका फ़ाइल में template_preprocess_page (& $ var) फ़ंक्शन में:

$test = 'Hello World';
$vars['$my_var'] = $test;

मैंने twig टेम्पलेट के अंदर my_var को कॉल करने की कोशिश की, लेकिन यह काम नहीं किया और मुझे एक त्रुटि संदेश मिला "साइट में त्रुटि है, कृपया व्यवस्थापक से संपर्क करें"

इसलिए, संक्षेप में, यहां मेरे प्रश्न हैं:

  1. मैं टहनी टेम्पलेट्स के अंदर चर कैसे उपलब्ध कर सकता हूं?
  2. मैं टहनी टेम्पलेट्स के अंदर कार्यों को कैसे कहूं?
  3. क्या मैं .theme फ़ाइल या टहनी टेम्पलेट के अंदर ब्लॉक प्रदान करता हूं?

जवाबों:


47

आप मॉड्यूल_invoke () के साथ गलत ट्रैक पर हैं। यह {$ मॉड्यूल_name} _block_view () फ़ंक्शन को कॉल करने का एक फैंसी तरीका है।

तथ्य यह है कि यह बदल गया है कोई फर्क नहीं पड़ता, मुद्दा यह है कि ब्लॉक सिस्टम पूरी तरह से 8.x में बदल गया है और अब प्लगइन्स और कॉन्फ़िगरेशन संस्थाओं का उपयोग कर रहा है, वे फ़ंक्शन अब मौजूद नहीं हैं।

आपके पास कुछ विकल्प हैं।

a) किसी मौजूदा ब्लॉक कॉन्फिगरेशन इकाई का पुनः उपयोग करें और उसे देखें। बहुत आसान है, लेकिन इसके लिए कॉन्फ़िगरेशन की आवश्यकता है, जैसे कि एक अक्षम ब्लॉक।

$block = \Drupal\block\Entity\Block::load('your_block_id');
$variables['block_output'] = \Drupal::entityTypeManager()
  ->getViewBuilder('block')
  ->view($block);

ख) सीधे ब्लॉक प्लगइन उदाहरण बनाएं, इसे कॉन्फ़िगरेशन पास करें (आप एक निर्यात ब्लॉक कॉन्फ़िगरेशन इकाई में ब्लॉक प्लगइन आईडी और कॉन्फ़िगरेशन आसानी से पा सकते हैं)। नकारात्मक पक्ष यह है कि आपको कैशिंग रेंडर नहीं मिलता है, लेकिन यदि आप इसे कहीं प्रदर्शित करते हैं जो पहले से ही कैश्ड है (नोड टेम्पलेट की तरह), तो यह वास्तव में मायने नहीं रखता है।

$variables['block_output'] = \Drupal::service('plugin.manager.block')
  ->createInstance($plugin, $configuration)
  ->build();

ग) एक दृश्य के मामले में, आप सीधे दृश्य को लोड कर सकते हैं और इसे प्रदर्शित कर सकते हैं।

d) आप अपने दृष्टिकोण को पूरी तरह से फिर से सोच सकते हैं और ब्लॉक क्षेत्रों या पेज मैनेजर का उपयोग कर सकते हैं (जो 8.x में मानक ब्लॉक प्लग इन का उपयोग करता है)।


आपके उत्तर के लिए धन्यवाद। मैं ए या बी के साथ जाना चाहूंगा। एक क्षेत्र काम करेगा लेकिन मैं एक क्षेत्र का उपयोग करने से बचना चाहता हूं। एकमात्र समस्या मुझे तब हो रही है जब मैं twig टेम्पलेट में block_output को कॉल करता हूं, मेरे पास एक त्रुटि है - "अनपेक्षित टैग नाम" block_output "ताकि मुझे नहीं पता कि उस चर को कैसे उपलब्ध कराया जाए, भले ही मैंने इसे preprocess_page फ़ंक्शन में बनाया हो। मैं इसे काम करने की कोशिश करूंगा।
रिक बर्गमैन

लगता है कि आप {% का उपयोग कर रहे हैं? {{Block_output}} का उपयोग करें।
बेदिर

हाँ, यह बात थी! अभी भी टहनी के फंदे को पाने की कोशिश कर रहा है। धन्यवाद।
रिक बर्गमैन

चूंकि Drupal 8.0.0 संस्था प्रबंधक पदावनत है। इसके बजाय UnitTypeManager का उपयोग करें ।
फिलिप माइकल

मैंने यह कोड कहां रखा है? $ ब्लॉक = \ Drupal \ block \ Entity \ Block :: लोड ('your_block_id'); $ चर ['block_output'] = \ Drupal :: unitManager () -> getViewBuilder ('ब्लॉक') -> दृश्य ($ ब्लॉक); धन्यवाद!

11

Drupal 8 में, यह ब्लॉकप्रोसेसर को प्रस्तुत करने के लिए काम करता है (अर्थात, जिसे आपने कस्टम मॉड्यूल में बनाया है) preprocess_hook में:

function mymodule_preprocess_something(array &$variables) {
  $customblock = \Drupal::service('plugin.manager.block')->createInstance('my_custom_block', []);
  $variables['content']['custom_block_output'] = $customblock->build();
}

फिर आप इसे इस तरह से अपने टहनी टेम्पलेट में प्रस्तुत कर सकते हैं:

{{ content.custom_block_output }}

नोट: यह आपके ब्लॉक का एक सामान्य संस्करण लोड करेगा। यदि आप अपने ब्लॉक का एक उदाहरण चर के साथ लोड करना चाहते हैं (आपके द्वारा इसे / व्यवस्थापक / संरचना / ब्लॉक पर बनाने के बाद), तो आपको इसे इस तरह से लोड करना होगा:

    // Load Instance of custom block with variables
    $example_block = \Drupal::entityManager()->getStorage('block')->load('example_block_machine_name');
    if (!empty($example_block)){
      $example_block_content = \Drupal::entityManager()
        ->getViewBuilder('block')
        ->view($example_block);
      if ($example_block_content) {
        // Add block content to build array
        $variables['content']['custom_block_output'] = $example_block_content;
      }
    }

1
यह मेरे लिए और अब तक का सबसे आसान उपाय था।
गिलियूम बोइस

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