Secara terprogram menempatkan blok?

14

Saya menggunakan Drupal 7. Saat ini, saya memiliki navigasi menu utama dan Pengalih bahasa yang ada di header situs web saya. Saya menempatkan mereka di sana dengan pergi ke CMS> Struktur> Blok dan kemudian menyeret blok ke wilayah header.

Bagaimana cara saya menempatkan secara sistematis blok ini di header?

John
sumber
Menurut pertanyaan Anda tentang bagaimana secara program menempatkan blok ini di header, saya sarankan meninjau modul Contoh http://drupal.org/project/examples dan secara khusus Anda dapat meninjau dan mengaktifkan modul Block Module untuk menguji cara kerja blok Anda dengan cara yang terprogram. . Saya kira itu block_example_block_info()dan nilai 'wilayah' bisa berguna untuk diuji.
cigotete
John, sudahkah kamu menemukan jawaban untuk ini?
Relipse

Jawaban:

4

Untuk mengubah wilayah tempat blok yang ditentukan oleh modul lain ditempatkan, Anda dapat menerapkan hook_block_info_alter () , yang menerima argumen berikut:

  • $blocks (disahkan oleh referensi): array yang berisi definisi blok, dikunci oleh modul, dan delta
  • $theme: tema di mana blok didefinisikan
  • $code_blocks: blok seperti yang didefinisikan dari hook_block_info()implementasi, sebelum nilainya ditimpa oleh nilai yang diperoleh dari database
kiamlaluno
sumber
3

Adalah sah untuk menambahkan array yang dapat di render ke wilayah halaman manapun di hook_page_build (). Drupal 7 contoh untuk menambahkan minipanel ke wilayah footer.

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

Ini adalah teknik yang sama yang menggunakan modul konteks.

Catatan: Anda tidak perlu mengaktifkan block.module agar ini berfungsi.

jonhattan
sumber
2

Pada D6 pada dasarnya

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

Di D7 saya pikir itu

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

tapi saya masih mendapatkan kecepatan pada D7.

mpdonadio
sumber
Ini tidak memungkinkan modul pihak ketiga untuk mengubah blok menjadi keluaran, karena modul dapat mengimplementasikan hook_block_view_alter yang tidak dipanggil dengan kode yang Anda tunjukkan.
kiamlaluno
Percaya drupal_add_region_content()adalah jalan buntu karena ini dimaksudkan untuk menginstal / meningkatkan halaman.
doublejosh
2

Jika Anda menambahkan blok khusus, Anda melakukan ini menggunakan hook_block_info, mengatur opsi status ke 1 dan opsi wilayah ke wilayah Anda ingin blok ditempatkan.

Contoh:

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

Jika Anda ingin mengubah blok yang sudah ada, Anda akan menggunakan hook_block_info_alter () sebagai gantinya, memperbarui opsi yang sama telah ditunjukkan di bawah ini.

Contoh:

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

Untuk informasi lebih lanjut, lihat https://api.drupal.org/api/drupal/modules%21block%21block.api.php/function/hook_block_info/7

Wesley J
sumber
0

Kode ini didasarkan pada @ jonhattan's, tetapi kode-nya tidak membuat HTML kontainer blok atau tautan kontekstual. Saya juga menyediakan cara sederhana untuk menentukan semua blok dan wilayah di satu tempat.

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

Catatan: Tidak seperti kode-nya, Anda DO perlu block.module diinstal.

hargobind
sumber
-1

Ini bukan bentuk terbaik, tetapi Anda dapat secara manual menempatkan konten ke dalam array halaman seperti ini ...

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

Meskipun Anda harus tetap menggunakan Konteks atau hanya blok inti. Membuat plugin baru tidak separah kelihatannya. Cukup beri nama file dengan benar, siapkan pemicu dan tes. contoh .

doublejosh
sumber
Bahkan, setelah dipikir-pikir saya hampir menyesal memposting solusi ini. Jangan lakukan ini.
doublejosh
-1

Anda juga dapat menyesuaikan blok di tema Anda seperti:

/**
 * 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']);
  }
}
Remy
sumber
Ini tidak menjawab pertanyaan tentang cara membuat blok atau cara mengidentifikasi mereka di markup.
Christian