模塊特定設置
當你自己創(chuàng )建一個(gè)模塊時(shí),你常常想讓站點(diǎn)管理員能夠通過(guò)選擇不同的模塊設置屬性來(lái)改變模塊的行為。本章將詳細講述如何將一個(gè)模塊呈現在Drupal的管理頁(yè)面,如何為用戶(hù)呈現一個(gè)關(guān)于設置的表單,以及存儲設置屬性。
把你的模塊放到管理頁(yè)面的模塊列表中
Drupal的管理頁(yè)面為站點(diǎn)管理員展示了不同的站點(diǎn)配置選項。你想在這個(gè)配置頁(yè)面找個(gè)未知把你的模塊放下,這樣站點(diǎn)管理員就可以調整你的模塊的設置?,F在讓我們?yōu)榍罢滤鶆?chuàng )建的注釋模塊添加更多的配置選項。
創(chuàng )建一個(gè)鏈接
我們需要在管理頁(yè)面提供一個(gè)鏈接,這樣站點(diǎn)管理員可以進(jìn)入修改我們設置的頁(yè)面。通過(guò)在菜單鉤子(關(guān)于更多的菜單鉤子的信息,參看第4章)上創(chuàng )建一個(gè)入口,我們將鏈接放在了站點(diǎn)配置設置下面。下面的就是在我們的模塊中所實(shí)現的菜單鉤子:
/**
* Implementation of hook_menu().
*/
function annotate_menu($may_cache) {
$items = array();
if ($may_cache) {
$items[] = array(
‘path‘ => ‘a(chǎn)dmin/settings/annotate‘,
‘title‘ => t(‘Annotation settings‘),
‘description‘ => t(‘Change how annotations behave.‘),
‘callback‘ => ‘drupal_get_form‘,
‘callback arguments‘ => array(‘a(chǎn)nnotate_admin_settings‘),
‘a(chǎn)ccess‘ => user_access(‘a(chǎn)dminister site configuration‘)
);
}
return $items;
}
指向我們模塊的鏈接現在出現在Drupal的管理頁(yè)面的站點(diǎn)配置部分,如圖3-1所示:

圖3-1指向注釋設置頁(yè)面的鏈接
定義你自己的管理區域
Drupal有多個(gè)管理設置的分類(lèi),比如內容管理和用戶(hù)管理,都出現在主管理頁(yè)面上。如果你的模塊需要一個(gè)自己的分類(lèi),你可以非常容易得創(chuàng )建一個(gè)這樣的分類(lèi)。在這個(gè)例子中,我們創(chuàng )建一個(gè)名為“Node annotation”的新的分類(lèi)。為了這樣,我們修改我們的菜單鉤子以定義新的分類(lèi):
/**
* Implementation of hook_menu.
*/
function annotate_menu($may_cache) {
$items = array();
if ($may_cache) {
$items[] = array(
‘path‘ => ‘a(chǎn)dmin/annotate‘,
‘title‘ => t(‘Node annotation‘),
‘description‘ => t(‘Adjust node annotation options.‘),
‘position‘ => ‘right‘,
‘weight‘ => -5,
‘callback‘ => ‘system_admin_menu_block_page‘,
‘a(chǎn)ccess‘ => user_access(‘a(chǎn)dminister site configuration‘)
);
$items[] = array(
‘path‘ => ‘a(chǎn)dmin/annotate/settings‘,
‘title‘ => t(‘Annotation settings‘),
‘description‘ => t(‘Change how annotations behave.‘),
‘callback‘ => ‘drupal_get_form‘,
‘callback arguments‘ => array(‘a(chǎn)nnotate_admin_settings‘),
‘a(chǎn)ccess‘ => user_access(‘a(chǎn)dminister site configuration‘)
);
}
return $items;
}
現在我們代碼的結果改變了,我們的模塊設置的鏈接出現在了一個(gè)新的分類(lèi)中了,如圖3-2所示:

圖3-2 指向注釋設置模塊的鏈接現在作為一個(gè)單獨的分類(lèi)出現
如果你是一步一步跟著(zhù)做的,那么你需要清除菜單緩存來(lái)查看鏈接的呈現。
有兩種方式:截去cache_menu表或者使用Drupal開(kāi)發(fā)專(zhuān)用模塊所提空的清空緩存鏈接。
秘密消息:開(kāi)發(fā)專(zhuān)用模塊(http://drupal.org/project/devel)是為了專(zhuān)門(mén)支持Drupal開(kāi)發(fā)所寫(xiě)的一個(gè)模塊。它能幫你獲取多種開(kāi)發(fā)功能,比如清空緩存,查看變量,追蹤查詢(xún)語(yǔ)句,以及更多。它是專(zhuān)業(yè)開(kāi)發(fā)的必需品。
我們可以在兩步內建立我們的新分類(lèi)。首先,我們添加一個(gè)描述分類(lèi)頭部的菜單項。這個(gè)菜單項有一個(gè)唯一的路徑(admin/annotate)。我們生命:它應該放在右欄中,重量為-5,這是因為這個(gè)位置恰好位于站點(diǎn)配置分類(lèi)的上面,這樣方便我們截圖,如圖3-2所示的。^_^
第2步是告訴Drupal,把指向注釋設置的真實(shí)鏈接放在分類(lèi)” Node annotation”內部。我們通過(guò)修改原來(lái)菜單項的路徑來(lái)這樣做,以前路徑為admin/settings/annotate,現在替換為了admin /annotate/settings。以前,菜單項是站點(diǎn)配置分類(lèi)的路徑admin/settings的孩子,,如表3-1所示。
當我們清空菜單緩存,Drupal重新構造菜單樹(shù),由于admin /annotate/settings是admin /annotate的孩子,這決定了像圖3-2所展示的這樣。將模塊菜單項嵌套在如表3-1所示的任一路徑下,將使模塊出現在Drupal管理頁(yè)面的該分類(lèi)下面。
當然,這是個(gè)有點(diǎn)做作的例子,在真實(shí)場(chǎng)景下,你必須有個(gè)很好的理由來(lái)創(chuàng )建一個(gè)新的分類(lèi),以阻止讓管理員(通常是你自己)面對太多分類(lèi)時(shí)所產(chǎn)生的困惑。
表3-1管理頁(yè)面分類(lèi)的路徑
Path Category
admin/content Content management
admin/build Site building
admin/settings Site configuration
admin/user User management
admin/logs Logs
為用戶(hù)呈現一個(gè)設置表單
當一個(gè)站點(diǎn)管理員想要修改注釋模塊的的設置時(shí),我們需要展示一個(gè)表單以使管理員可以從中進(jìn)行選擇。在我們的菜單項中,我們把回調函數設置為drupal_get_form(),把回調參數設置為annotate_admin_settings.這意味著(zhù),當你訪(fǎng)問(wèn)http://example.com/?q=admin/
annotate/settings時(shí),命令drupal_get_form(‘a(chǎn)nnotate_admin_settings‘)將被執行,它主要告訴Drupal構造由函數annotate_admin_settings()所定義的表單。
下面讓我們看一下定義表單的函數,它定義了一個(gè)關(guān)于節點(diǎn)類(lèi)型的復選框(參看圖2-1),并且增加了另外兩個(gè)選項:
/**
* Define the settings form.
*/
function annotate_admin_settings() {
$form[‘a(chǎn)nnotate_nodetypes‘] = array(
‘#type‘ => ‘checkboxes‘,
‘#title‘ => t(‘Users may annotate these node types‘),
‘#options‘ => node_get_types(‘names‘),
‘#default_value‘ => variable_get(‘a(chǎn)nnotate_nodetypes‘, array(‘story‘)),
‘#description‘ => t(‘A text field will be available on these node types
to make user-specific notes.‘),
);
$form[‘a(chǎn)nnotate_deletion‘] = array(
‘#type‘ => ‘radios‘,
‘#title‘ => t(‘Annotations will be deleted‘),
‘#description‘ => t(‘Select a method for deleting annotations.‘),
‘#options‘ => array(
t(‘Never‘),
t(‘Randomly‘),
t(‘After 30 days‘)
),
‘#default_value‘ => variable_get(‘a(chǎn)nnotate_deletion‘, 0) // default to Never
);
Table 3-1. Paths to Administrative Categories
Path Category
admin/content Content management
admin/build Site building
admin/settings Site configuration
admin/user User management
admin/logs Logs
$form[‘a(chǎn)nnotate_limit_per_node‘] = array(
‘#type‘ => ‘textfield‘,
‘#title‘ => t(‘Annotations per node‘),
‘#description‘ => t(‘Enter the maximum number of annotations allowed per
node (0 for no limit).‘),
‘#default_value‘ => variable_get(‘a(chǎn)nnotate_limit_per_node‘, 1),
‘#size‘ => 3
);
return system_settings_form($form);
}
我們添加了一個(gè)單選按鈕來(lái)選擇什么時(shí)候應該刪除注釋?zhuān)砑恿艘晃谋据斎肟騺?lái)限制一個(gè)節點(diǎn)所允許的注釋數量(對此模塊增強特性的實(shí)現留給讀者作為練習)。在這里,我們沒(méi)有自己管理處理我們自己的表單的流程,而是使用了函數system_settings_form()來(lái)讓系統模塊為表單添加一些按鈕,并讓它管理表單的驗證和提交。圖3-3顯示的當前表單的選項的樣子。

圖3-3使用了復選框,單選按鈕,文本輸入框的增強的表單
發(fā)表于 @ 2007年09月22日 20:15:00|評論(0)|編輯
聯(lián)系客服