drupal_foo

drupal_foo的意思,就是drupal很多函數裡面以「drupal_」為開頭名稱的,會以drupal開頭的函數,表示很常被模組的開發者使用,也特別的重要。

幾乎所有的drupal_foo函數,都會在下面這些位置找到。
include/bootstrap.inc
include/common.inc

也建議模組開發者,可以善加利用drupal核心提供的API,並注意不要自行在模組裡新增drupal_foo的function,以免混淆。

這個單元是許多熱心的貢獻者,將許多drupal_foo函數寫上中文說明,每個drupal_foo的文件說明裡裡通常會包含:定義、描述、參數、傳回值、範例、程式碼...等等。若您也知道一些drupal_foo的用途,或是看到有錯誤的地方,歡迎直接共筆編輯,幫忙加上說明和解釋。

Drupal版本:

drupal_add_js

定義

drupal_add_js($data = NULL, $type = 'module', $scope = 'header', $defer = FALSE, $cache = TRUE)
includes/common.inc, 第 1600 行之後

描述

加入一個 JavaScript 的檔案、設定、或是程式碼到頁面中

根據不同的參數,會有不同的結果產生。一般,它會加入 JavaScript 的"檔案連結"或是"直接貼入程式碼"到網頁裡。以下列出不同的結果:

  • 加入一個檔案('core', 'module' and 'theme'): 加入一個連結到網頁中。排列的順有一定的規則, 'core' 最前面,再來是 'module' ,最後是 'theme',就算加入 的時間比較晚,還是會依這個順序排列。
    例:

    drupal_addjs('js1.js', 'module');
    drupal_addjs('js2.js', 'core');

    因為 'core' 的順序在前面,所以 js2.js 會排在 js1.js 前面,會優先被讀入。
  • 加入一段程式碼 ('inline'): 貼入程式碼,如果目的不是引用一個 *.js 的檔案,而是一段 JavaScript 程式碼,就用這個參數。例如,開一個新視窗,或是跳出訊息視窗顯示一段訊息。
  • * 加入一個設定 ('setting'): 傳入一個變數的值。這個值會被放到名為 Drupal.settings 的陣列中,讓其它部分的 JavaScript 去呼叫它。

參數

$data (選擇性) 如果用到這個參數,它的內容的和後面的 $type 參數有關:

  • 'core', 'module' 或 'theme': 一個由網站根目錄算起的相對路徑(*.js 檔案)
  • 'inline': 一段 JavaScript 程式碼
  • 'setting': 一個關連陣列,將會被轉換為 Drupal.settings 下的物件

$type (選擇性) 一個表示要放到網頁裡的 JavaScript 是哪一種類型。可以是 'core', 'module', 'theme', 'inline' 和 'setting'。你也可以自訂一個名稱,這時 $data 的內容會被視為一個 JavaScript 檔案(*.js)路徑。預設值是 'module'
排列順序: 'core' -> 'module' -> 'theme' -> 'setting' -> 'inline' -> [自訂的名稱]

$scope (選擇性) JavaScript 程式要放置的位置,預設可以是 'header'(開頭) and 'footer'(節尾). 如果你所用的版型有定義其它的位置,也可以使用它們放到這個參數中。

$defer (選擇性) 如果為 TRUE,在 標籤中會加入 defer 屬性,預設為 FALSE。這個參數在 $type 是 'setting' 沒有作用。

$cache (選擇性) 如果設定為 FALSE, JavaScript 檔案會在每一次呼叫頁面的時候重新讀取,預設值是 TRUE,這個參數只對 $type 表示引入的是一個 JavaScript 檔案有用

值回值

如果第一個參數為 NULL,就會傳回和 $scope 同樣參數 JavaScript 陣列回來

範例

1. 引入檔案

drupal_add_js('test1.js', 'module');
drupal_add_js('test2.js', 'theme');
drupal_add_js('test3.js', 'core');

結果網頁原始檔的開頭部分可以找到類似下面的程式碼


由於 core 的較優先,所以會被排在前面先被讀入。

2. 加入程式碼 & 加入設定

drupal_add_js('alert("var1 = "+Drupal.settings.var1);', 'inline');
drupal_add_js(array('var1' => 123, 'var2' => 456), 'setting');

執行的時候,會跳出一個訊息視窗,顯示「var1 = 123」。

原始碼

<?php
function drupal_add_js($data = NULL, $type = 'module', $scope = 'header', $defer = FALSE, $cache = TRUE) {
if (!is_null($data)) {
_drupal_add_js('misc/jquery.js', 'core', 'header', FALSE, $cache);
_drupal_add_js('misc/drupal.js', 'core', 'header', FALSE, $cache);
}
return _drupal_add_js($data, $type, $scope, $defer, $cache);
}
?>

Drupal版本:

drupal_get_path

定義

drupal_get_path($type, $name)
includes/common.inc

描述

可用此函數取得模組、版型或版型引擎(theme engine)的路徑

參數

$type: 要尋找的種類 (如: theme, theme_engine, module)
$name: 尋找東西的名字

傳回值

要找東西的路徑(網站相對路徑,不是伺服器的系統路徑)

範例

當你開發的模組裡面有圖片,或是由其它需要引入的 JavaScript 的時候,那就很有用了。因為你不能確定你的模組會被放在哪裡。
有可能在 modules/ 下,也可能在 sites/all/modules/ 下面。這時候就需要用它來幫你找出模組的路徑,好引入它資料夾裡面的檔案。
如:

$my_module_path = druapl_get_path('module', 'my_module');
$my_theme_path = druapl_get_path('theme', 'my_theme');
$phptemplate_engine_path = druapl_get_path('theme_engine', 'phptemplate');

附帶一提的,如果使用了「簡潔網址」,就是網址不出現 ?q=xxx 的模式。連結使用相對路徑的時候,可能會出現找不到檔案的情形。(瀏覽器被網址列的網址搞混了)
這個時候建議搭配 base_path() 這個函數,寫一個相對於網頁伺服器的"絕對路徑"。
如:

$my_module_path = base_path() . drupal_get_path("module", "my_module");
// 如果網站是在 drupal 資料夾下, base_path() 會傳回 "/drupal"

路徑用 "/" 開頭,就表示由網頁伺服器的"根"開始算相對路徑。
如: "/drupal/my_module/test_page/"

不過如果使用 drupal_add_js() 函數,因為它本身就會加上網站本身的路徑,所以就不需要加上 base_path()了。

程式碼

<?php
function drupal_get_path($type, $name) {
return dirname(drupal_get_filename($type, $name));
}
?>

Drupal版本:

drupal_set_message

定義

drupal_set_message($message = NULL, $type = 'status')
includes/bootstrap.inc

描述

定義一組訊息,以反映剛執行命令的狀態

參數

$message: 要顯示的訊息
$type: 類別,可以是

  • 'status'
  • 'error'

傳回值

所有已經定義的訊息

範例

例如要告訴使用者”你己經成功註冊了”:
<?php
drupal_set_message(t('Created a new user account. No e-mail has been sent.'));
?>

一個綠色的方框就會出現在下一個用戶的可視頁面內

開發者不用操心顯示部份

又例如要顯示一個錯誤:
<?php
drupal_set_message(t('Invalid password.') , 'error' );
?>

後面的一個參數如果為'error'
一個錯誤的紅色框就會出現

註:第一個參數可以為html
註:t() 函數指可翻譯的

程式碼

<?php
function drupal_set_message($message = NULL, $type = 'status') {
if ($message) {
if (!isset($_SESSION['messages'])) {
$_SESSION['messages'] = array();
}

if (!isset($_SESSION['messages'][$type])) {
$_SESSION['messages'][$type] = array();
}

$_SESSION['messages'][$type][] = $message;
}

//如果發生資料庫連接錯誤,則訊息不會被記錄
return isset($_SESSION['messages']) ? $_SESSION['messages'] : NULL;
}
?>

附加檔案大小
Image icon drupal_set_message_1.JPG6.59 KB

Drupal版本:

drupal_set_title

定義

drupal_set_title($title = NULL)
includes/path.inc, 第 187 行之後

描述

設定頁面的標題文字(不是網站標題)

參數

$title 選擇性參數,如果為 NULL 則不會改變概有的 標題內容。

傳回值

沒有傳回值,但會改變當下頁面的標題。

範例


drupal_set_title("新標題");

當同一個頁面要有動態標題內容時…
如︰大家都看到都是同樣"我的帳號"連結,但是開啟後的頁面標題變成自己的帳號名稱。
就需要例用 drupal_set_title 去修改頁面的標題,不然預設標題的文字和連結名稱是一樣的。

原始碼

<?php
function drupal_set_title($title = NULL) {
static $stored_title;

if (isset($title)) {
$stored_title = $title;
}
return $stored_title;
}
?>

Drupal版本: