Moodle插件开发基础
Moodle Plugin Development Basics
前言
本文是我翻譯并整理Moodle官方插件開發(fā)基礎(chǔ)教程完成的,包含了每章的教學內(nèi)容以及Quiz答案,一些我在學習中覺得翻譯不妥的地方都使用了原文或進行了原文批注。由于我自己還在學習,所以仍在持續(xù)更新中。
整理不易,如有錯誤,還請包涵ww。
Modularity in Moodle
在Moodle模塊化Moodle中的“M”代表“模塊化”。大多數(shù)用戶直接與之交互的特性都是通過獨立的模塊實現(xiàn)的,這些模塊在Moodle中通常被稱為插件。下載后,Moodle已經(jīng)提供了許多標準插件。默認情況下,這些都是Moodle安裝的一部分。甚至更多的插件可以作為附加插件安裝。附加插件的官方存儲庫是Moodle plugins目錄。那里的插件由獨立的社區(qū)貢獻者維護。在文件系統(tǒng)上,標準插件幾乎占據(jù)了Moodle安裝的一半。另一半由所謂的核心子系統(tǒng)組成。這些子系統(tǒng)提供了插件使用的核心api
Plugin Types
插件類型Moodle中有許多插件類型,每一種都專注于特定的功能領(lǐng)域。每種插件類型都有自己的特性。了解各種插件類型的目的、可能性和限制是很重要的,這樣你就可以選擇最合適的類型來實現(xiàn)所要求的特性。所有給定類型的插件都安裝在一個公共父目錄中的單獨目錄中。例如,每個/blocks/*目錄都是一個特定的插件,它們都是Block類型的一個插件不能有一種以上的類型。在Moodle中,每種插件類型都有其獨特的安裝位置。
.1 Activity modules
活動模塊是Moodle中必不可少的插件。它們代表著學習在課程中發(fā)生的活動。教師通過增加活動模塊的實例(如測驗、作業(yè)、論壇或書籍)來創(chuàng)建課程的主要內(nèi)容例如,您當前正在閱讀的這個特定文本是Book活動模塊提供的HTML頁面。有些模塊,比如Books、url或Pages,在用戶界面中被稱為資源。活動模塊通常以鏈接的形式顯示在主課程頁面的大綱中。
活動模塊的共同特性
- 分級 - 活動模塊可以分級。Gradebook API提供了在課程成績簿中為活動模塊實例創(chuàng)建成績項的方法;
- 完成 - 活動和資源可以通過Activity completion API標記為完成,允許課程進度。跟蹤每一個學生;
- 備份和恢復 - 活動和資源可以包含在課程備份中,之后通過Backup API進行恢復;
- 條件訪問 - Availability API允許基于各種標準控制活動模塊實例的訪問和可見性。
.2 Blocks
Blocks塊是內(nèi)容項目,可以添加到左,右或中心欄的任何頁面在Moodle。塊可能出現(xiàn)的區(qū)域由主題布局控制。塊可以向用戶顯示有用的信息,如最近的課程活動、即將到來的日歷事件或課程列表。
Blocks can also be used on the Dashboard.
塊的常見特性
- 跨站點顯示 - 塊可以配置為顯示在整個站點的不同頁面,例如在每個頁面,僅在測試嘗試頁面等
- 備份和恢復 - 類似活動模塊,塊可以包括在課程備份。
- 可配置的 - 塊實例可以配置。自定義字段可以添加到塊配置表單中。塊通常比活動模塊更容易實現(xiàn)。
.3 Themes
Moodle擁有強大的主題,可以通過使用HTML和CSS實現(xiàn)各種效果。主題定義了Moodle站點的外觀和感覺
主題的共同特征
- 不僅是CSS - 除了提供自己的層疊樣式表(CSS)外,定制主題還可以改變生成的HTML頁面許多部分的整體布局
- 繼承 - 主題可以定義它的父主題,其中一些屬性是隱式繼承的。
.4 Authentication
身份驗證插件使用鉤子(hooks)來增強或替換部分用戶身份驗證流。標準的身份驗證方法包括根據(jù)內(nèi)部存儲的密碼、LDAP或OAuth2提供商(如谷歌或Facebook)進行身份驗證。
.5 Enrolment
注冊插件控制誰被注冊到課程中,以及他們在那里扮演什么角色(因此也就有權(quán)限)。
課程中創(chuàng)建的注冊插件可以有多個實例,通常每個實例都有自己的配置。
注冊插件的共同特點
- 角色 - 注冊插件通常負責在給定的課程中分配一個特定的角色,例如學生或老師。被分配的角色通過定義的功能給用戶某些權(quán)限。
.6 Course formats
課程格式?jīng)Q定了課程主頁的布局。教師可以在課程設(shè)置表中指定所選擇的課程格式。
課程格式的常見功能
- 導航 - 課程格式還負責在課程內(nèi)部構(gòu)建導航樹,然后顯示在面包屑導航小部件中。
- 章節(jié) - 課程格式可以將課程內(nèi)容組織成章節(jié)。課程部分是一個核心層次的概念,每個課程格式都可以以自己的方式解釋和使用。
- 備份和恢復 - 課程格式數(shù)據(jù)包含在課程備份中,可以在以后恢復。
.7 Admin tools
管理工具為各種站點管理和維護任務提供了有用的工具。管理員和管理人員通常可以通過站點管理樹菜單訪問它們。
不管它們的名字可能暗示什么,管理工具并不需要只被站點管理員使用。學習計劃、數(shù)據(jù)隱私和用戶參觀(User tours)等功能實際上是由管理工具插件提供的,并為非管理用戶(如學生)提供功能。
.8 Local plugins
本地插件用于實現(xiàn)特定于站點或機構(gòu)的功能。它們被設(shè)計成一種通用的插件類型,以一種干凈和可維護的方式用于各種本地定制。通常情況下,它們甚至不應該被公開分發(fā)和分享本地插件也經(jīng)常被用于那些不適合任何其他標準插件類型的特性。例如,整個Moodle plugins目錄是作為一個安裝在Moodle站點上的本地插件來實現(xiàn)的。
本地插件的特性
- 導航 - 一個本地插件可以將新項目注入到站點導航和管理樹中,或者改變現(xiàn)有的導航。
- 自定義首頁 - 一個本地插件可以用來提供一個自定義網(wǎng)站首頁,利用$CFG->customfrontpageinclude配置變量
- 自定義web服務功能 - 本地插件是實現(xiàn)可通過web服務層公開的自定義外部功能的優(yōu)雅解決方案。
.9 Other plugin types
其他插件類型請參閱開發(fā)人員文檔中的插件類型頁面,以獲得支持類型的廣泛列表。其他常用的自定義插件類型包括
- Reports
- Text filters
- Atto editor buttons
和其他類型。
Quiz
Plugin floder and its contents
- The location of the plugin folder within the Moodle source code tree;
- The structure of the plugin folder;
- Some common files that all plugin types use;
- The importance of following the Moodle coding style and the usage of some automatic checking tools.
.1 Plugin floder lacation
每個Moodle插件都安裝在Moodle源代碼樹中自己的文件夾中。文件夾的位置取決于插件類型和插件名稱。所有相同類型的插件都作為一個公共父目錄中的子文件夾安裝。這個插件類型的父目錄的路徑定義在lib/components.json文件中。也可以在dev docs Plugin types中找到。
除了出現(xiàn)在用戶界面上的可讀的插件名(如“分配活動”)外,每個插件都有自己的系統(tǒng)插件名。這是包含該特定插件的所有文件的文件夾的名稱。
EXAMPLE
任務分配是一個活動模塊。所有活動模塊都安裝在Moodle源代碼樹的mod父文件夾中的子文件夾中。賦值的插件名是assign。所以它在Moodle源代碼中的完整位置是/mod/assign。
因此,不能同時安裝兩個相同類型和相同插件名的插件。可以有兩個文件夾名稱相同的插件,只要它們是不同類型的——因此安裝在不同的父文件夾中
.2 Full component name
每個插件類型都定義了一個簡短的系統(tǒng)名稱。對于Activity modules,它是mod。對于Blocks,它是block。對于Question types,它是qtype,等等。這些簡短的名稱定義在lib/components.json文件中。也可以在dev docs Plugin types中找到。
這允許每個安裝的Moodle插件都有一個唯一的標識符,由插件類型名(plugin type name)和插件文件夾名(plugin folder name)組成。用下劃線符號隔開,這兩個組成了所謂的完整組件名(Moodle開發(fā)人員非正式地稱之為frankenstyle)。
插件的完整組件名稱(frankenstyle)在Moodle PHP代碼中扮演著重要的角色。說明:
- 被用作插件在全局命名空間中創(chuàng)建的函數(shù)和類的前綴,以避免與其他插件沖突。
- 對于有命名空間的類,它被用作命名空間的第一個元素。
- 所有由插件創(chuàng)建的數(shù)據(jù)庫表都應該使用插件的組件名作為名稱前綴。
關(guān)于這個概念及其在Moodle中的用法的更多細節(jié),請參閱開發(fā)文檔Frankenstyle。
.3 Common plugin files
插件文件夾中的文件實現(xiàn)了插件的邏輯,以及插件和Moodle核心之間所需的接口。每種插件類型都有自己的細節(jié)和要求。在所有插件類型中,仍然有許多文件以相同的方式工作。
在這些文件中,最重要的是:
- version.php它提供了一些關(guān)于插件的元數(shù)據(jù),如版本號、依賴關(guān)系或成熟度級別;
- lang/en/{plugintype}_{pluginname}.php定義了插件中使用的英文字符串;
- db/install.xml該xml定義了插件的數(shù)據(jù)庫表。
和許多其他這些常見文件。
完整列表請參見dev docs Plugin files。
.4 Moodle coding style
? 入鄉(xiāng)隨俗.jpg
多年來,Moodle開發(fā)人員已經(jīng)就如何格式化和組織代碼的某些風格和指導方針達成了一致。在Moodle核心和插件中使用相同的風格有助于我們檢查和學習彼此的代碼。這可能不是你個人喜歡的風格。不過,在使用Moodle進行開發(fā)時,請從最開始就堅持使用它。
- 通過編碼風格,熟悉指導方針
- 許多PHP編輯器和ide支持基于指定規(guī)則和設(shè)置的自動高亮顯示和校正。有關(guān)設(shè)置環(huán)境的詳細說明,請參閱Developer工具
- 有兩個插件Code-checker和Moodle PHPdoc check,您可以添加到您的開發(fā)安裝。然后,你可以針對你的插件代碼在本地運行這些插件,從推薦的編碼風格中獲得所有變化的報告
- 最后,一旦你使用Git來跟蹤你所維護的插件的變化,你就可以set up the Travis CI來運行這些和其他連續(xù)的自動檢查。
Quiz
Request handling
In this tutorial we explore:
- How incoming HTTP requests are handled by the PHP scripts in Moodle.
- How to read and sanitise the value of submitted data such as GET request arguments.
- How to easily generate a URL pointing to a script in Moodle.
.1 Page Controller pattern
現(xiàn)代PHP框架提供了自己的處理和路由傳入HTTP請求并生成響應的方法。Moodle開發(fā)在這些框架出現(xiàn)之前就已經(jīng)開始了,它使用了典型的傳統(tǒng)方法,即服務器端腳本生成動態(tài)網(wǎng)頁。
從體系結(jié)構(gòu)的角度來看,Moodle可以被看作是實現(xiàn)Page Controller軟件設(shè)計模式。
“[…] Page Controller is an object (in the broader sense of the term, not only an instance of a class but every kind of item) kept on the server, which is called upon a certain endpoint is the target of a HTTP request. For example, plain old PHP scripts, which you call with URLs like /index.php, /list.php or /folder/member.php?id=42 are Page Controllers.”
Source: Practical PHP Patterns: Page Controller by Giorgio Sironi, July 14, 2010, Web Dev Zone
For more information please see for example Patterns of Enterprise Application Architecture Catalog by Martin Fowler et al.
.2 PHP scripts in Moodle
在Moodle中有兩種主要的PHP腳本:
Request handlers(請求處理程序):
這些是頁面控制器直接被用戶的web瀏覽器訪問。這些腳本是HTTP請求的端點,它們通常打印生成的HTML并執(zhí)行其他操作。
EXAMPLE: 腳本/課程/視圖。訪問/course/view.php可以顯示課程主頁,也可以處理一些與課程相關(guān)的操作,比如移動部分moving sections。
Libraries(庫):
這些腳本不應該通過HTTP請求直接訪問。它們由其他腳本加載,并提供實現(xiàn)所有邏輯的庫函數(shù)和類定義。
EXAMPLE: 課程視圖腳本加載另一個庫腳本/lib/completionlib.php,它提供了活動完成api相關(guān)的函數(shù)。
.2.1 Request handlers
Request handlers process the incoming HTTP request. In the vast majority of cases, this will either be a GET or a POST request. All request handlers must start by including the main config.php script from the root of the Moodle installation.
require(__DIR__ . '/../../config.php');文件的特定路徑將取決于請求處理程序腳本在Moodle文件tre?中的深度。
主配置文件定義了一些基本變量,比如數(shù)據(jù)庫連接細節(jié)或Moodle數(shù)據(jù)文件夾的位置。config.php然后加載lib/setup.php文件來設(shè)置執(zhí)行環(huán)境:
- 加載所有必需的核心庫。
- 很多東西,比如數(shù)據(jù)庫連接,會話(session),當前課程,主題和語言都被初始化了。
請參閱開發(fā)文檔What happens when you require config.php獲取更多安裝過程的詳細信息。
請求處理程序通常在開始時執(zhí)行的其他事情是:
-
讀取并清除所有輸入?yún)?shù)
-
執(zhí)行訪問控制檢查
- 如果只允許通過身份驗證的用戶訪問腳本特性,請確保他們已登錄。
- 如果需要特殊權(quán)限,請確保用戶擁有該權(quán)限。
-
如果請求即將觸發(fā)數(shù)據(jù)庫中的更改…
- 確認已提交有效的會話密鑰令牌(sesskey)。
- 一旦操作被執(zhí)行,重定向用戶到一個新的URL,可以安全地從瀏覽器重新加載,而無需重新觸發(fā)操作。
.2.2 Libraries
庫不應該被瀏覽器直接訪問。它們只能由其他腳本加載 - 要么是請求處理程序,要么是其他庫。
傳統(tǒng)的庫文件應該以下面一行開始:
defined('MOODLE_INTERNAL') || die();這是為了停止腳本的執(zhí)行,如果庫沒有被其他腳本加載。常量MOODLE_INTERNAL是在執(zhí)行環(huán)境設(shè)置期間定義的。換句話說,這是為了確保config.php文件(因此還有l(wèi)ib/setup.php)已經(jīng)加載。
請參閱Require/include section of the Coding style,了解如何從另一個文件加載庫。
.2.3 Class files
類文件是Moodle中庫文件的子集,具有一些特殊的規(guī)則。
- 它們位于classes/文件夾中。
- 它們支持自動加載,不應該通過顯式的require_once()調(diào)用來加載。
- 它們的命名有一定的規(guī)則,在開發(fā)文檔中描述了自動類加載(Automatic class loading)。
- 因為這些文件只定義了一個沒有副作用的類,所以它們不應該有MOODLE_INTERNAL檢查。
當前的指南建議對所有新庫代碼使用有命名空間的類。然而,你仍然會在Moodle核心中看到很多傳統(tǒng)的庫文件,以及貢獻的插件。
.3 User input
請求處理程序負責讀取和處理HTTP參數(shù)。出于安全原因,Moodle插件不應該訪問PHP請求超全局變量,如$_GET、$_POST或$_REQUEST。相反,Moodle core提供了一些輔助函數(shù),如required_param()或optional_param(),它們應該用來讀取提交的參數(shù)的值。
來自用戶的所有輸入?yún)?shù)都必須被視為潛在的惡意,必須始終進行消毒和驗證。為此,需要指定適當?shù)膮?shù)類型。該類型由PARAM_*常量之一指定。最常用的類型有:
- PARAM_INT聲明該參數(shù)應被視為一個整數(shù);
- PARAM_ALPHA是用于包含英文ASCIl字母[a - z, A - Z]的短字符串;
- PARAM_BOOL將輸入值如0、1、“yes”、“no”、"true"或"off"轉(zhuǎn)換為布爾變量;
- PARAM_NOTAGS從提交的文本中剝離所有的HTML標簽;
- PARAM_TEXT用于更長的純文本。去掉了所有的HTML標簽,只保留了對標準的多語言內(nèi)容過濾器(Multi-language content filter)的支持。
請參閱lib/moodlelib.php的源代碼,了解更多PARAM類型常量及其內(nèi)聯(lián)文檔。
.4 URLs and redirects
Moodle不需要安裝在web服務器的HTML文檔文件夾的根目錄下。許多機構(gòu)都將他們的Moodle安裝在類似于www.ourschool/lms/等子文件夾中。當我們需要Moodle腳本的URL時,我們需要考慮配置變量wwwroot。此外,Moodle支持admin/文件夾的重命名,以避免與一些網(wǎng)絡(luò)托管平臺的沖突。
在Moodle中使用URLs的便捷方式是使用moodle_url類。
- 它負責在URL路徑前加上定義的主機(host)和根目錄(root);
- 它負責重命名的管理目錄;
- 它使得定義要與請求一起提交的HTTP參數(shù)變得很容易。
moodle_url類實例可以傳遞給Moodle需要URL的任何函數(shù)。核心函數(shù)redirect()就是這樣一個函數(shù)的例子。該類還實現(xiàn)了PHP魔術(shù)方法__toString(),因此可以將其視為字符串(String)。
EXAMPLE 顯示一個指向給定課程的鏈接:
$courseid = required_param('courseid', PARAM_INT); $courseviewurl = new moodle_url('/course/view.php', ['id' => $courseid]); echo '<a href="' . $courseviewurl . '">Back to the course</a>';Quiz
Localisation
In this tutorial we explore:
- Where and how text strings can be defined in plugins.
- How translations can be distributed together with the plugin.
- How to format date, time and decimal numbers in the user’s language.
.1 Text strings
代碼本身不應該有硬編碼的文本。相反,Moodle使用了一種內(nèi)建機制,允許我們在一個專用文件中定義所有文本字符串。所有應該出現(xiàn)在用戶界面中的文本都在插件的字符串文件中定義了一個簡單的PHP關(guān)聯(lián)數(shù)組。英語字符串必須始終存在,它們可以作為翻譯成其他語言的源。
EXAMPLE The file mod/quiz/lang/en/quiz.php provides all texts for the Quiz activity module. Among others there is a line:
$string['editingquiz'] = 'Editing quiz';where the string editingquiz is defined. To display that string somewhere in the user interface, the get_string() core function is used:
echo get_string('editingquiz', 'mod_quiz');通常,在Moodle plugins目錄中共享的插件應該只提供英文字符串。它們可以由Moodle社區(qū)翻譯,翻譯包含在Moodle的標準語言包中。
如果你正在開發(fā)一個不打算公開分享的插件,你可以自己提供和維護翻譯。
- 您仍然應該包含英語作為文本字符串的主要來源。
- 將translations添加到插件的lang/xy/文件夾中,其中xy是Moodle語言包代碼(Moodle language pack code)。文件的格式與英文文件的格式完全一致。
除了插件之外,核心子系統(tǒng)還在語言文件中定義了它們的字符串。它們位于Moodle安裝目錄中的lang/en/文件夾中。
關(guān)于如何處理文本字符串及其翻譯的更多信息,請參閱開發(fā)文檔String APl。
.2 Date and time
Moodle在內(nèi)部將所有日期和時間存儲為Unix時間戳(Unix timestamps),時間戳基本上是1970年1月1日以來的秒數(shù)。
要以用戶自己的語言格式顯示Unix時間戳(與時區(qū)無關(guān)),可以使用Time APl提供的函數(shù)。
最常見的是,您將使用userdate()函數(shù)。
$now = time(); echo userdate($now);要手動指定顯示格式,請使用core_langconfig組件中定義的strftime formatting strings之一。例如,要只顯示日期而不顯示時間,請使用:
$date = new DateTime("tomorrow", core_date::get_user_timezone_object()); $date->setTime(0, 0, 0); echo userdate($date->getTimestamp(), get_string('strftimedatefullshort', 'core_langconfig'));.3 Decimal numbers
不同的語言在顯示小數(shù)時使用不同的小數(shù)分隔符。使用format_float()核心函數(shù)來向用戶很好地顯示十進制數(shù)。實際計算時不要使用此函數(shù)!
EXAMPLE 在Moodle中顯示的一個典型的十進制數(shù)可以是學生的成績。以小數(shù)點后兩位的精度顯示:
$grade = 20.00 / 3; echo format_float($grade, 2);Quiz
Moodle page layout and output
In this tutorial we explore:
- How the Page API is used to describe pages and their context within a Moodle site.
- How to turn our custom request handling script into a Moodle page.
- How to format the output text.
.1 Moodle pages
任何Moodle網(wǎng)站上的所有頁面都有一些共同的功能,如用戶菜單、導航元素或頁腳。為了讓這些工作正常進行,每個頁面都需要知道一些關(guān)于自己的信息,例如:
- 什么地址應該被認為是頁面的URL?
- 什么文本應該顯示為page title和heading?
- 頁面應該采用什么布局,例如,是否應該為邊塊留出空間等?
當前顯示的頁面由moodle_page類(class)的一個實例表示,該實例可以作為$PAGE全局變量用于請求處理腳本。開發(fā)文檔Page APl描述了類方法、它們的用途以及如何使用它們。
下面的頁面介紹了一些我們將在Hello world插件中使用的常用方法。
.1.1 Page URL
每個頁面都應該有一個唯一的URL。這是應該用來返回到頁面的地址,例如,在編輯它的一個塊(block)之后。
$PAGE->set_url(new moodle_url('/local/helloworld/index.php));一旦設(shè)置了當前頁面的URL,我們就可以通過$PAGE->url屬性訪問它。
echo '<form method="get" action="'.$PAGE->url.'">';它還可以用作其他url的基礎(chǔ)。
$nextitemurl = new moodle_url($PAGE->url, ['item' => $nextitemid]);.1.2 Page context
我們必須指定當前頁面所屬的Moodle上下文。上下文將在本教程后面討論角色和權(quán)限時進行更深入的討論。出于我們插件的目的,我們將只使用top-level system context。
$PAGE->set_context(context_system::instance());可以通過PAGE->context屬性訪問為當前頁面設(shè)置的上下文(context)。
.1.3 Page title and heading
每個頁面都應該定義其標題。主題使用它作為頁面<head>部分內(nèi)的<title>標簽的值。HTML瀏覽器使用它作為顯示頁面的窗口或標簽的標題。
$PAGE->set_title(get_string('pluginname', 'local_helloworld'));要定義應顯示為頁面主標題的文本,請定義標題。
$PAGE->set_heading(get_string('hellouser', 'local_helloworld', $username));.1.4 Page layout
頁面布局布局描述了Moodle頁面的通用結(jié)構(gòu) - 是否有側(cè)邊塊區(qū)域,是否顯示導航欄,是否顯示頁腳等。所有支持的布局都定義在當前使用的主題或其父主題的theme/.../config.php文件中。常用的布局有base(默認),standard, course, frontpage, mydashboard 和 login。
在一些主題,如Classic,默認的基本布局不顯示側(cè)塊區(qū)域。因此,使用帶有側(cè)導航塊的標準布局來指定自定義腳本是很常見的。
$PAGE->set_pagelayout('standard');.2 Outputting the page HTML
一旦設(shè)置好頁面,輸出呈現(xiàn)機制就有足夠的信息來實際生成頁面的所有HTML。
要完成DOM初始化并開始輸出HTTP頭文件和實際的<html>內(nèi)容,調(diào)用
echo $OUTPUT->header();$OUTPUT是Moodle在設(shè)置過程中創(chuàng)建的一個有用的全局變量。關(guān)于Output APl的全部細節(jié)超出了本教程的范圍,但是現(xiàn)在,只要知道$OUTPUT是一個輸出呈現(xiàn)類的實例,它的目的是生成表示頁面及其上所有小部件的HTML,就足夠了。
要在頁面上打印頁腳,關(guān)閉</body>和</html>標簽,并完成輸出呈現(xiàn),調(diào)用
echo $OUTPUT->footer();.2.1 User submitted data
在將用戶提交的所有內(nèi)容作為頁面HTML的一部分顯示之前,必須仔細處理。如果內(nèi)容來自用戶,則絕不應該通過簡單的echo()調(diào)用來顯示它。下一章將描述將要使用的一些輔助函數(shù)。
- 安全原因 - 用戶輸入可能潛在地包含一些惡意內(nèi)容 - 有意或無意地提交。將這些內(nèi)容直接打印到頁面HTML源代碼將使站點容易受到跨站點腳本和其他安全威脅。
- 功能原因 - 為了確保Moodle的核心功能能夠正常工作 - 最顯著的是文本過濾或媒體文件嵌入 - 用戶提交的內(nèi)容必須在顯示在頁面上之前進行處理。
應該強調(diào)的是,用戶提交的內(nèi)容實際上包括了廣泛的數(shù)據(jù),包括HTTP查詢字符串(HTTP query string)、表單數(shù)據(jù)(form data)、用戶代理字符串(user-agent strings)、cookies、請求引用器(request referrer)等。
.2.2 Output helper functions
在將用戶數(shù)據(jù)包含到頁面的HTML源代碼中之前,需要調(diào)用一些輸出幫助函數(shù)來處理這些數(shù)據(jù)。
s() - 這是PHP原生htmlspecialchars()的包裝器。它應該用于我們不想解釋任何HTML的純文本。一個典型的例子可能是HTML標記屬性的值。
echo '<input type="text" name="uname" value="' . s($uname) . '">';format_string() - 顯示短字符串,不使用HTML格式和文本過濾。該字符串由所有配置為應用于網(wǎng)站管理中的“內(nèi)容和標題”(“Content and headings”)的過濾器處理。用于在課程主頁上顯示活動模塊名稱、分組和隊列名稱、課程名稱等文本。
echo format_string($course->name);format_text() - 這是用來顯示長格式的文本,應用了所有的filters。Moodle中的豐富文本,例如那些用默認文本編輯器創(chuàng)建的 - 通常已經(jīng)被格式化為HTML。但根據(jù)用戶的偏好,情況可能并非總是如此。因此,此函數(shù)首先將文本轉(zhuǎn)換為HTML并應用所有過濾器。由此產(chǎn)生的HTML是任何無效的不安全的部分被清除。通過這個函數(shù)刪除文本的一個典型例子是圖書資源中的一個章節(jié)或提交到論壇的一個帖子。
該函數(shù)接受$options參數(shù)來調(diào)優(yōu)預期的行為。例如,可以設(shè)置noclean標志來跳過HTML清理,這可以用于內(nèi)容只能來自可信用戶(如課程中的老師)的地方。
echo format_text($post->content, $post->contentformat, ['noclean' => true, 'context' => $context]);下面的流程圖可以提供一個粗略的指南,說明在何種情況下使用什么輔助函數(shù),這取決于一些決策。
- Rich text - 內(nèi)容應該支持富文本格式嗎?
- Filter - 是否應該應用文本過濾器?請注意,為了支持多語言內(nèi)容,需要過濾。
- User data - 文本是否包含用戶提交的數(shù)據(jù)?
- JavaScript - 內(nèi)聯(lián)的JavaScript應該被信任并保存在文本中嗎?
.2.3 HTML tags
Moodle附帶了一個高級的輸出呈現(xiàn)引擎,它鼓勵開發(fā)人員將PHP腳本中的邏輯處理與通過呈現(xiàn)器(renderers)和模板(templates)生成HTML表示分離開來。除了其他好處外,它允許主題通過覆蓋默認的呈現(xiàn)方法和模板來完全控制生成的HTML。
為了實現(xiàn)本教程演示插件的目的,我們可以使用一種更簡單的方法,直接從處理請求的PHP腳本生成HTML。
Moodle提供了一個名為html_writer的助手類,它提供了大量的靜態(tài)方法來從PHP腳本生成HTML。一些常用的方法是html_writer::link()或html_writer::img()。
EXAMPLE 為表單(form)<input>字段生成HTML。
echo html_writer::tag('input', '', ['type' => 'text','name' => 'username','placeholder' => get_string('typeyourname', 'local_helloworld'),]);Author: Lorain.
Completion time: ???
總結(jié)
以上是生活随笔為你收集整理的Moodle插件开发基础的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 瀑布流布局
- 下一篇: 【第六章】使用jQuery操作表单和表格