Drupal主題開發

Drupal主題模板文件結構

.info (required)

Drupal所必須靠.info文件才能看到你的主題。原數據,樣式表,JavaScripts,區塊區域和其它內容可以在這裏定義。但其它內容全部是可選的。

主題的內部名字也是繼承於這個名字,例如,如果它的名字命名爲 "eureka.info",則Drupal會將該主題的名字作爲“eureka”看待。

name = A fantasy name
//模板名稱是必須的,這是用戶可讀的名字,與主題的Drupal內部名字可以分開單獨進行設置。這在這裏,字符的限制則很少。
description = Tableless multi-column theme designed for blogs.
//推薦,主題的簡短描述
screenshot = screenshot.png
//截圖鍵時可選的,它告訴Drupal主題的縮略圖在哪裏,在選擇主題頁面(admin/build/themes)裏用到了縮略圖.如果.info文件中忽略了該鍵,那麼Drupal就會使用主題目錄下面的”screenshot.png”文件。
只有當你的縮略圖不叫"screenshot.png",或者你不想把它放到你主題的根目錄(比如,screenshot = images/screenshot.png)下面時,才使用該鍵。
version = 1.0
當發佈一個新的版本時,drupal.org會自動爲其添加一個版本號。當你爲Drupal貢獻主題時,你可以忽略該值。如果你的主題沒有放到drupal.org上的話,你可以爲你的主題指定任意一個版本號。
core = 7.x
//內核,必須的,從Drupal 6.x開始,模塊和主題的.info文件都必須指明它們兼容的Drupal內核主版本號。這裏設的值將與DRUPAL_CORE_COMPATIBILITY常量相比較。如果不匹配的話,那麼主題將被禁用。
engine = phptemplate
//主題引擎,推薦供主題使用。如果沒有提供引擎的話,那麼主題就是獨立的,比如,實現一個”.theme”文件。大多數主題都使用”phptemplate”作爲默認引擎。
PHPTemplate負責查找主題用到的主題函數和模板。只有當你理解你在做什麼的時候,你纔可以忽略這一設置。
base theme = garland
//子主題可以聲明一個基主題。這允許主題的繼承,也就是說基主題中的資源將被傳遞下來並在子主題中使用。子主題可以聲明別的子主題作爲其基主題,也就是允許多重繼承的存在。基主題的名字爲其在Drupal內部的名字。下面是Garland的子主題Minnelli的相應設置。
regions[header] = Header
regions[highlighted] = Highlighted
regions[help] = Help
regions[content] = Content
regions[sidebar_first] = Left sidebar
regions[sidebar_second] = Right sidebar
regions[footer] = Footer
//我們這樣定義主題中的區域,聲明鍵’regions’,緊跟着“[”,接下來是內部名字,接着是“]”,然後是一個等號,右邊是用戶可讀的區域名字。例如,regions[theRegion] = The region name.
features[] = logo
features[] = name
features[] = slogan
features[] = node_user_picture
features[] = comment_user_picture
features[] = favicon
features[] = main_menu
features[] = secondary_menu
//特性
許多由主題控制輸出的頁面元素,可以在主題的配置頁面啓用或者禁用. “features”鍵控制着出現在主題配置頁面上的複選框.對於一個主題,如果你不想爲其定義某個複選框時,着非常有用.爲了刪去某個複選框,只需要在”features”中將其刪除即可.如果一個也沒有定義的話,那麼會輸出所有默認的複選框.
下面的例子列出了所有由features鍵控制的元素.通過註釋掉primary_links和secondary_links元素,那麼站點管理員就不會看到這兩個複選框了.
stylesheets[all][] = theStyle.css
stylesheets[print][] = print.css
//傳統方式,主題可自動的使用默認的style.css,並且可以在它們的template.php文件中通過調用drupal_add_css()來添加其它樣式表。從Drupal6開始,主題也可以通過.info文件來添加樣式表。
scripts[] = myscript.js
//傳統方式,主題通過在template.php文件中調用drupal_add_js()來添加javascripts腳本。從Drupal6開始,主題也可以通過.info文件來添加javascripts了。
php = 4.3.3
//這個定義了主題支持的PHP最低版本。其默認值源自DRUPAL_MINIMUM_PHP常量,它是Drupal內核所需要的php最低版本。對於一個新的版本,如果需要的話,可以對其進行重新定義。而對於大多數的主題,都不應該添加這一項。
; Information added by drupal.org packaging script on 2011-04-23
version = "7.0"
project = "drupal"
datestamp = "1202913006"

什麼是Drupal的區域?

想象一下,如果我們把Drupal網站的頁面,切成一片一片的,然後我們可以分別往其中放置各種各樣的內容。那麼這些切片就是Drupal主題中所說的區域。本質上,區域是Drupal的一種內容組織方式。

Drupal的標準區域有哪些?

sidebar_first,sidebar_second,content,header,footer,highlighted,help,page_bottom,page_top。

Drupal的9個按時間順序排列的預定義的主題區域

regions[page_top] = Page Top
regions[header] = Header
regions[highlighted] = Highlighted
regions[help] = Help
regions[content] = Content
regions[sidebar_first] = Sidebar First
regions[sidebar_second] = Sidebar Second
regions[footer] = Footer
regions[page_bottom] = Page Bottom

如圖所示,展示的Drupal默認區域是一個標準的三欄佈局。灰色的區域是必須的,而其餘的是可選的。Header、sidebar_first、sidebar_second、footer是佈局方面的區域。page_top和page_bottom是特殊區域;它們將在本章的“隱藏區域”部分討論。



如何爲我們的Drupal主題添加自定義區域?

共分兩步走。首先,打開主題的info文件輸入下列指令(假定我們要添加的自定義區域名爲myregion):

regions[myregion] = My region

上述指令方括號裏的myregion是區域的機讀名,而My region則是區域的人讀名。例如:我們在Drupal後臺的區塊配置界面(url:你的網站域名/admin/structure/block)所見到的就是區域的人讀名。

然後打開主題的page.tpl.php文件在你喜歡的位置輸入下列代碼即可:

print render($page['myregion'];


模板文件 (.tpl.php)


這些模板用作爲 xHTML 標記和 PHP 變量。在某些情況下,它們還輸出其他類型的數據,例如xml rss。每一個 .tpl.php 文件處理特定的可主題化數據的輸出,而有些時候,它能通過“ 這些建議處理多個multiple .tpl.php 文件。它們是可選的,如果在你的主題中沒有這些文件,則會回退到缺省的輸出。在這些文件中儘量控制住複雜的邏輯。在很多情況下,應該是簡單的xHTML 標記和PHP變量。在覈心和貢獻模塊中有許多的這些模板文件。把它們拷到你的主題目錄中會使Drupal讀取你的這個版本。

注: The 主題註冊有關於存在的主題數據的緩存信息。當你添加 移除或相關主題文件或功能函數時,你需要重置它。

下表是Drupal核心提供的主題模板文件列表。

模板文件 位置 描述
html.tpl.php modules/system 站點的主模板文件,包含站點得到HTML頁面的<head>...</head>之間的所有元素。
page.tpl.php modules/system 包含HTML頁面的<body>...</body>之間的所有元素。
region.tpl.php modules/system 定義區域的佈局和渲染
node.tpl.php modules/node 定義節點的佈局和渲染
block.tpl.php modules/block 定義區塊的佈局和渲染
field.tpl.php modules/field/theme 定義字段的佈局和渲染

 

template.php

對所有的條件邏輯和輸出數據的處理過程,有template.php 文件。它不是必須的,但是保持.tpl.php文件整潔,常習慣於讓 預處理器在產生變量前同.tpl.php文件中的標記合併。 自定義函數 重裁主題函數或者其它自定義的原始輸出都可以在這裏完成。這個文件必須使用PHP的開始標記 "<?php"打頭。而結束標記並不需要,並且也建議你略過它。

使用主題預處理函數爲模板添加變量

當大家打開Drupal的模板文件時,可以發現很多PHP變量。在很多時候,模板默認提供的這些變量有可能無法完全滿足我們的需求,這時我們就需要爲模板文件添加自己的自定義變量了。該怎麼做呢?這就要用到Drupal的主題預處理函數THEME_preprocess_HOOK(&$variables)了。

在自己主題的文件夾下面創建一個template.php文件,在其中添加下列代碼。

function mytheme_preprocess_page(&$variables) {
  $variables['custom_text'] = t('嘿!你好!預處理函數!');
}
在上述代碼中函數的mytheme字段是主題的名字;page字段是預處理函數所對應的模板文件去掉擴展名之後的名字,也就是主題鉤子的名字,即:指明本函數應用於page.tpl.php模板文件。$variables變量是一個數組,我們爲它自定義了一個鍵custom_text,這個鍵的名字就是我們所創建的新變量的名字了,即:我們創建的新變量名爲——$custom_text。然後,我們爲這個變量賦予一個字符串‘嘿!你好!預處理函數!’,作爲它的值。

好了,現在變量已經有了,下面我們就可以在page.tpl.php文件中使用它了。打開page.tpl.php文件,在希望的位置鍵入如下代碼:

print $custom_text;

如果沒有發現,也不要着急,可能是下面兩個原因:

  • 你忘記清理緩存了。
  • 在實現預處理函數時,你忘記了參數前的&符號。

使用主題預處理函數處理邏輯

Drupal主題開發中的一個重要原則:儘量不要在模板文件中處理複雜的邏輯,它們應該放在PHP函數中,而不是模板中。這樣做的最大好處是:邏輯層與表示層的分離,有利於代碼的組織與維護。

function mytheme_preprocess_page(&variables) {
  if ($variables['is_front']) {
    $variables['custom_text'] = t(‘這兒是首頁’);
  }
  else {
    $variables['custom_text'] = t('這兒不是首頁');
  }
}

這是一個很簡單的if...else...邏輯,if的條件是$variables['is_front']這個變量,其中的數組鍵'is_front'表示page.tpl.php模板文件中的$is_front變量,該變量是一個布爾值,用於判斷用戶訪問的當前頁面是否爲Drupal網站的首頁。如果是首頁,我們的自定義模板變量$custom_text的值爲‘這兒是首頁’,否則爲’這兒不是首頁‘。

function mytheme_preprocess_page(&variables) {
  if (isset($variables['user']->roles[3])) {
    $variables['custom_text'] = t(‘我是網站管理員’);
  }
  else {
    $variables['custom_text'] = t('我不是網站管理員');
  }
}

第一個函數的區別在於$user(在預處理函數中用$variables['user']表示)變量,它採用對象的形式表示當前訪問的用戶,而$user->roles[3](在預處理函數中用$variables['user']->roles[3]表示)則表示網站管理員這一用戶角色。


模板建議template suggestion

模板建議是基於Drupal中已經存在的.tpl.php模板文件的替換模板。這個定義主要有兩個要點:(1)模板建議是.tpl.php模板;(2)模板建議用於替換已經存在的.tpl.php模板。


block.tpl.php是一個Drupal內核中定義的基模板,用於區塊的顯示,同時還定義了一些模板建議。通過實現這些模板建議,我們可以針對不同的區塊條件使用特定的模板。如block--block--1.tpl.php模板用於Drupal網站中的第一個區塊,block--sidebar_first.tp.php模板則用於Drupal網站中左邊欄中的區塊。


Drupal的內核,主題,主題引擎和模塊都可以提供模板建議,這可以使Drupal的開發工作更加smart。

Drupal內核和很多contrib projects不是已經提供了非常多的模板建議了嗎?這是因爲我們有時需要根據自己的特定條件應用某個模板,而這些條件是Drupal內核和contrib projects的作者所沒有顧及到的。

function mytheme_preprocess_node(&$variables) {
  if ($variables['type'] == 'page') {
    $variables['theme_hook_suggestions'][] = 'node__custom';
  }
}

沒錯!我們的自定義模板建議通過Drupal的主題預處理函數添加。

這個函數的作用:添加了名爲node--custom.tpl.php的模板建議。if中的條件$variables['type'] == 'page'可以根據你的需求進行擴展......


預處理函數與處理函數的執行順序

Drupal的主題機制當中存在很多種預處理函數和處理函數,看起來讓人犯暈。本文爲大家總結了它們執行的基本規律。

  • Drupal的所有預處理函數在處理函數之前運行。
  • template前綴的函數首先運行,module前綴的函數其次運行,theme前綴的函數最後運行。
  • Drupal的多鉤子函數在特定鉤子函數之前運行。

下面是總結的執行順序列表,自上而下執行:

  • template_preprocess()
  • template_preprocess_HOOK()
  • MODULE_preprocess()
  • MODULE_preprocess_HOOK()
  • THEME_preprocess()
  • THEME_preprocess_HOOK()
  • template_process()
  • template_process_HOOK()
  • MODULE_process()
  • MODULE_process_HOOK()
  • THEME_preprocess()
  • THEME_preprocess_HOOK()


子主題

表面上,子主題同其它主題的行爲是一樣的。唯一區別是它繼承了父主題的資源。要創建一個,則在.info文件中需要有一個“基主題”入口。在這裏,它可以從父主題繼承資源。還可以有多層的繼承;例如,子主題可以聲明其它的子主題作爲它的基主題。對此沒有固定的限制。

Drupal 5 以前的版本需要子主題目錄在父主題目錄中,現在不需要了。

其它s
  • 要讓主題能運行,圖標和截圖不是絕對需要,但建議有,特別是當你將主題貢獻到Drupal庫中時。截圖會顯示在內部的主題管理頁面,以及如果有相應權限的話用戶賬號設置中可以選擇主題。更多信息請參見 截圖指南
  • 爲支持管理UI設置或在圖標,搜索,使命等等上面的 "特性" ,可以使用 "theme-settings.php" 文件。這是一個高級特性,更多的信息參見手冊中的 高級設置
  • 對於 顏色模塊支持,需要一個有 "color.inc" 文件及相關文件的目錄 "color"來支持。
  • 如果你想使用核心主題來做的話,使用 子主題 或者拷貝一份重命名一下。 強烈不建議直接修改Garland 或 Minnelli。因爲它們要用來安裝和更新過程。

參考 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章