歡迎您光臨本站 註冊首頁

研究 Drupal V6,第 3 部分: 管理 Drupal

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  
您已經學習了 Drupal V6 的基礎知識,甚至還向一個 Drupal 站點添加了一些模塊。在這個 “研究 Drupal V6” 系列的最後一篇文章中,您將學習如何編寫和部署一個自定義模塊以創建一個小說內容類型。

在當今的世界中,每個事業單位都需要一個 Web 站點。Web 站點同時也是名片、宣傳冊、公文包、目錄、邀請函、年度報告和廣告。實際上,如果一個公司沒有 URL,在搜索引擎中沒有足夠的位置,那麼它註定會默默無聞。

然而,並不是所有的 Web 站點都需要相同的特性,而且,運營商的專業技術也不同。因此,一些內容管理系統(CMS)旨在簡單易用,而另一些則規模龐大、相當複雜。預算也不一樣,某個網站可能資金雄厚,能夠購買昂貴的商業應用程序;而另一個則囊中羞澀,對軟體的期望值不高。

儘管沒有 “正確的解決方案”,只有適合您的環境的解決方案,但許多網站還是選擇了相同的軟體:Drupal。Drupal 是開源、免費(的確完全免費)使用、易於啟動且可以廣泛擴展的軟體,這使其成為小型、大型、新興或有抱負的網站的理想選擇。目前有數百個(也可能是數千個)模塊 或擴展可用於定製 Drupal 站點,如果現有模塊不適合,編寫一個新模塊也並不費事。

本系列的 研究 Drupal V6,第 1 部分:簡介 展示了如何在一個類 UNIX® 的系統上安裝和啟動 Drupal V6 —— 這個流行包的最新版本。研究 Drupal V6,第 2 部分:管理 Drupal V6 展示了如何向一個 Drupal V6 站點添加模塊以集成新特性。本文展示如何編寫和部署一個自定義模塊來創建一個小說內容類型。

與 Drupal 本身一樣,自定義模塊使用 PHP 語言編寫,因此,熟悉這種編程語言、它的工具和庫肯定有所裨益。通常,模塊也會訪問底層資料庫,因此,關係資料庫和 SQL 方面的經驗也會對您有所幫助。

Drupal 模塊開發簡介

Drupal 內容模塊通常擴展標準 Drupal 節點,將補充欄位存儲在一個單獨的表中。例如,一個附件模塊可能在它自己的表中記錄一個文件的名稱、位置和大小,然後將該信息關聯到一個故事節點。內容模塊還利用 Drupal 用戶、角色和許可權子系統來實現和執行特權和持久首選項。圖 1 展示了內容模塊的邏輯結構。


圖 1. Drupal 內容模塊


開發一個 Drupal 內容模塊需要以下幾個步驟:

  1. 命名模塊。無論您是否計劃分發模塊,模塊名稱必須唯一,以免和其他模塊衝突。選擇一個簡短但描述性強的名稱。
  2. 創建一個單獨的目錄存儲模塊代碼和相關資源。一個模塊擁有元數據、一個安裝程序、代碼和幾個模板。所有這些資源都要收集到一個獨立的目錄中,這也有利於簡化分發和安裝。
  3. 編寫一個 .info 文件來識別模塊和模塊的目的。這個元數據定義先決條件、適當的模塊名稱和其他信息。
  4. 編寫模塊代碼,包括模塊安裝程序,一個數據輸入表單和一個呈現模板。
  5. 安裝、啟用和配置模塊。使用 第 2 部分 中介紹的技術安裝您的模塊。

Drupal 提供一個良好定義的界面來擴展它的核心特性。要創建一個模塊,必須執行 Drupal 稱其為鉤子(hook)的界面。例如,一個鉤子提供幫助,另一組鉤子使用您的模塊需要的表擴大 Drupal 資料庫,還有一組鉤子將您的模塊的特殊數據持久存儲於資料庫中。與上一版 Drupal(需要開發人員編寫 SQL 和 HTML)不同,Drupal V6 提供一些富 API 來定義自定義模式和描述自定義表單。這些 API 使用 PHP 和簡單的數據結構。但是,直接訪問資料庫的鉤子仍然使用 SQL 編寫。

另外,每個 Drupal 模塊都遵循一組嚴格的編碼慣例,以確保一致性並促進代碼共享和社區維護。為簡便起見,這裡故意省略了那些慣例。但有一個例外,不要使用一個結束 ?> 終止模塊代碼。如果您的 Drupal 日誌表明,文本已經在標準 HTTP 頭部前發送,則應從您的文件中刪除任何前導空白和拖尾 ?>。參見 參考資料 獲取完整的代碼標準列表。





構建 Flitter — 一種類似於 Twitter 的內容類型

為方便展示,我們創建一個模塊來記錄非常短的消息,比如在 Twitter 上交換的那些消息。每條消息應該有一個標題(就像每個 Drupal 節點一樣)和一個不超過 140 個字元的簡潔的句子。讓我們調用模塊 Flitter。要實現 Flitter,必須擴展 Drupal 資料庫,以便包含一個新的 Flitter 表;訪問 Flitter 數據的許可權,或 flit;編輯 flit 的表單;操作資料庫的代碼。

首先,為 Flitter 模塊創建一個目錄。根據慣例,該模塊應該包含在 $DRUPAL_ROOT/sites/all/modules/flitter 中,其中 $DRUPAL_ROOT 是您的 Drupal 站點的根目錄,比如 /var/www/drupal(目錄 DRUPAL_ROOT/modules 是 Drupal 的核心模塊的專用目錄)。

$ export DRUPAL_ROOT=/var/www/drupal  $ mkdir -p $DRUPAL_ROOT/sites/all/modules/flitter  

第一條命令設置一個幫助變數。mkdir -p 創建 Flitter 目錄和所有絕對路徑上缺少的中間目錄。

其次,在 $DRUPAL_ROOT/sites/all/modules/flitter/flitter.info 中創建模塊的元數據文件 flitter.info。這個文件的內容用於在模塊管理頁面中識別該模塊。這個文件是一個標準的 PHP.ini 文件,必須包含以下條目:name、description、core 和 php。

name          = "Flitter"   description   = "A custom content type to display very brief messages"  core          = 6.x   php           = 5.1   

name 和 description 是不言而喻的,確保用雙引號包圍它們的值。core 指定兼容的 Drupal 版本號。php 指定需要的 PHP 版本號。后兩個值用於防止模塊需求和系統功能不匹配。

下面,在 $DRUPAL_ROOT/sites/all/modules/flitter/flitter.module 中創建一個文件來存儲模塊代碼主體。要實現的第一個鉤子是 module_help(),其中 module 是您的模塊的名稱。在本例中,這個鉤子是 flitter_help()。這個鉤子提供關於 Flitter 模塊和它的設計用途的附加信息。

<?php  function flitter_help($path, $arg) {     if ($path == 'admin/help#flitter') {       $txt = 'A flitter is a very short message. '        . 'The title should clearly convey the topic, '        . 'and the message should convey an opinion, status, '        . 'event, or reference in 140 characters or less. ' ;      $replace = array();       return '<p>' . t($txt, $replace) . '</p>';    }  }     

圖 2 顯示模塊安裝后這個鉤子可能具有的外觀。flitter_help() 為該模塊的幫助頁面提供信息。


圖 2. module_help() 為模塊的幫助頁面提供信息


代碼最後一行中使用的函數 t() 由 Drupal 提供。具體而言,t() — translate 的簡寫 — 試圖將英語文本 $txt 翻譯為用戶偏好的語言。這裡,t() 試圖把英語幫助文本翻譯為用戶的母語。翻譯通過您定義的詞典執行。

t() 函數的第二個參數 — $replace — 用於用實際值替換文本中的佔位符。本例中沒有使用佔位符。但是,$txt 也有可能包含一個佔位符,比如一個 URL 縮寫服務的地址。

$txt = 'A flitter is a very short message. The title should clearly '    . 'convey the topic, and the message should convey an opinion, status, '    . 'event, or reference in 140 characters or less. Use !url to shorten '     . 'URLs.';  

在上面的代碼中,!url 是一個已命名佔位符。! 佔位符類型用一個字元串直接替換另一個字元串。(還有其他佔位符類型可用)。以下調用執行一個實際替換,使用 http://www.bit.ly 替換 !url: t($txt, array('!url' => 'http://www.bit.ly/'));。

下面繼續構建模塊。由於 Flitter 創建了一個新的內容類型,下一步必須定義一個新的資料庫表來持久存儲自定義 Flitter 數據,並將它的欄位和一個 Drupal 節點關聯起來。讓我們將一段 Flitter 數據稱為一個 flit。

為抽象化底層資料庫的具體數據並簡化模塊開發,Drupal V6 引入了一個 Schema API(參見 參考資料),以便使用純 PHP 關聯數組定義表。根據慣例,新的 Flitter 表的創建和刪除(卸載模塊時將刪除表)使用一組特別命名的鉤子在一個特殊的文件 flitter.install 中定義。清單 1 顯示了完整的 flitter.install。


清單 1. flitter.install
				  <?php  function flitter_install() {    drupal_install_schema('flitter');  }    function flitter_uninstall() {    drupal_uninstall_schema('flitter');   }    function flitter_schema() {    $schema['flitter'] = array(      'fields'      => array(        'vid'       => array(          'type'    => 'int',          'unsigned'=> TRUE,          'not null'=> TRUE,          'default' => 0),        'nid'       => array(          'type'    => 'int',          'unsigned'=> TRUE,          'not null'=> TRUE,          'default' => 0),        'message'   => array(          'type'    => 'varchar',          'length'  => 140,          'not null'=> TRUE,          'default' => '')),      'indexes'     => array(        'nid'       => array('nid')),      'primary key' => array('vid'));        return $schema;  }  

flitter_schema() 的代碼應該看起來似曾相識:它與您為定義欄位(但這裡稱為參數)而使用 SQL 編寫的代碼類似,因此這段代碼很容易轉換為支持您的 Drupal 網站的任意資料庫引擎需要的代碼。關聯數組 $schema['flitter'] 必須定義 fields、indexes 和 primary_key 的值,它們分別對應表的列,加速查詢的索引和表的主鍵。


[火星人 ] 研究 Drupal V6,第 3 部分: 管理 Drupal已經有544次圍觀

http://coctec.com/docs/linux/show-post-68717.html