मैं प्रोग्रामेटिक रूप से एक ब्लॉक कैसे रखूँ?


10

UI से आप किसी क्षेत्र में उस तरह से एक ब्लॉक जोड़ सकते हैं:

  1. व्यवस्थापक पर जाएँ -> संरचना -> ब्लॉक लेआउट (/ व्यवस्थापक / संरचना / ब्लॉक)।
  2. क्षेत्र के नाम के अलावा "प्लेस ब्लॉक" बटन पर क्लिक करें।

मैं एक ही काम करना चाहता हूं, लेकिन प्रोग्रामिक रूप से। मैं किसी क्षेत्र में मौजूदा ब्लॉक कैसे जोड़ूं और इसे कैसे बचाऊं? इस ब्लॉक को उस क्षेत्र में प्रदर्शित किया जाना चाहिए और ब्लॉक लेआउट पृष्ठ में उपलब्ध होना चाहिए ।


ब्लॉक बनाने के बाद आप ब्लॉक की स्थिति को फिर से व्यवस्थित कर सकते हैं: site_name / व्यवस्थापक / संरचना / ब्लॉक
Crazyrubixfan

मुझे लगता है कि आपने गलत तरीके से "एक क्षेत्र के लिए एक ब्लॉक असाइन करें"।
cilefen

@IcecreamJelly जो मैं करने की कोशिश कर रहा हूं वह यह प्रोग्रामेटिक रूप से करने के लिए है। cilefen, हाँ कि यह मेरा मतलब% -) है
jmzea

@ शॉनकॉन धन्यवाद, यह समान है, लेकिन बिल्कुल समान नहीं है। मुझे जवाब कहीं और मिल गया है।
jmzea

जवाबों:


9

एक प्लगइन ब्लॉक प्रदान करने के लिए आप सेटिंग्स की एक सरणी बना सकते हैं और \Drupal\block\Entity\Block::create()ब्लॉक ऑब्जेक्ट बनाने और इंस्टेंस को बचाने के लिए इसे बंद कर सकते हैं।

उदाहरण के लिए यदि आप सात विषय में एक Devel Execute PHP ब्लॉक जोड़ना चाहते हैं :

$values = array(
  // A unique ID for the block instance.
  'id' => 'devel_execute_php_1',
  // The plugin block id as defined in the class.
  'plugin' => 'devel_execute_php',
  // The machine name of the theme region.
  'region' => 'content',
  'settings' => array(
    'label' => 'Execute PHP',
  ),
  // The machine name of the theme.  
  'theme' => 'seven',
  'visibility' => array(),
  'weight' => 100,
);
$block = \Drupal\block\Entity\Block::create($values);
$block->save();

हाय, मुझे मदद चाहिए। मैंने UI का उपयोग करके एक कस्टम ब्लॉक बनाया है और परीक्षण उद्देश्य के लिए प्रोग्रामर क्षेत्र में जगह बनाना चाहता हूं। मुझे नहीं पता कि UI द्वारा बनाए गए कस्टम ब्लॉकों से प्लगइन कैसे प्राप्त करें .. धन्यवाद
मुदस्सर अली

यह एक और सवाल के रूप में पूछें। टिप्पणियाँ सवाल पूछने के लिए नहीं हैं।
शॉन कॉन

यह पहले से ही वहाँ है। drupal.stackexchange.com/questions/207042/…
मुदस्सर अली

यहाँ आईडी क्या है? क्या यह ब्लॉक नाम के समान है?
Crazyrubixfan

@RubberDuckIsKing मुझे विश्वास है idकि जब तक आप अद्वितीय हैं, तब तक आप जो भी चाहते हैं उसका नाम रख सकते हैं। उदाहरण के लिए, आप इसे मॉड्यूल के नाम से शुरू करना चाह सकते हैं।
पराग

7

आप ट्विग ट्वीक मॉड्यूल का उपयोग करते हैं :

Twig Tweak मॉड्यूल कुछ उपयोगी कार्यों और फिल्टर के साथ एक Twig एक्सटेंशन प्रदान करता है जो डेवलपर अनुभव में सुधार कर सकता है।

और फिर अपने टहनी टेम्पलेट क्षेत्र पर:

{{ drupal_block('block_id') }}

इस समाधान के साथ समस्या यह है कि टहनी की चोटियों को अभी भी आपको ब्लॉक रखने और फिर इसे 'अक्षम' करने की आवश्यकता है।
लेक्सिकेंट

6

ब्लॉक का प्रत्येक उदाहरण (जो "ब्लॉक प्रकार", कॉन्फ़िगरेशन और प्लेसमेंट) एक कॉन्फ़िगरेशन इकाई है \Drupal\block\Entity\Block:। तो आपको बस इतना करना है कि सही विवरण के साथ इस इकाई का एक नया उदाहरण बनाएं और आपका काम हो जाएगा।

यह किया जा सकता है, लेकिन पागल जटिल है, आपको प्लगइन सिस्टम, ब्लॉक प्लगइन सिस्टम और बहुत कुछ समझने की आवश्यकता होगी।

आप इसके \Drupal\block\BlockForm::submitFormलिए एक महसूस करने के लिए एक नज़र डाल सकते हैं या \Drupal\simpletest\BlockCreationTrait::placeBlock। आप इस बारे में सोचना चाहते हैं कि क्या यह ऐसा कुछ है जिसकी आपको वास्तव में आवश्यकता है, ब्लॉक की दृश्यता बहुत जटिल है।


4
दृश्यता की स्थिति के अलावा, मुझे नहीं लगता कि यह इतना जटिल है। \ Drupal \ simpletest \ BlockCreationTrait :: placeBlock () शायद देखने के लिए एक बेहतर उदाहरण है, आप कुछ निर्यात की गई कॉन्फ़िगरेशन फ़ाइलों को भी आयात कर सकते हैं।
बेरदीर

@Berdir परीक्षण विशेषता के लिंक के लिए धन्यवाद, इसे जोड़ा। चूंकि ड्रुपल 8 अभी भी युवा है, बहुत सारे लोग प्लगइन सिस्टम के बारे में बहुत कुछ नहीं जानते हैं और प्रलेखन अधिक उपयोग के मामलों आदि का उपयोग कर सकता है, जो बहुत से देवों को इसके साथ काम करने में कठिन समय दे सकता है।
गोलगप्पेपुर at

फेलिक्स ईव का सबसे अच्छा जवाब है। यह पागल जटिल नहीं है।
kratos

@kratos उत्तर फेलिक्स ने प्रदान किया है कि वास्तव में इस सवाल को हल नहीं किया जा रहा है कि ब्लॉक को "प्रोग्रामेटिक रूप से" कैसे रखा जाए, बल्कि इसके बजाय कॉन्फ़िगरेशन फ़ाइलों का उपयोग किया जाता है। कॉन्फ़िगरेशन केवल ड्रश, कॉन्फिगरेशन सिंक्रोनाइज़ेशन इंटरफ़ेस या मॉड्यूल इंस्टॉलेशन के माध्यम से आयात किया जा सकता है। यह क्रम, fx पद एक वर्ग मुखपृष्ठ नोड प्रकार आदि के बचाने के दौरान होने की जरूरत है, तो यह इस रणनीति :) का उपयोग करने के बेकार हो सकता है
googletorp

4

मैं सिर्फ D8 सीख रहा हूं, लेकिन मुझे प्रोग्राम ब्लॉक करने के लिए एक बहुत आसान तरीका मिल गया है (यह googletorp के उत्तर को पढ़ने के बाद बहुत ही डरावना लग रहा था!)

जब मैंने अपने कस्टम मॉड्यूल को सक्षम किया जो उस ब्लॉक को परिभाषित करता था जो मैं चाहता था कि ब्लॉक स्वचालित रूप से सही क्षेत्र में रखा जाए। मैंने इसे हासिल करने के लिए जो कदम उठाए, वे हैं:

  1. मॉड्यूल को सक्षम करें और UI पर यूआई का उपयोग करके ब्लॉक करें /admin/structure/block
  2. सिंगल आइटम कॉन्फिगर एक्सपोर्ट पेज पर जाएं admin/config/development/configuration/single/export
  3. कॉन्फ़िगरेशन प्रकार ब्लॉक का चयन करें और कॉन्फ़िगरेशन नाम के लिए उस ब्लॉक का चयन करें जिसे आपने यूआई का उपयोग करके रखा था और फिर उत्पन्न कोड की प्रतिलिपि बनाएँ।
  4. अपने मॉड्यूल में फ़ोल्डर बनाएँ /config/install/
  5. उत्पन्न कोड textarea के तहत यह आपको उस फ़ाइलनाम को बताता है जिसका आपको उपयोग करने की आवश्यकता है। इस फाइल को /config/installडायरेक्टरी में बनाएं और कोड को वहां कॉपी करें।
  6. अब जब आप अपने मॉड्यूल की स्थापना रद्द करते हैं और फिर इसे फिर से सक्षम करते हैं तो ब्लॉक स्वचालित रूप से रखा जाएगा।

अन्य डेवलपर्स या वातावरण के लिए काम करने के लिए आपको UUID को नहीं निकालना पड़ेगा?
powpow12

हां - UUID को हटाना एक अच्छा विचार होगा।
फेलिक्स ईव

आप Drupal कंसोल का उपयोग भी कर सकते हैं, जो इनमें से कुछ कार्यों को स्वचालित करने का ध्यान रखता है: hechoendrupal.gitbooks.io/drupal-console/content/en/commands/…
Beau

3

मुझे उत्तर मिला कि कैसे एक इकाई में हेरफेर करने के लिए धन्यवाद : Drupal 8 में प्रोग्रामेटिक रूप से ब्लॉक करें

use Drupal\block\Entity\Block;

$block = Block::load('sitebranding');
$block->setRegion('content');
$block->save();

यह वही था जो मैं धन्यवाद के लिए देख रहा था, @jmzea!
ब्यू

2

ऊपर दिया गया उदाहरण काफी करीब है लेकिन फिर भी सही नहीं है। विचार यह है कि आपको ब्लॉक उदाहरण की अपनी आईडी के साथ आना होगा (मेरे मामले में devel_execute_php_1112 (हो सकता है क्योंकि मैंने इसे 1112 बार काम करने की कोशिश की, यह रहस्य बना रहेगा)) और फिर वास्तविक आईडी (एक वह) एनोटेशन में कस्टम ब्लॉक) और थीम के लिए घोषित किया गया है। फिर बस क्षेत्र सेट करें और आप जाने के लिए अच्छे हैं। वांछित क्षेत्र के तहत एक ब्लॉक का एक उदाहरण बनाया।

$blockEntityManager = \Drupal::service('entity.manager')->getStorage('block');
$block = $blockEntityManager->create(
  array(
      'id'=> 'devel_execute_php_1112',
      'plugin' => 'devel_execute_php',
      'theme' => 'seven'
  )
);
$block->setRegion('content');
$block->save();

edit1: मैंने वास्तव में ऊपर की टिप्पणी की बाद में जाँच की - और यह सही है। यह सिर्फ स्पष्ट नहीं है कि आईडी एक ऐसी चीज है जिसके साथ आपको आना है। मेरी लंगड़ी टिप्पणी के लिए एक मोचन के रूप में मैं एक कस्टम ब्लॉक इकाई के ब्लॉक उदाहरण बनाने के तरीके पर एक समाधान पोस्ट करूंगा:

$blockEntityManager = \Drupal::service('entity.manager')->getStorage('block');
$block = $blockEntityManager->create(
  array(
      'id'=> 'ggggggggsssssss',
      'plugin' => 'block_content:79d53b4e-9e60-4f97-befc-101da919bb7a',
      'theme' => 'visitb_he_theme'
  )
);
$block->setRegion('content');

मूल रूप से एक ही लेकिन एक प्लगइन के लिए आप block_content लिखते हैं: uuid_of_custom_block_entity_instance

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