【Drupal】一些常用的主題函數備忘

來源:互聯網
上載者:User

Drupal 做為一款優秀的開源 CMS 其主題模板定製功能也非常強大,昨天寫了在 Joomla 模板中常用的函數今天當然少不了整理 Drupal 的了。做模組程式開發的就不用往下看了,以下大部分函數及方法多用於模板及調試主題,解釋說明部分也僅適合 Drupal 前台開發,因為本人是做前端開發,背景程式的部分我就不獻醜了。按照慣例下面的代碼需要放在 php 標籤內,下面收集的這些函數均可在 Drupal 官方的 API 文檔中找到,具體地址 http://api.drupal.org/ 個人這裡列出了一些對前台模板主題比較實用重要的如下:

 

1、列印數組及對象:print_r();

1
 echo print_r($user);

解釋說明:做 Drupal 主題模板開發一段時間會發現 print_r(); 函數將伴隨始終,當你需要調用某個值的時候可以去請教跟你協作的後台工程師,也可以使用上面代碼自行列印,然後找出自己需要的。樣本中列印的即是所有 user 對象的值,有使用者識別碼 可以用來拼出使用者的頁面路徑,有使用者的角色,使用者的頭像,當然包含使用者密碼的 MD5 值資訊等;拓展一下,你可以在 node.tpl.php 模板中列印 node 對象以達到完全拆分 cck 輸出的資訊和節點本文等各個欄位。

2、判斷使用者是否登陸:global $user;

1
global $user;    if( $user->uid ){ /* 使用者已經登陸 */ }else{ /* 使用者沒有登陸 */ }

解釋說明:其實本樣本是通過判斷 uid 來區別使用者是否登陸的,該使用方法可以擴充到根據 uid 的具體值來區分具體某個使用者,如 if ( $user->uid == 1 ) 為超級管理員。

3、判斷角色以區別對待:global $user;

1
global $user;    if( in_array('guest',$user->roles) ){ /* 使用者 guest 角色 */ }else{ /* 不是該角色 */ }

解釋說明:這裡仍然是通過讀取 user 對象擷取其角色資訊,其他的應用可以自己去拓展,如輸出帳戶圖片、輸出使用者基本資料等等。

4、判斷使用者是否有編輯許可權

1
if ( node_access('update', $node) ){ /* 具有編輯許可權 */ } else { /* 不可編輯該節點 */ }

解釋一下:樣本用於區分目前使用者是否具有對該節點的編輯許可權,具有編輯許可權是通常會輸出編輯按鈕或編輯的連結地址。

5、按節點 node 類型使用不同的 page 模板

1
if( $node->type == 'blog' ){ include 'page-blog.tpl.php'; return; }

解釋一下:通常我們會根據節點內容類型使用諸如 node-blog.tpl.php 格式的節點模板分別渲染,但如果想做到整個 page 都有所區別則需要樣本中的代碼。

6、按照 URL 選擇不同的 page 模板

1
if( arg(0) == 'admin' ){ include 'admin.tpl.php'; return; }

解釋一下:這裡的 URL 必須為 Drupal 的內部路徑而不是通過 path 的 url 重寫後的路徑,而且模板引擎預設會先按路徑尋找模板檔案如 page-admin.tpl.php 如果沒有找到才會讀取 page.tpl.php 進而使範例程式碼生效。

7、在外部 JavaScript 檔案中引用 Drupal 路徑

解釋一下:如果你引入一個外部 JavaScript 指令檔,而這個檔案裡面又恰好有用到網站路徑的話就需要用到 Drupal 預設提供的 Drupal JS 對象了,在 JavaScript 檔案中可以使用 Drupal.settings['basePath'] 來直接調用當前 Drupal 的根路徑等同於 $base_path 變數或者是 base_path() 函數在 PHP 中使用。

8、在模板中定義更多區塊位置

123
function yourTheme_regions(){    return array('side' => '側邊欄', 'head' => '頁頭', 'foot' => '頁尾', 'content' => '內容');}

解釋一下:將代碼放於模板檔案夾下的 template.php 檔案中(如果沒有請建立並以 <?php 作為檔案開頭)即可在“管理-區塊”頁面定義更多地區位置,這塊可能也是從 Joomla 到 Drupal 最不習慣的概念之一。

9、判斷當前頁面是否為首頁

1
if( $is_front ){ /* 首頁代碼 */ }

簡單解釋:通過判斷 Drupal 變數 is_front 可以直接判斷當前頁面是否是首頁,這在首頁與內頁結構樣式相差不大的情況下將非常有用,可以方便的減少大量重複代碼。

10、根據 URL 產生頁面 Class ID 以更方便使用 CSS 定製外觀

12
<body id="<?php echo 'path-',arg(0),'-',arg(1); ?>">  </body><div id="divBody" class="<?php echo 'path-',arg(0),'-',arg(1); ?>"><?php echo $content; ?></div>

簡單解釋:儘管 Drupal 的主題化定製已經非常靈活,但畢竟多數模組提供的 theme 函數非常有限,如果僅僅是為了調整一小塊的樣式而使用 page-*.tpl.php 甚至單獨開發模組的話明顯得不償失,於是可以使用上面的變通的方法,這樣頁面在載入時會添加一個以當前路徑命名的 Class 或 ID 這樣就可以很方便的使用 CSS 的層級選取器來修改樣式(如 div.path-node-add a { color:#F00; } 就可以方便的定製“node/add”頁面的連結的樣式而不需要單獨建立 tpl 或覆寫函數)這也正是 Yahoo UI 裡面採用的方案。

11、語言 PO 的檔案頭資訊

12345678910
msgid ""msgstr """Project-Id-Version: drupal (6.10)/n""POT-Creation-Date: 2009-05-06 23:18 +0800/n""PO-Revision-Date: 2009-04-16 23:06 +0800/n""Language-Team: Chinese, Simplified/n""MIME-Version: 1.0/n""Content-Type: text/plain; charset=utf-8/n""Content-Transfer-Encoding: 8bit/n""Plural-Forms: nplurals=2; plural=(n!=1);/n"

簡單解釋,這是 Drupal 的本地化 PO 檔案中簡體中文(zh-hans)的頭部資訊,特別需要注意的是最後的 Plural-Forms 屬性,一定不要寫錯。

12、定製搜尋沒有返回結果的頁面

我們知道定製 Drupal 的搜尋結果頁可在 phptemplate.php 裡面通過覆寫 theme_search_item($item, $type) 函數來實現,但如果搜尋沒有返回任何結果時 Drupal 是寫死的,這裡所實現的就是修改 “Check if your spelling is correct. 請檢查您的拼字。” 部分的內容。

簡單的說是通過在模板檔案 box.tpl.php 裡面判斷 $title == t(‘Your search yielded no results’) 來實現搜尋無結果頁的定製。

簡單解釋,由於 Search 模組內沒有提供“無返回搜尋結果”時可供 phptemplate 覆寫的主題函數,而是直接寫死的(即“請檢查您的拼字是否正確”等文字提示)而多數情況為了避免使用者跳出,這裡會做一些提示性資訊或是一些連結;所以這裡可以在 box.tpl.php 模板裡面通過判斷 title 為 “搜尋沒有找到任何結果” 來單獨定製該頁面的內容。

依葫蘆畫瓢,此方法可應用來定製其他模組裡面所有使用 theme(‘box’, $title, $output) 函數渲染的輸出內容部分,只需要在 box.tpl.php 裡面判斷 $title 的值與該模組輸出的 $title 值相同(如評論模組裡面的 theme(‘box’, t(‘Comment viewing options’), $output) 裡面的 t(‘Comment viewing options’) 等等)即可;但不適用於 $title 為非固定值得部分,好在多數由 box 方式渲染的部分都是固定的(如 菜單管理頁面的“導航”部分 提交評論的“提交新評論”部分 等等)。

13、取得網站的絕對路徑: $base_path 和 base_path();

由於 Drupal 整站採用的都是相對路徑,但當網站安裝目錄沒有在根目錄(/)下而我們又需要獲得絕對路徑的時候我們可以使用 $base_path(在 page.tpl.php 裡)base_path()(在 node.tpl.php 裡)變數或者函數擷取。

14、配合 ImageCache 手工輸出格式化圖片輸出效果

12345
print theme('imagecache', $preset, $image['filepath'], $alt, $title,  $attributes);// $preset :預先在 admin 裡面定義的 ImageCache 動作如縮放裁切等;// $image['filepath'] :即檔案的路徑,可使用 upload 或者 CCK 的內容;// $alt $title :即圖片的 alt 及 title 屬性,沒有圖片或關閉圖片瀏覽時的替代文字及提示;// $attributes :定義其他屬性的一個數組,片的 class width height 等內容;

我們在使用 ImageCache 和 CCK 結合可以很方便的任意設定動態產生各種縮圖緩衝,而在 tpl 模板檔案中則可以直接使用上面的 theme 函數調用 ImageCache 中預設的動作即時產生圖片緩衝。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.