Drupal 模組開發 - 應用hook_theme()建立自定樣板檔(.tpl.php)

本文參考自這幾篇
Using the theme layer (Drupal 7.x)
Using template (.tpl.php) files in your own module

依照參考資料,雖然實務上我們也可以在template樣版檔中進行如資料庫讀寫的動作,但theme 以及 module 的角色上應該是分工明確的,theme處理的是外觀表現上的架構,而module則主要是提供theme所需要的資料。這樣當網站規模越來越龐大的時候,較能有效率的管理。

那麼兩者透過什麼連結起來呢? 就是hook_theme()這個函數。透過實例來說明怎麼應用。

我們可以透過taxonomy_term_theme() 這個函數名稱,來與taxonomy-term.tpl.php進行掛勾(hook),不過為免與系統函數混淆,taxonomy_term_theme() 的函數名稱需要取為 my_module_name_taxonomy_term_theme() ,其中 my_module_name代表的是目前撰寫模組的名稱

forum_theme()為例

function forum_theme() {
  return array(
    'forums' => array(
//取用forums.tpl.php這個樣版檔
      'template' => 'forums',
//六個要傳遞給樣版檔的預設值
      'variables' => array('forums' => NULL, 'topics' => NULL, 'parents' => NULL, 'tid' => NULL, 'sortby' => NULL, 'forum_per_page' => NULL),
    ),
//...
  );
}

我們再看看forums.tpl.php這個檔案

<?php if ($forums_defined): ?>
<div id="forum">
  <?php print $forums; ?>
  <?php print $topics; ?>
</div>
<?php endif; ?>

可以注意到這個樣板檔中取用了三個變數 $forums_defined, $forums, $topics。

基本上完成以上兩件事情,之後就可以利用theme("forums",array(...))來快速產生輸出內容了。