أنا أستخدم Drupal 7. الآن ، لدي قائمة تنقل رئيسية ومبدل لغة موجود في رأس موقع الويب الخاص بي. لقد وضعتهم هناك بالانتقال إلى CMS> الهيكل> الحظر و مما يؤدي إلى سحب الكتل في منطقة الرأس.
كيف يمكنني وضع هذه الكتلة برمجياً في الرأس؟
لتغيير المنطقة حيث يتم وضع الكتل المعرفة بواسطة وحدات أخرى ، يمكنك تنفيذ hook_block_info_alter () ، والتي تتلقى الوسيطات التالية:
$blocks
(تم تمريره حسب المرجع): المصفوفة التي تحتوي على تعريفات الكتل ، والمفصلة حسب الوحدة النمطية ، والدلتا$theme
: السمة التي يتم تعريف الكتل لها$code_blocks
: الكتل كما تم تعريفها من تطبيقات hook_block_info()
قبل تجاوز قيمها بالقيم التي تم الحصول عليها من قاعدة البياناتمن الشرعي إضافة صفيف قابل للعرض لأي منطقة صفحة في hook_page_build (). Drupal 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 حتى يعمل هذا.
إذا كنت تقوم بإضافة كتلة مخصصة ، فقم بذلك باستخدام 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.php/function/hook_block_info/7
في 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.
هذا الكود مبني على @ jonhattan's ، لكن الكود الخاص به لا يعرض حاوية كتلة 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.