プログラムでブロックを配置しますか?


14

Drupal 7を使用しています。現在、Webサイトのヘッダーにメインメニューナビゲーションと言語切り替え機能があります。CMS> Structure> Blocksに移動し、ヘッダー領域にブロックをドラッグして、それらを配置しました。

これらのブロックをプログラムでヘッダーに配置するにはどうすればよいですか?


これらのブロックをヘッダーでプログラム的に配置する方法についてのあなたの質問に従って、サンプルモジュールhttp://drupal.org/project/examplesを確認することをお勧めします。私はそれとblock_example_block_info()「地域」の値がテストに役立つと思います。
cigotete

ジョン、これに対する答えを思いつきましたか?
16年

回答:


4

他のモジュールで定義されたブロックが配置される領域を変更するには、次の引数を受け取るhook_block_info_alter()を実装できます。

  • $blocks (参照渡し):ブロック定義を含む配列、モジュールごとのキー、およびデルタ
  • $theme:ブロックが定義されているテーマ
  • $code_blockshook_block_info()実装から定義されたブロック。その値は、データベースから取得した値で上書きされます

3

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 enableを使用する必要はありません。


2

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の速度に追いついています。


モジュールは、表示されているコードで呼び出されないhook_block_view_alterを実装する可能性があるため、サードパーティのモジュールが出力されるブロックを変更することはできません。
キアムルノ

Believe drupal_add_region_content()はインストール/アップグレードページを対象としているため、行き止まりです。
-doublejosh

2

カスタムブロックを追加する場合は、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を参照してください。


0

このコードは@jonhattanに基づいていますが、ブロックコンテナーのHTMLやコンテキストリンクはレンダリングしません。また、すべてのブロックと領域を1か所で指定する簡単な方法も提供しました。

<?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をインストールする必要があります。


-1

これは最良の形式ではありませんが、次のように手動でコンテンツをページ配列に配置できます...

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

ただし、コンテキストまたはコアブロックのみを使用する必要があります。新しいプラグインの作成は、見た目ほど悪くはありません。ファイルに正しい名前を付け、トリガーとテストをセットアップします。


実際、考え直して、このソリューションを投稿したことはほとんど後悔しています。これをしないでください。
-doublejosh

-1

テーマのブロックを次のように調整することもできます。

/**
 * 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']);
  }
}

これは、ブロックをレンダリングする方法やマークアップでブロックを識別する方法の質問には答えません。
クリスチャン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.