1

常にすべての領域をレンダリングしたいと思います。ブロックが含まれていなくても。

私は自分の領域を次のようにレンダリングします(page.tpl.php):

<?php print render($page['region_name']); ?>

これが私が使用しているコードですが、これは効果がありません。

function theme_name_page_alter(&$page) {
    $regions = system_region_list($GLOBALS['theme'], REGIONS_ALL);
    foreach ($regions as $region => $name) {
        if(empty($page[$region])) {
            $page[$region] = array();
        }
    }
}
4

3 に答える 3

2

次のコード (カスタム モジュール内) を使用して、Drupal がすべての領域をレンダリングすることを確認できます。

function hook_page_alter(&$page) {
    foreach($page as $region => $blocks) {
        if(is_array($blocks) && in_array($region, array('region_1', 'region_2', 'region_3'))) {
            if(count($blocks)==1) {
                $page[$region]['phantom_content']['#markup'] = ' ';
            }
        }
    }
}

region_1、region_2、region_3 を、常にレンダリングされるようにしたいリージョンの名前に置き換える必要があります。

コードを少し説明すると、ブロック配列のカウントが 1 の場合、#sorted 属性が常に含まれるため、空であることを意味します。

于 2013-10-09T11:57:51.940 に答える
1

その領域にブロックが割り当てられていないだけでなく、レンダー配列が空であることはほぼ確実です。render 関数の機能に注意してください。render 配列内の任意/すべての要素と子に対して drupal_render を呼び出し、それらを出力用の html 文字列に変換します。レンダリング可能な要素がない場合、html は返されません。

これらの領域をレンダリングする正しい (プログラムによる) 方法は、領域ごとにレンダー配列を定義し、#markup 要素を Drupal にそこに出力させたい HTML に設定することです。これは、カスタム モジュールで行う必要があります。

これを GUI からのみ行う必要がある場合は、ファントム ブロックを定義する以外に方法がありません。その場合、何を達成しようとしているのかを再考する必要があります。

于 2013-01-02T18:57:36.507 に答える
0

答えはregion.tpl.phpファイルと関連するtemplate_preprocess_region()関数にあると思います。

テンプレート ファイルは$content、前処理関数から読み込まれる available という有効な変数があることを確認します。その$content配列が空の場合、条件は失敗し、マークアップはレンダリングされません (リージョンにブロックが含まれていない場合に発生します)。

region.tpl.php のコピーをテーマに追加し、if ($content):条件を削除してから、Drupal のキャッシュをフラッシュしてみてください。

于 2013-01-02T17:43:13.417 に答える