2013-01-02 43 views
1

我想總是渲染所有區域。即使它們不包含任何塊。Drupal:強制區域始終呈現?

我使我區像這樣(在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(); 
     } 
    } 
} 
+0

Drupal使用的是什麼版本? – Clive

+0

我使用的是7.2.x版本。 – ndrizza

+0

對於替代答案請參閱:http://drupal.stackexchange.com/questions/33663/force-an-empty-region-to-display-d7 –

回答

1

這不僅僅是因爲你沒有任何塊分配給該區域,但幾乎肯定是因爲渲染數組是空的。請記住渲染函數的作用 - 它在渲染數組中的任何/所有元素&子元素上調用drupal_render,將其轉換爲用於輸出的html字符串。如果沒有可渲染的元素,它不會返回任何html。

渲染這些區域的正確(編程)方式是爲每個區域定義一個渲染數組,將#markup元素設置爲您希望Drupal輸出的任何html。這必須在您的自定義模塊中完成。

如果您需要從gui中完成此操作,除了定義幻像塊之外,我沒有看到任何其他方法。在這種情況下,你應該重新考慮你想要完成的是什麼。

+1

是的,定義一個幻影塊解決了它。 – ndrizza

0

我認爲答案在於region.tpl.php文件和相關template_preprocess_region()功能。

模板文件檢查是否有可用的有效變量,稱爲$content,它是從預處理函數加載的。如果$content數組爲空,則條件將失敗,並且不會顯示標記(如果區域不包含塊,則會發生這種情況)。

嘗試添加region.tpl.php的副本到您的主題,刪除if ($content):條件,然後刷新Drupal的緩存。

+0

不,這是不是原因,因爲我已經寫了我自己的模板地區,並沒有這樣的條件。我相信原因是我在這個區域內沒有塊,這導致drupal在調用render($ page ['region_name']);時不渲染區域。我可以爲每個區域分配虛擬塊,但我不想這樣做。 – ndrizza

+0

如果這就是原因,並且您正在尋找一個快速入侵,只需將內部語句更改爲'$ page [$ region] = array('#markup'=>'');'這應該說服'drupal_render()'有些事情要做 – Clive

+0

,這不足以說服Drupal。我想我會創造一些幻影塊。 – ndrizza

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確保始終呈現。

爲了解釋一下代碼,如果blocks數組的數量是1,那麼它意味着它是空的,因爲它總是包含#sorted屬性。

+0

爲什麼選擇投票?我自己使用了這些代碼,可以驗證它是否正常工作。 –