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_add_js($data = NULL, $type = 'module', $scope = 'header', $defer = FALSE, $cache = TRUE)
includes/common.inc, 第 1600 行之後
加入一個 JavaScript 的檔案、設定、或是程式碼到頁面中
根據不同的參數,會有不同的結果產生。一般,它會加入 JavaScript 的"檔案連結"或是"直接貼入程式碼"到網頁裡。以下列出不同的結果:
drupal_addjs('js1.js', 'module');
drupal_addjs('js2.js', 'core');
$data (選擇性) 如果用到這個參數,它的內容的和後面的 $type 參數有關:
$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_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_set_message($message = NULL, $type = 'status')
includes/bootstrap.inc
定義一組訊息,以反映剛執行命令的狀態
$message: 要顯示的訊息
$type: 類別,可以是
所有已經定義的訊息
例如要告訴使用者”你己經成功註冊了”:<?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;
}
?>
附加檔案 | 大小 |
---|---|
drupal_set_message_1.JPG | 6.59 KB |
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;
}
?>