模塊開發實例:hook_theme的應用

drupal的默認模板引擎在themes\engines\phptemplate目錄下,在5.x版本中,這個目錄下還有很多個文件,用來定義節點、頁面等樣式,如node.tpl.php、page.tpl.php,但在6.x版本中,這個目錄下只有一個文件,而且內容都是幫助說明,那麼以前的tpl.php上哪兒去了呢?在哪兒定義的它們?

drupal 6.x的theme機制做了較大變化,核心就是hook_theme,和hook_nodeapi等鉤子一樣,其它模塊都可以調用它,定義自己的tpl.php。在輸出時,系統調用tpl.php文件的順序是先主題、後模塊、最後是核心。比如節點的瀏覽頁,是由node.module模塊定義的,系統會先在主題文件夾裡尋找node.tpl.php,如果沒有,就在node.module中尋找。那麼,這個node.tpl.php是如何添加進系統中,如何進行傳值的呢?下面以movie模塊為例來說明hook_theme在模塊中的應用。

假設需求是把電影的相關信息進行複雜的頁面排版,並顯示在節點中。從前面的實例中我們已經知道,可以直接把html樣式寫在nodeapi中,但這樣有三個缺點:1、導致module文件龐大、雜亂。2、修改起來不如tpl.php文件方便,而且tpl.php還可以複製到theme目錄下自定義。3、theme默認啟用了緩存機制,使用tpl.php文件性能更佳。有了這幾大優點,選擇用什麼,不言而喻了。

首先定義hook_theme,類似於hook_node_info,在hook_theme裡,你也需要把定義的theme函數的相關信息傳遞出去。

<?php
  function movie_theme
() {
      return array(
          'movie_nodeview' => array(
//名稱
          'template' => 'movie_nodeview',
//定義tpl.php文件名,可不定義,見下。
          'arguments' => array('movie' => NULL),
//傳遞的參數,可傳遞多個。
         
),
          'movie_nodeview_t' => array(
//名稱
            //不添加tpl.php文件,所以不用傳遞template參數,直接在模塊文件中定義theme_movie_nodeview函數即可。
          'arguments' => array('movie' => NULL),
//傳遞的參數,可傳遞多個。
            //'file' => 有時候也許想把theme_movie_nodeview函數寫在另一個文件中,這兒可以寫上文件路徑。
         
),
      );
  }
?>

 

接下來請到模塊文件夾下創建一個文件:movie_nodeview.tpl.php,然後到管理性能中,清除緩存。請記住:修改了hook_theme函數,一定要清除緩存,修改了hook_menu也需要清除緩存。下一步是調用我們剛剛定義的theme_movie_nodeview的時候了,修改nodeapi:

<?php
  case 'view'
:
    if($node->type == 'movie'
){
      $movie['dao'] = $node->movie['dao'
];
      if($node->movie['cang'
]){
        $movie['cang'] = $node->movie['cang'
];
      }
      if($node->movie['image_url'
]){
        $movie[''] .= theme('image', $node->movie['thumbnail_url'
]);
      }
      $node->content['movie'
] = array(
        '#value' => theme('movie_nodevie', $node->movie),
//調用了剛剛定義的theme文件,等於把$node->movie傳遞給了movie_nodeview.tpl.php。
        '#weight' => 10
,
      );
    }
  break;
?>

 

下面開始在movie_nodeview.tpl.php裡排版佈局了。傳遞過來的是一個數組,在這個tpl.php文件裡,取值和node.tpl.php裡沒兩樣:

<?php
  $movie['dao'];
//導演。至少這兒要怎麼排版就隨意了。如果模塊是發佈給大家用的,別人可以不用到模塊文件夾裡來修改tpl.php,複製一份放到自己的主題文件夾裡,根據優先級,系統會調用主題目錄裡的文件來輸出。
?>

 

hook_theme就是這麼簡單,另一個不需要tpl.php的用法就更簡單了,調用方法也一樣,theme(‘movie_nodevie_t’, $node->movie)。在movie.module文件中,創建theme_movie_nodeview_t函數,定義樣式:

<?php
  function theme_movie_nodeview_t($movie
){
    return '<h2>'.$movie['dao'].'</h2>'
;
  }
?>

 

當然,這只是hook_theme在模塊中的部分應用,我們還可以為某一個輸出定義多個tpl.php文件,設置優化級,讓用戶在製作主題時有更大的自由度。比如節點的顯示,使用node.tpl.php,但也可以使用node-type.tpl.php,優先級更多。這為用戶提供了更大的發揮空間

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>