प्रोग्राम जगह ब्लॉक?


14

मैं Drupal 7 का उपयोग कर रहा हूं। अभी, मेरे पास एक मुख्य मेनू नेविगेशन और भाषा स्विचर है जो मेरी वेबसाइट हेडर में मौजूद है। मैंने उन्हें सीएमएस> संरचना> ब्लॉक पर जाकर और हेडन क्षेत्र में ब्लॉकों को खींचकर उन्हें रखा।

मैं हेडर में इन ब्लॉक को प्रोग्रामेटिक रूप से कैसे दर्ज कर सकता हूं?


हेडर में इन ब्लॉक को प्रोग्रामेटिक रूप से कैसे किया जाए, इस बारे में आपके प्रश्न के अनुसार, मैं सुझाव देता हूं कि एग्जाम मॉड्यूल मॉड्यूल की समीक्षा करें http://drupal.org/project/examples और विशेष रूप से आप मॉड्यूल ब्लॉक उदाहरण की समीक्षा कर सकते हैं और सक्षम कर सकते हैं ताकि प्रोग्राम को अपने ब्लॉक को प्रोग्रामेटिक तरीके से टेस्ट कर सकें । मुझे लगता है कि block_example_block_info()और 'क्षेत्र' मूल्य परीक्षण के लिए उपयोगी हो सकता है।
सिगोटेट

जॉन, क्या आप इसका जवाब लेकर आए हैं?
relipse

जवाबों:


4

उस क्षेत्र को बदलने के लिए जहां अन्य मॉड्यूल द्वारा परिभाषित ब्लॉक रखे गए हैं, आप हुक_ब्लॉक_इनफो_लेटर () को लागू कर सकते हैं , जो निम्नलिखित तर्क प्राप्त करता है:

  • $blocks (संदर्भ द्वारा पारित): ब्लॉक परिभाषाओं वाले मॉड्यूल, मॉड्यूल द्वारा डेल्टा, और डेल्टा
  • $theme: वह विषय जिसके लिए ब्लॉक परिभाषित किए जा रहे हैं
  • $code_blocks: hook_block_info()उनके मूल्यों को डेटाबेस से प्राप्त मानों द्वारा ओवरराइड करने से पहले ब्लॉक को कार्यान्वयन से परिभाषित किया गया है

3

हुक_पेज_बिल्ट () में किसी भी पृष्ठ क्षेत्र में रेंडर करने योग्य सरणी जोड़ना वैध है। फुटर क्षेत्र में मिनीपेल जोड़ने के लिए ड्रुपल 7 उदाहरण।

<?php
/**
 * Implements hook_page_build().
 */
function MODULE_page_build(&$page) {
  $block = module_invoke('panels_mini', 'block_view', 'blah');
  $blocks['blah'] = array('#markup' => $block['content']);

  $region = 'footer';
  if (isset($page[$region])) {
    $page[$region] = array_merge($page[$region], $blocks);
  }
  else {
    $page[$region] = $blocks;
  }
}

यह वही तकनीक है जो संदर्भ मॉड्यूल का उपयोग करती है।

नोट: आपको इस काम के लिए block.module सक्षम करने की आवश्यकता नहीं है।


2

डी 6 में यह अनिवार्य रूप से होगा

$block = module_invoke("the_module_name", "block", "view", the_block_delta);
drupal_set_content("the_region_name", theme("block", $block));

D7 में मुझे लगता है कि यह है

$block = module_invoke("the_module_name", "block_view", the_block_delta);
drupal_add_region_content("the_region_name", theme("block", $block));

लेकिन मैं अभी भी D7 पर गति के लिए उठ रहा हूं।


यह तृतीय-पक्ष मॉड्यूल को ब्लॉक किए जा रहे आउटपुट को बदलने की अनुमति नहीं देता है, क्योंकि मॉड्यूल हुक_ब्लॉक_व्यू_लेटर लागू कर सकते हैं जो आपके द्वारा दिखाए गए कोड के साथ नहीं लगाया गया है।
kiamlaluno

विश्वास drupal_add_region_content()एक मृत अंत है क्योंकि यह पृष्ठों को स्थापित / अपग्रेड करने के लिए है।
डबलजोश

2

यदि आप एक कस्टम ब्लॉक जोड़ रहे हैं, तो आप हुक_ब्लॉक_इनफो का उपयोग करते हुए, स्टेटस विकल्प को 1 पर सेट कर रहे हैं और जिस क्षेत्र को आप ब्लॉक में रखना चाहते हैं उस क्षेत्र का विकल्प चुनें।

उदाहरण:

MODULE_block_info() {
  $blocks = array();
  $blocks['my_block'] = array(
    'info' => t('My Block Name'),
    'status' => 1,
    'region' => 'THE_REGION_I_WANT',
   );
   return $blocks;
}

यदि आप पहले से मौजूद ब्लॉक को बदलना चाहते हैं, तो आप हुक_ब्लॉक_इनफो_अल्टर () का उपयोग करेंगे, इसके बजाय नीचे दिखाए गए विकल्पों को अपडेट करें।

उदाहरण:

MODULE_hook_block_info_alter(&$blocks, $theme, $code_blocks) {
  $blocks['my_block']['status'] = 1;
  $blocks['my_block']['region'] = 'THE_REGION_I_WANT';
}

अधिक जानकारी के लिए https://api.drupal.org/api/drupal/modules%21block%21block.api.php/function/hook_block_info/7


0

यह कोड @ jonhattan पर आधारित है, लेकिन वह ब्लॉक कंटेनर HTML या प्रासंगिक लिंक को रेंडर नहीं करता है। मैंने सभी ब्लॉकों और क्षेत्रों को एक स्थान पर निर्दिष्ट करने का एक सरल तरीका भी प्रदान किया।

<?php
/**
 * Implements hook_page_build().
 */
function MODULE_page_build(&$page) {
  global $theme;

  // A list of blocks you wish to display, keyed by region.
  // These are in the format of: 'module_name' => 'delta'.
  $blocks_to_render = array(
    'header' => array(
      'block' => 1,
    ),
  );

  // Add the blocks to each region.
  foreach ($blocks_to_render as $region => $block_list) {
    $block_objects = array();
    foreach ($block_list as $module_name => $delta) {
      $block = block_load($module_name, $delta);
      // Alter some of the defaults to match the current context.
      $block->theme = $theme;
      $block->region = $region;
      $block->weight = 0;
      $block_objects[] = $block;
    }
    $blocks_build = _block_get_renderable_array(_block_render_blocks($block_objects));

    if (isset($page[$region])) {
      $page[$region] = array_merge($page[$region], $blocks_build);
    }
    else {
      $page[$region] = $blocks_build;
    }
  }
}

ध्यान दें: उसके कोड के विपरीत, आपको ब्लॉक.मॉडल स्थापित करने की आवश्यकता है।


-1

यह सबसे अच्छा रूप नहीं है, लेकिन आप इस तरह से पेज सरणी में सामग्री को मैन्युअल रूप से रख सकते हैं ...

function mymodule_page_alter(&$page) {
  $my_content = _mymodule_render_mycontent();
  $page['my_region']['my_special_insert']['content']['#markup'] = $my_content;
}

हालांकि आपको कॉन्टेक्ट या सिर्फ कोर ब्लॉक का उपयोग करना चाहिए । नए प्लगइन्स बनाना उतना बुरा नहीं है जितना लगता है। बस फाइलों को सही ढंग से नाम दें, एक ट्रिगर और एक परीक्षण सेटअप करें। उदाहरण है


वास्तव में, दूसरे विचार पर मुझे इस समाधान को पोस्ट करने का लगभग पछतावा है। यह मत करो।
डबलजोश

-1

आप भी अपनी थीम में ब्लॉक समायोजित कर सकते हैं जैसे:

/**
 * Implements hook_preprocess_page().
 */
function your_theme_preprocess_page(&$variables) {

  if (drupal_is_front_page()) {
    $variables['page']['region_one'] = $variables['page']['region_two'];
    unset($variables['page']['region_two']);
  }
}

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