雲客Drupal8源碼分析之幫助系統help

一個系統要是沒有幫助信息那麼會給使用者帶來困惑, drupal除了官方網站上面有各種詳盡的文檔介紹外,還在系統內部內置了幫助系統來提供引導信息,爲使用者考慮的很全面,內置幫助系統是由幫助模塊來完成的,她通過三種方式向用戶提供在線幫助:幫助塊、系統幫助主頁、模塊幫助主頁。

幫助塊:
幫助模塊提供了一個塊:
\Drupal\help\Plugin\Block\HelpBlock
這是一個很簡單的塊Block(關於塊更多請見本系列塊主題),稱爲幫助塊,但功能強大靈活,只要頁面放置了該塊,任意模塊就可以通過她來顯示幫助信息,在該塊內部實際上是執行了 “help” 鉤子,從鉤子中收集幫助信息,這意味着任意模塊可以通過help鉤子向任意放置了幫助塊的頁面添加幫助信息,鉤子如下:

function hook_help($route_name,  $route_match)
{
    return ;
}

參數$route_name是被請求頁面的路由名(字符串值),但有一個例外見下文的模塊幫助主頁
參數$route_match是被請求頁面的路由匹配器,也就是\Drupal::service("current_route_match");
在鉤子函數中返回任意非真值時將忽略該鉤子,她應該返回渲染數組或者一個字符串(也可以是能當做字符串使用的對象,如\Drupal\Core\Render\Markup),返回值處理如下:
$build[] = is_array($help) ? $help : ['#markup' => $help];
通常模塊在實現該鉤子時需要在內部依據路由名進行判斷,以便只在目標頁面提供幫助信息,否則提供的幫助信息將顯示在所有放置了幫助塊的頁面中,這是不合理的,如果路由名相同但頁面內容不同時,需要根據路由匹配器提供的信息做進一步判斷。
注意:如果請求發生意外時幫助信息將不起作用,這裏所指的意外並不是指異常,而是以下表達式爲真:
$request->attributes->has('exception')爲真,比如403或404響應

系統幫助主頁:
也就是點擊後臺“管理>幫助”時打開的頁面,在這裏系統集中提供了所有幫助信息及其入口,該頁面的路由定義如下:

help.main:
  path: '/admin/help'
  defaults:
    _controller: '\Drupal\help\Controller\HelpController::helpMain'
    _title: 'Help'
  requirements:
    _permission: 'access administration pages'

模塊可以向該頁面添加內容,該頁面由幫助塊以及幫助節section構成,幫助塊上文已經講了,該頁面的“Getting Started”段落就是由help模塊的鉤子函數help_help提供的,其他段落由幫助節提供,默認有兩個幫助節:“Module overviews”和“Tours”,她們分別由help模塊和tour模塊提供,其他模塊也可以通過提供幫助節的方式向該頁面添加內容,幫助節是由插件機制實現的,一個幫助節就是一個插件,以上控制器依據幫助節插件返回的內容構造用於顯示的渲染數組。

幫助節插件管理器:
用於收集和管理系統中所有的幫助節插件,模塊通過幫助節插件向系統幫助主頁提供內容
服務id:plugin.manager.help_section
獲取方法:\Drupal::service("plugin.manager.help_section ");
類:Drupal\help\HelpSectionManager
插件目錄:Plugin/HelpSection
定義修改鉤子:help_section_info
幫助節插件接口:\Drupal\help\HelpSectionPluginInterface

一個幫助節由三部分組成,在接口中分別對應三個方法:

標題:
對應系統幫助主頁的段落標題,由getTitle()返回,返回值可以是字符串或渲染數組
描述:
對應系統幫助主頁的段落描述,由getDescription()返回,返回值可以是字符串或渲染數組
主題鏈接:
一些超鏈接,可以讓用戶方便導航到對應頁面,由listTopics()方法返回,返回值是一個數組,數組元素可以是Link對象也可以是一個渲染數組,後者允許更多控制

在自定義幫助節插件時可以繼承幫助節基類:
\Drupal\help\Plugin\HelpSection\HelpSectionPluginBase
繼承該基類後就可以把標題和描述放置到插件釋文中,只需要根據情況實現listTopics()方法即可
如果需要對幫助節的內容進行權限控制,那麼可以在插件釋文中指定permission屬性,其值是一個權限字符串,幫助節插件轉化爲渲染數組的邏輯在以下方法中實現:
\Drupal\help\Controller\HelpController::helpMain


模塊幫助主頁:
help模塊向系統幫助主頁提供了一個模塊概覽幫助節,在這個節中用戶可以點擊鏈接達到模塊的幫助主頁,模塊幫助主頁的內容是由其實現的help鉤子提供的,如果模塊沒有實現help鉤子將沒有幫助主頁,在模塊概覽幫助節中也不會出現到達鏈接,用於顯示模塊幫助主頁的路由定義如下:

help.page:
  path: '/admin/help/{name}'
  defaults:
    _controller: '\Drupal\help\Controller\HelpController::helpPage'
    _title: 'Help'
  requirements:
    _permission: 'access administration pages'

注意:前文講了塊中的幫助信息也是由help鉤子提供,該鉤子的第一個參數名是路由名,但是在模塊幫助主頁調用help鉤子時傳遞的是虛擬的路由名,並不真實存在於系統中,格式如下:
"help.page.模塊名"
在help鉤子中如果發現路由名是這個那麼說明應該提供模塊幫助主頁的幫助信息。

補充:
1、官方標準推薦參考:
幫助消息推薦標準:
https://www.drupal.org/node/632280#description
界面文本推薦標準:
https://www.drupal.org/node/604342
2、幫助模塊只提供了以上三種類型的幫助,模塊或主題的描述幫助來自info文件,和幫助模塊無關,表單等處的幫助內容也和幫助模塊無關

 

我是雲客,【雲遊天下,做客四方】,微信號:php-world,歡迎轉載,但須註明出處,討論請加qq羣203286137

 

 

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