久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

從頭學習Drupal--基本架構三 | Drupal China

 gaofrank 2008-10-17

從頭學習Drupal--基本架構三

xeopn 于 周六, 2008-06-21 20:38 提交。

菜單(Menu)
前面曾經(jīng)簡單提到過Drupal的菜單, 今天稍微深入來探討一下. 菜單能用來顯示導航信息, 我們安裝的系統(tǒng), 默認安裝有3個菜單, 讓我們查看一下數(shù)據(jù)庫吧, 以menu_開頭的總共有三張表: menu_custom, menu_links, menu_router. 其中menu_custom表存放菜單定義信息, 但想知道他們都是由哪個模塊定義的麼? 別忘記了菜單如果要顯示就是區(qū)塊哦, 打開區(qū)塊表(blocks)看看吧. Here it is! 用戶模塊(User Module)定義了Navigation菜單(沒看數(shù)據(jù)庫我以為是系統(tǒng)模塊(System Module)定義的呢), 菜單模塊(Menu Module)定義了Primary linksSecondary links兩個空菜單. 所以從表現(xiàn)層來看, 一個菜單就對應一個區(qū)塊(Block), 它被放置在頁面的某個區(qū)域(Region)來顯示給用戶進行導航.
其實Drupal的菜單機制不僅要能把導航顯示給用戶, 更重要的是在用戶點擊這些導航的時候, 能夠準確快速定位到相應的業(yè)務邏輯. 有人會問, 難道這也是個問題嗎? 要知道導航其實都對應他們具體的URI, 而傳統(tǒng)的URI的定位是先按目錄結構找處理文件, 然后根據(jù)Request參數(shù)對應業(yè)務邏輯,同時還要在業(yè)務邏輯中判斷用戶權限; 而Drupal有一套自己的內部路徑, 它是基于模塊化構建的, 與目錄結構一點關系也沒有了, 所以必須要有一套機制能在URI和業(yè)務邏輯間進行映射, 而Drupal的菜單機制就是完成這項工作的, 用戶點擊菜單項鏈接時, Drupal解析出內部路徑, 并根據(jù)內部路徑找到對應的業(yè)務邏輯, 并再完成判斷權限后轉交給業(yè)務邏輯進行處理, 這個過程Drupal稱之為分發(fā).
Drupal核心框架中的菜單api(includes/menu.inc文件)實現(xiàn)了上述功能, 它成功地解決了動態(tài)URL路徑到具體執(zhí)行函數(shù)間映射, 對用戶屏蔽了系統(tǒng)預定義的Request參數(shù)的復雜處理, 在路徑和功能建立了必由之路. 啥也別說了, 看看分發(fā)函數(shù)的實現(xiàn):

<?php
>
function
menu_execute_active_handler($path = NULL) {
  if (
_menu_site_is_offline()) {
    return
MENU_SITE_OFFLINE;
  }
  if (
variable_get(‘menu_rebuild_needed‘, FALSE)) {
   
menu_rebuild();
  }
  if (
$router_item = menu_get_item($path)) {
    if (
$router_item[‘a(chǎn)ccess‘]) {
      if (
$router_item[‘file‘]) {
        require_once(
$router_item[‘file‘]);
      }
      return <
strong>call_user_func_array($router_item[‘page_callback‘], $router_item[‘page_arguments‘]);</strong>
    }
    else {
      return
MENU_ACCESS_DENIED;
    }
  }
  return
MENU_NOT_FOUND;
}
?>

用戶URL請求到達后, Drupal先進行Bootstrap初始化, 然后調用分發(fā)函數(shù)menu_execute_active_handler, 該函數(shù)根據(jù)解析出的內部路徑, 在系統(tǒng)構建出的菜單路由表中查找, 如果找到則判斷可訪問權限, 然后調用路由表中對應路徑注冊的Pange_callback回調函數(shù), 這樣就完成一個URL請求到具體頁面邏輯的過程. 流程非常簡單清晰, 學過計算機原理, 熟悉中斷調用的對這流程應該都非常熟悉.

菜單路由(Menu Router)
Drupal系統(tǒng)主要依據(jù)menu_router表構建系統(tǒng)菜單路由, 而menu_router表的內容則是基于各模塊的hook_menu鉤子來獲得, 這個鉤子較少被調用, 一般都在模塊初始化或其他菜單需要重建的情況. 下面我們選一段Book模塊的menu鉤子代碼來看看:

<?php
function book_menu() {
 
$items = array();
 
$items[‘a(chǎn)dmin/content/book/%node‘] = array(              
   
‘title‘ => ‘Re-order book pages and change titles‘,
   
‘page callback‘ => ‘drupal_get_form‘,
   
‘page arguments‘ => array(‘book_admin_edit‘, 3),
   
‘a(chǎn)ccess callback‘ => ‘_book_outline_access‘,
   
‘a(chǎn)ccess arguments‘ => array(3),
   
‘type‘ => MENU_CALLBACK,
   
‘file‘ => ‘book.admin.inc‘,
  );
}
?>

book模塊所定義的所有菜單路由表由一個二維數(shù)組表示, 其中每一項為一個菜單路由, 下標即為該路由的入口路徑, 這里為‘a(chǎn)dmin/content/book/%node‘. 菜單路由項的各屬性看命名已經(jīng)比較清晰了, 想了解可以參考Drupal.
我們看上面用的路徑中包含一段‘%node‘, 對了這是使用了通配符, 比如你訪問admin/content/book/7的時候, 會自動把node7裝載進來, 太多細節(jié), 就此打住.

菜單項(Menu Item)
保存在menu _links表中, 定義了每個條目的名字, 條目間父子關系, 對應路徑, 所屬模塊等等很多屬性, 它應不像菜單路由項一樣隱藏在背后干活, 它是可見的; 同時由于有通配符的存在, 它與菜單路由項并不是一一對應關系. (比較奇怪的是默認的Navigation菜單是用戶模塊創(chuàng)建的, 但它里面的所有菜單項卻是系統(tǒng)模塊定義的.) 既然router表的數(shù)據(jù)從鉤子函數(shù)而來, 那link表是否也有對應的鉤子呢, 實際上菜單項是由菜單模塊(Menu Moudle)進行管理, 通過GUI界面直接配置, 當然菜單API也有對應接口,比如menu_link_save(). ( 實在不行你直接寫數(shù)據(jù)庫也行, 那不就是hack菜單模塊了麼)

Drupal6.x增加了兩個alter鉤子函數(shù)對應這兩張表, 它們是hook_menu_alter()<--->menu_router, hook_menu_link_alter()<--->menu_links, 它們主要處理內容變化時的處理邏輯, 由Drupal_alter()函數(shù)調用, 看代碼注釋說這個函數(shù)非常Ugly, 要在7中把它解決掉. 頭暈了一天, 今天也沒有心思再看下去了.

總結:
現(xiàn)在我們有點明白Drupal的菜單機制了吧, 它主要由菜單api和菜單模塊組成, 提供一種框架, 使得其他功能模塊能過注冊菜單路由項, 并在分發(fā)過程中, 通過該菜單路由表完成用戶頁面請求(具體URL)到功能模塊業(yè)務邏輯的映射. 當然Drupal的菜單機制還有很多復雜特性, 來日方長, 有空繼續(xù)鉆研.

另:有一點不明白的是menu_router為啥要用鉤子函數(shù), 不能直接用初始數(shù)據(jù)庫腳本麼, 不過我也沒研究過安裝過程, 似乎好像沒有一個地方用了數(shù)據(jù)庫腳本, 有人清楚這一塊麼?

    本站是提供個人知識管理的網(wǎng)絡存儲空間,,所有內容均由用戶發(fā)布,,不代表本站觀點。請注意甄別內容中的聯(lián)系方式,、誘導購買等信息,,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,,請點擊一鍵舉報,。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多