Moodle開發筆記3-Filter開發
Moodle filters 是對修改來自 database 的 content 進行過濾修改後再輸出顯示。
一個例子是 moodle 自帶的 multimedia filter ,它能夠 detect references to video and audio files ,然後 replace them with a "mini-player" embedded in the content 。
Filter 的工作原理
Moodle
裡所有要輸出到
screen
的
text
都要經過
format_text
function
而且, text還會經過 filter_text function 的處理, 該函式會 apply all enabled filters to 傳過來的 text 。該函式返回的是 the result of all of these filters 。
下面講解如何開發一個簡單的 filter
1. create “learningisfunlink” folder ( 目錄名是你的 filter name) in ”moodle/filter” folder
2. create “filter.php” under ”learningisfunlink” folder
該
filter.php
只需要新增一個函式
”
learningisfunlink_filter
”
(
格式為
<?php
function learningisfunlink_filter($courseid, $text) {
return $text;
}
?>
3. (Optional) add language file ( language file詳見 block開發)
如果不使用 language file,那麼在 filter manage page裡顯示該 filter的 name就是 ”learningisfunlink ”,但如果我們的 lang/en_utf8/filter_learningisfunlink.php 裡新增下列的 code
$string['filtername'] = "Main website link";
那麼在 filter manage page裡該 filter name為 "Main website link "
4. 修改步驟 2 的 filter.php 的 learningisfunlink_filter函式 ,使得碰到 ” Learning is Fun” 的字眼就轉成 link 。
會用到 /lib/filterlib.php file 裡的 filterobject class and the filter_phrases function .
filterobject class 定義了一個 object 來包含所有 filter_phrases function 所要的 info :
· 要 filter 的 string
· the tag to start the replacement with
· the tag to end the replacement with
· whether to match case (optional)
· whether a full match is required (optional)
· any replacement text for the match
filter_phrases($text, $filterobjects) 函式是根據引數 $filterobjects ( it is an array )來處理第一個引數的 text ,然後返回處理後的 string 。
修改後的 learningisfunlink_filter函式 程式碼為
function learningisfunlink_filter($courseid, $text) {
//create filterobjects obj
$searchphrase = "learning is fun";
$starttag = "<a href=/"http://2fun2learn.org/">";
$endtag = "</a>";
$filterobjects = array();
$filterobjects[] = new filterobject($searchphrase, $starttag, $endtag);
// change any occurrence of the phrase "learning is fun" to a hyperlinked phrase
return filter_phrases($text, $filterobjects);
}
注意: filter 要先在 ”Site Administration Block -> Modules -> Filters -> Manage filters” 裡 activate 才可使用。
5. add configuration settings 。 我們希望能夠動態的設定要新增 link 的字串,而不是設死是 ” Learning is Fun” 。同時能夠動態設定 link 的 url 。因此我們就要使 filter 具有 configuration 的功能(這樣在 filter manage page 裡該 filter 就會 多一個 ”setting” link )。
1) 新增一個 filtersettings.php under ”learningisfunlink” folder 。當你建立了該檔案後,該 filter 在 manage page 裡馬上就會出現 ”setting” link
filtersettings.php會用到 $settings variable and admin_settingpage class
$settings 變數 是由 moodle幫我們建立的(在 /admin/settings/plugins.php裡建立 ),該變數是一個數組型別,它包含 class admin_settingpage的物件元素 。
那麼 我們的 filter configuration設定的東東,就會被 wrap into a admin_settingpage object,然後新增到變數 $settings裡
admin_setting_configtext 的構造方法為
admin_setting_configtext($name, $visiblename, $description, $defaultsetting,
$paramtype=PARAM_RAW, $size=null)
第一個引數最為關鍵,它相當於 key ,必須在 $settings 裡是唯一的。它的格式應該為 [module_type]_[module_name]_key 。例如該例中的 filter_learningisfunlink_phrase
因此修改後的 filtersettings.php 為:
<?php
$settings->add(new admin_setting_configtext('filter_learningisfunlink_phrase',
'Phrase', 'Phrase to hyperlink ', 'learning is fun '));
$settings->add(new admin_setting_configtext('filter_learningisfunlink_link',
'url', 'URL to link phrase to ', 'http://2fun.org'));
?>
對於上面的程式碼,當你進入該 filter 的 configuration page 時,就會有 2 個 textbox ,它們的 name 分別為“ filter_learningisfunlink_phrase ” and “ filter_learningisfunlink_link ”,當你 submit 時,這 2 個 text box 的值就會自動付給“ filter_learningisfunlink_phrase ” and “ filter_learningisfunlink_link ”的 admin_setting_configtext 變數,並把這 2 個變數新增到 $CFG 變數裡(見下面的程式碼就清楚) .
注意:使用 admin_setting_configtext ,對應的就會在 configuration page 裡出現 text box 供你設定。如果你希望使用其他型別的設定,可以使用下列 class
· admin_setting_configselect 用於 list box設定
· admin_setting_configtextarea 用於 text area設定
等。
2) 在上面的步驟的 configuration 設定好之後,設定的變數被存到 $CFG 裡了。我們應該修改 filter.php 來使用它們 。
global $CFG;
if (!isset ($CFG->filter_learningisfunlink_phrase )) {
set_config ( 'filter_learningisfunlink_phrase',
get_string('phrasedefault', 'filter_learningisfunlink'));
}
if (!isset($CFG->filter_learningisfunlink_link)) {
set_config( 'filter_learningisfunlink_link',
get_string('linkdefault', 'filter_learningisfunlink'));
}
$searchphrase = $CFG->filter_learningisfunlink_phrase ;
$starttag = "<a href=/"{$CFG->filter_learningisfunlink_link}/">";
$endtag = "</a>";
$filterobjects = array();
$filterobjects[] = new filterobject($searchphrase, $starttag, $endtag);
return filter_phrases($text, $filterobjects);
注意:上面的程式碼會先 check $CFG 裡是否存在我們想要的設定的 key ,如果不存在,就通過 set_config 函式往 $CFG 裡新增該 key with default value 。