ฉันกำลังใช้ Drupal 7. ตอนนี้ฉันมีการนำทางเมนูหลักและตัวสลับภาษาที่มีอยู่ในส่วนหัวของเว็บไซต์ของฉัน ฉันวางมันไว้ที่นั่นโดยไปที่ CMS> โครงสร้าง> บล็อกแล้วลากบล็อกไปยังพื้นที่ส่วนหัว
ฉันจะตั้งบล็อกเหล่านี้โดยทางโปรแกรมในส่วนหัวได้อย่างไร
ฉันกำลังใช้ Drupal 7. ตอนนี้ฉันมีการนำทางเมนูหลักและตัวสลับภาษาที่มีอยู่ในส่วนหัวของเว็บไซต์ของฉัน ฉันวางมันไว้ที่นั่นโดยไปที่ CMS> โครงสร้าง> บล็อกแล้วลากบล็อกไปยังพื้นที่ส่วนหัว
ฉันจะตั้งบล็อกเหล่านี้โดยทางโปรแกรมในส่วนหัวได้อย่างไร
คำตอบ:
หากต้องการเปลี่ยนภูมิภาคที่วางบล็อกที่กำหนดโดยโมดูลอื่นคุณสามารถใช้hook_block_info_alter ()ซึ่งได้รับอาร์กิวเมนต์ต่อไปนี้:
$blocks
(ผ่านการอ้างอิง): อาร์เรย์ที่มีคำจำกัดความของบล็อกคีย์โดยโมดูลและเดลต้า$theme
: ชุดรูปแบบที่บล็อกจะถูกกำหนด$code_blocks
: บล็อกตามที่กำหนดจากการhook_block_info()
ใช้งานก่อนที่ค่าของพวกเขาจะถูกแทนที่โดยค่าที่ได้รับจากฐานข้อมูลการเพิ่มอาเรย์ที่สามารถเรนเดอร์ลงในพื้นที่เพจใด ๆ ใน 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 เพื่อให้สิ่งนี้ทำงานได้
ใน 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
drupal_add_region_content()
เป็นจุดสิ้นสุดเนื่องจากมีไว้สำหรับหน้าติดตั้ง / อัปเกรด
หากคุณกำลังเพิ่มบล็อกที่กำหนดเองคุณทำได้โดยใช้ 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
รหัสนี้เป็นไปตามของ @ 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
นี่ไม่ใช่รูปแบบที่ดีที่สุด แต่คุณสามารถวางเนื้อหาลงในหน้าอาเรย์แบบนี้ได้ด้วยตนเอง ...
function mymodule_page_alter(&$page) {
$my_content = _mymodule_render_mycontent();
$page['my_region']['my_special_insert']['content']['#markup'] = $my_content;
}
แม้ว่าคุณควรใช้Contextหรือแค่บล็อกหลัก การสร้างปลั๊กอินใหม่นั้นไม่ได้เลวร้ายอย่างที่คิด เพียงตั้งชื่อไฟล์ให้ถูกต้องตั้งค่าทริกเกอร์และทดสอบ ตัวอย่าง
คุณยังสามารถปรับบล็อกในชุดรูปแบบของคุณเช่น:
/**
* 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']);
}
}
block_example_block_info()
ค่า 'ภูมิภาค' อาจมีประโยชน์ในการทดสอบ