প্রগতিগতভাবে একটি দ্বৈত টেম্পলেট একটি ব্লক রেন্ডার


28

আমার পৃষ্ঠা html.twig টেম্পলেটটিতে আমাকে একটি ভিউ ব্লক রেন্ডার করতে হবে। ডি 7-এ আমি এটি করব:

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

ড্রুপাল 8 মডিউল-ইনভোককে হ্রাস করা হয়েছে এবং এটি ব্যবহার করার প্রস্তাব দেওয়া হয়েছে: (আমি ব্লকের নামটি দ্বিতীয় প্যারামিটার হিসাবে যুক্ত করেছি)

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

আমি কয়েকটি জিনিস চেষ্টা করেছিলাম। প্রথমে এটি একটি টুইগ টেম্পলেটটিতে করার চেষ্টা করেছিলেন তবে আমি জানি না কীভাবে একটি ডান টেম্পলেটটিতে পিএইচপি ফাংশন কল করতে পারি, যাতে এটি খুব ভালভাবে চালু হয় না।

তারপরে আমি। থিম ফাইলের প্রিপ্রসেস_পেজ () ফাংশনে ফাংশনটি ডেকেছিলাম কিন্তু এটি কাজ করার আগে আমি খুব সহজেই কিছু সহজ করার চেষ্টা করেছিলাম যাতে ডানা টেমপ্লেটের অভ্যন্তরে একটি ভেরিয়েবল কাজ করতে হয় যা উদাহরণস্বরূপ:

থিম ফাইলটিতে টেমপ্লেট_প্রিয়সেস_পেজ (& ars ভার্স) ফাংশনে:

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

আমি টুইগ টেম্পলেটটির ভিতরে মাই_ভরকে কল করার চেষ্টা করেছি কিন্তু এটি কার্যকর হয়নি এবং "সাইটের একটি ত্রুটি রয়েছে, দয়া করে প্রশাসকের সাথে যোগাযোগ করুন" বলে আমি একটি ত্রুটি বার্তা পেয়েছি "

সুতরাং, সংক্ষেপে বলতে গেলে, এখানে আমার প্রশ্নগুলি:

  1. আমি কীভাবে টুইগ টেম্পলেটগুলির মধ্যে ভেরিয়েবলগুলি উপলব্ধ করব?
  2. টুইগ টেম্পলেটগুলির মধ্যে আমি কীভাবে ফাংশনগুলিকে কল করব?
  3. আমি কি .theme ফাইল বা দ্বৈত টেম্পলেট ভিতরে ব্লক রেন্ডার করতে পারি?

উত্তর:


47

আপনি মডিউল_ভুক্ত () দিয়ে ভুল পথে রয়েছেন। এটি {$ মডিউল_নাম} _ব্লক_ভিউ () ফাংশনটি কল করার অভিনব উপায়।

এটি যে পরিবর্তিত হয়েছে তা বিবেচ্য নয়, মূল বিষয়টি হ'ল ব্লক সিস্টেমটি 8.x তে সম্পূর্ণ পরিবর্তিত হয়েছিল এবং এখন প্লাগইন এবং কনফিগারেশন সত্তা ব্যবহার করছে, সেই ফাংশনগুলির আর অস্তিত্ব নেই।

আপনার স্বল্প কিছু সু্যোগ আছে।

ক) একটি বিদ্যমান ব্লক কনফিগার সত্তা পুনরায় ব্যবহার করুন এবং এটি দেখুন। খুব সহজ, তবে সেই কনফিগারেশনটির অস্তিত্ব থাকা প্রয়োজন, যেমন একটি অক্ষম ব্লক হিসাবে।

$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 তে স্ট্যান্ডার্ড ব্লক প্লাগইন ব্যবহার করে) ব্যবহার করতে পারেন।


আপনার উত্তর করার জন্য আপনাকে ধন্যবাদ। আমি এ বা বি এর সাথে যেতে চাই একটি অঞ্চল কাজ করবে তবে আমি কোনও অঞ্চল ব্যবহার করা এড়াতে চাই। আমার কেবল সমস্যাটি হ'ল যখন আমি টুইগ টেমপ্লেটে ব্লক_আউটপুট কল করি তখন আমার একটি ত্রুটি ঘটেছিল - "অপ্রত্যাশিত ট্যাগ নাম" ব্লক_আউটপুট "সুতরাং আমি কীভাবে প্রিপ্রসেস_পেজ ফাংশনটিতে এটি তৈরি করেছিলাম তা সত্ত্বেও কীভাবে উপলব্ধ করব তা জানি না। আমি এটি চেষ্টা করার চেষ্টা করব।
রিক বার্গম্যান

আপনি {% ব্যবহার করছেন বলে মনে হচ্ছে? {{Block_output} Use ব্যবহার করুন}
বারদির ২৯:১৩ এ

হ্যাঁ, এটা ছিল! এখনও ফাঁকির ঝুল পেতে চেষ্টা করছি। ধন্যবাদ।
রিক বার্গম্যান

যেহেতু দ্রুপাল 8.0.0 সত্তা ম্যানেজার অবনতিহীন । ব্যবহারের entityTypeManager পরিবর্তে।
ফিলিপ মাইকেল

আমি এই কোডটি কোথায় রাখব? $ block = \ দ্রুপাল \ ব্লক ity সত্তা \ ব্লক :: লোড ('আপনার_ব্লক_আইডি'); $ ভেরিয়েবল ['ব্লক_আউটপুট'] = rup দ্রুপাল :: অ্যান্টিম্যাঞ্জার () -> গেটভিউবিল্ডার ('ব্লক') -> ভিউ ($ ব্লক); ধন্যবাদ!

11

ড্রুপাল 8-এ, একটি প্রিপ্রোসেস_হুকের একটি ব্লক প্লাগইন (এটি, যা আপনি কাস্টম মডিউলটিতে তৈরি করেছেন) রেন্ডারিংয়ের জন্য কাজ করে:

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
এটি আমার জন্য সমাধান এবং এখন পর্যন্ত সবচেয়ে সহজ সমাধান।
গিলাইম বোইস

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.