web-dev-qa-db-ja.com

ノードテンプレート内で領域を印刷できますか?

リージョンはノードテンプレート内で印刷できますか、それともリージョンはページテンプレートに限定されますか?

25
tim76

任意のテンプレート内で領域を印刷できますが、node.tpl.phpテンプレートのボックスからは使用できません。それらを使用可能にするには、node.tpl.phpテンプレートで使用する新しい変数を作成します。これには、すべてのリージョンコンテンツが含まれます。

新しいテンプレート変数の作成は、前処理関数を使用して行われます。テーマのtemplate.phpファイルで、次のような関数を作成します。

function mytheme_preprocess_node(&$variables) {
}

mythemeをテーマの短い名前に置き換えます。 Drupalがこの新しい前処理関数を認識するためには、サイトのテーマレジストリを再構築する必要があります。これはConfiguration開発パフォーマンスを押して、上部の「すべてのキャッシュをクリア」ボタン。

これで、前処理関数が機能する方法は、$variablesに、テンプレートの使用可能な変数に対応する配列が含まれることです。たとえば、node.tpl.phpの場合、$submittedには著者の署名欄が含まれます。上記の前処理関数では、$variables['submitted']にあります。

すべてのリージョンを含むpage.tpl.phpという配列がある$pageにあるものを模倣するには、$variables['page']を入力します。

問題は、$pagenode.tpl.phpにtrue/falseの値が既に入力されているため、ノードを単独で表示しているか、リストで表示しているかがわかることです。

そのため、名前の衝突を回避するには、代わりに$regionを入力します。

function mytheme_preprocess_node(&$variables) {

  // Get a list of all the regions for this theme
  foreach (system_region_list($GLOBALS['theme']) as $region_key => $region_name) {

    // Get the content for each region and add it to the $region variable
    if ($blocks = block_get_blocks_by_region($region_key)) {
      $variables['region'][$region_key] = $blocks;
    }
    else {
      $variables['region'][$region_key] = array();
    }
  }
}

次に、テーマのnode.tpl.phpテンプレートで、次の操作を実行して任意の領域をレンダリングできます。

<?php print render($region['sidebar_first']); ?>

ここで、sidebar_firstは、レンダリングする領域の名前です。

48
user7