Cara mudah untuk membuat blok secara terprogram? [Tutup]

26

Belajar Drupal. Saya tahu sekarang bahwa saya dapat membuat blok melalui backend, tapi saya lebih suka membuat mereka secara terprogram, jika memungkinkan. Sebenarnya saya cukup yakin itu mungkin. Tapi apa cara termudah?

jayarjo
sumber
detail blog: goo.gl/kD3TZu
Suresh Kamrushi

Jawaban:

34

Untuk Drupal 7:

Gunakan hook_block_info dan hook_block_view hooks di modul khusus Anda . hook_block_info mendefinisikan blok. Ini akan muncul di admin > struktur > blok . * hook_block_view * menampilkan konten. Lihat contoh di bawah ini dari API Drupal.

Contoh hook_block_info, di mana dua blok didefinisikan (berjudul Sindikasi dan konten Terbaru):

    <?php
function hook_block_info() {
  // This example comes from node.module.
  $blocks['syndicate'] = array(
    'info' => t('Syndicate'), 
    'cache' => DRUPAL_NO_CACHE,
  );

  $blocks['recent'] = array(
    'info' => t('Recent content'),
    // DRUPAL_CACHE_PER_ROLE will be assumed.
  );

  return $blocks;
}
?>

Contoh hook_block_view:

<?php
function hook_block_view($delta = '') {
  // This example is adapted from node.module.
  $block = array();

  switch ($delta) {
    case 'syndicate':
      $block['subject'] = t('Syndicate');
      $block['content'] = array(
        '#theme' => 'feed_icon', 
        '#url' => 'rss.xml', 
        '#title' => t('Syndicate'),
      );
      break;

    case 'recent':
      if (user_access('access content')) {
        $block['subject'] = t('Recent content');
        if ($nodes = node_get_recent(variable_get('node_recent_block_count', 10))) {
          $block['content'] = array(
            '#theme' => 'node_recent_block', 
            '#nodes' => $nodes,
          );
        }
        else {
          $block['content'] = t('No content available.');
        }
      }
      break;
  }
  return $block;
}
?>

Lihat halaman Blokir API di Drupal.org untuk daftar lengkap kait. Drupal 6 sedikit berbeda. Tidak ada hook_block_view hook; alih-alih gunakan hook_block untuk mendeklarasikan blok.

DEKAT DARK
sumber
6

Untuk Drupal 6, jawaban singkatnya adalah Anda membuat modul khusus yang mengimplementasikan hook_block .

Untuk Drupal 7, Anda menggunakan Block API .

Jika ini adalah percobaan pertama Anda ke pengembangan modul, saya sangat merekomendasikan Pro Drupal Development atau Pro Drupal 7 Development . Hampir semua yang perlu Anda ketahui ada di sana.

mpdonadio
sumber
Tampaknya hook_block hanya dapat digunakan dalam modul terpisah: | Saya masih belum mengerti mengapa kerumitan ini ... Apakah ini merupakan praktik biasa untuk memiliki modul untuk semua yang ada di Drupal?
jayarjo
2
Ya, modul adalah konsep utama Drupal. Dalam banyak hal, Drupal sendiri adalah seperangkat modul dan semuanya dilakukan melalui kait modul.
mpdonadio
3

Anda mungkin mencari apa yang saya cari dan menemukannya di sini:

/modules/block/block.module:
block_custom_block_save ($ edit, $ delta).

Tetapi ketika Anda melihat fungsi ini Anda akan melihat bahwa Anda bisa melakukan sendiri db_update.

db_update('block_custom')
->fields(array(
  'body' => $edit['body']['value'],
  'info' => $edit['info'],
  'format' => $edit['body']['format'],
))
->condition('bid', $delta)
->execute();
Dan Shumaker
sumber
2

Di Drupal 7, lihat block_add_block_form_submitdi modules/block/block.admin.inc.

Ini adalah formulir pembuatan blok reguler; tampaknya hanya memasukkan catatan secara langsung daripada memanggil fungsi lain. Perhatikan bahwa setiap catatan dalam tabel blok ditautkan ke satu tema (Anda bisa menggunakan yang aktif tetapi lebih aman untuk menyisipkan catatan untuk semua tema).

The block_custom meja memegang konten.

richardg
sumber
1

Anda dapat menggunakan modul Fitur Ekstra untuk mengekspor blok.

Atau, buat catatan langsung di tabel blok.

INSERT INTO blocks (
  module, delta, theme, status, weight, region, custom,
  throttle, visibility, pages, title, cache)
VALUES (
  'views','blog-block_1','mytheme',1,10,'sidebar_first',0,0,1,'blog\r\nblog/*','',-1)
Dylan Tack
sumber
1
Modul tambahan atau permintaan sql langsung ... harus ada sesuatu yang lebih bersih di sekitar saya pikir.
jayarjo