วางบล็อกโดยทางโปรแกรมหรือไม่


14

ฉันกำลังใช้ Drupal 7. ตอนนี้ฉันมีการนำทางเมนูหลักและตัวสลับภาษาที่มีอยู่ในส่วนหัวของเว็บไซต์ของฉัน ฉันวางมันไว้ที่นั่นโดยไปที่ CMS> โครงสร้าง> บล็อกแล้วลากบล็อกไปยังพื้นที่ส่วนหัว

ฉันจะตั้งบล็อกเหล่านี้โดยทางโปรแกรมในส่วนหัวได้อย่างไร


ตามคำถามของคุณเกี่ยวกับวิธีตั้งโปรแกรมบล็อกเหล่านี้ในส่วนหัวโดยทางโปรแกรมฉันขอแนะนำให้คุณทบทวนตัวอย่างโมดูลhttp://drupal.org/project/examplesและโดยเฉพาะคุณสามารถตรวจสอบและเปิดใช้งานตัวอย่างบล็อกโมดูลเพื่อทดสอบการทำงานของบล็อกด้วยวิธีการเขียนโปรแกรม . ฉันเดาว่าblock_example_block_info()ค่า 'ภูมิภาค' อาจมีประโยชน์ในการทดสอบ
cigotete

จอห์นคุณมากับคำตอบนี้หรือไม่?
relipse

คำตอบ:


4

หากต้องการเปลี่ยนภูมิภาคที่วางบล็อกที่กำหนดโดยโมดูลอื่นคุณสามารถใช้hook_block_info_alter ()ซึ่งได้รับอาร์กิวเมนต์ต่อไปนี้:

  • $blocks (ผ่านการอ้างอิง): อาร์เรย์ที่มีคำจำกัดความของบล็อกคีย์โดยโมดูลและเดลต้า
  • $theme: ชุดรูปแบบที่บล็อกจะถูกกำหนด
  • $code_blocks: บล็อกตามที่กำหนดจากการhook_block_info()ใช้งานก่อนที่ค่าของพวกเขาจะถูกแทนที่โดยค่าที่ได้รับจากฐานข้อมูล

3

การเพิ่มอาเรย์ที่สามารถเรนเดอร์ลงในพื้นที่เพจใด ๆ ใน hook_page_build () นั้นถูกต้องตามกฎหมาย ตัวอย่าง Drupal 7 เพื่อเพิ่ม minipanel ในส่วนท้าย

<?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

ใน D6 มันจะเป็นหลัก

$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


สิ่งนี้ไม่อนุญาตให้โมดูลบุคคลที่สามแก้ไขการส่งออกบล็อกเนื่องจากโมดูลสามารถนำhook_block_view_alterที่ไม่ได้เรียกใช้ด้วยรหัสที่คุณแสดง
kiamlaluno

เชื่อว่าdrupal_add_region_content()เป็นจุดสิ้นสุดเนื่องจากมีไว้สำหรับหน้าติดตั้ง / อัปเกรด
doublejosh

2

หากคุณกำลังเพิ่มบล็อกที่กำหนดเองคุณทำได้โดยใช้ hook_block_info ให้ตั้งค่าตัวเลือกสถานะเป็น 1 และตัวเลือกภูมิภาคเป็นภูมิภาคที่คุณต้องการให้บล็อกนั้นอยู่ใน

ตัวอย่าง:

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

หากคุณต้องการเปลี่ยนบล็อกที่มีอยู่แล้วคุณจะใช้ hook_block_info_alter () แทนการอัปเดตตัวเลือกเดียวกันได้แสดงไว้ด้านล่าง

ตัวอย่าง:

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.ph./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;
    }
  }
}

หมายเหตุ: ไม่เหมือนกับรหัสของเขาคุณจำเป็นต้องติดตั้ง block.module


-1

นี่ไม่ใช่รูปแบบที่ดีที่สุด แต่คุณสามารถวางเนื้อหาลงในหน้าอาเรย์แบบนี้ได้ด้วยตนเอง ...

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

แม้ว่าคุณควรใช้Contextหรือแค่บล็อกหลัก การสร้างปลั๊กอินใหม่นั้นไม่ได้เลวร้ายอย่างที่คิด เพียงตั้งชื่อไฟล์ให้ถูกต้องตั้งค่าทริกเกอร์และทดสอบ ตัวอย่าง


ในความเป็นจริงในความคิดที่สองฉันเกือบเสียใจที่โพสต์โซลูชันนี้ อย่าทำอย่างนี้
doublejosh

-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']);
  }
}

สิ่งนี้ไม่ได้ตอบคำถามว่าจะสร้างบล็อกได้อย่างไรหรือจะระบุได้อย่างไรในมาร์กอัป
คริสเตียน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.