プログラムでブロックを作成する簡単な方法は?[閉まっている]


26

Drupalの学習。バックエンドを介してブロックを作成できることはわかっていますが、可能であれば、プログラムで事前に作成することをお勧めします。実際、私はそれが可能だと確信しています。しかし、最も簡単な方法は何ですか?


詳細ブログ:goo.gl/kD3TZu
Suresh Kamrushi

回答:


34

Drupal 7の場合:

カスタムモジュールhook_block_infoおよびhook_block_viewフックを使用します。hook_block_infoはブロックを定義します。admin > structure > blocksに表示されます。* hook_block_view *はコンテンツを表示します。Drupal APIの以下の例を参照してください。

hook_block_infoの例。2つのブロックが定義されています(タイトルはSyndicateとRecent content):

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

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

フックの完全なリストについては、Drupal.orgのBlocks APIページを参照してください。Drupal 6は少し異なります。hook_block_viewフックはありません。代わりに、hook_blockを使用してブロックを宣言します。


6

Drupal 6の簡単な答えは、hook_blockを実装するカスタムモジュールを作成することです。

Drupal 7では、Block APIを使用します

これがモジュール開発への最初の進出である場合、Pro Drupal DevelopmentまたはPro Drupal 7 Developmentを強くお勧めします。あなたが知る必要があるほとんどすべてがそこにあります。


hook_blockは別のモジュールでのみ使用できるようです:| なぜこの複雑さを理解できないのか... Drupalのすべてのモジュールを用意するのは普通の習慣ですか?
jayarjo

2
はい、モジュールはDrupalの重要な概念です。ほとんどの場合、Drupal自体はモジュールのセットであり、すべてがモジュールフックを介して行われます。
mpdonadio

3

あなたは私が探していたものを探しているかもしれません、そしてそれをここで見つけました:

/modules/block/block.module:
block_custom_block_save($編集、$デルタ)。

しかし、この関数を見ると、db_updateを自分で実行できることがわかります。

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

2

Drupalの7では、見とるblock_add_block_form_submitではmodules/block/block.admin.inc

これは通常のブロック作成フォームです。別の関数を呼び出すのではなく、レコードを直接挿入するように見えます。ブロックテーブルの各レコードは単一のテーマにリンクされていることに注意してください(アクティブなテーマのみを使用できますが、すべてのテーマのレコードを挿入する方が安全です)。

block_customテーブルは、コンテンツを保持しています。


1

Features Extraモジュールを使用して、ブロックをエクスポートできます。

または、ブロックテーブルに直接レコードを作成するだけです。

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)

1
余分なモジュールまたは直接のSQLクエリ...私は思うにもっときれいなものがあるはずです。
jayarjo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.