1. 程式人生 > >Moodle開發筆記3-Filter開發

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

的處理,該函式會使其 safe to be displayed there are no security issues and that any HTML used contains only allowed tags

而且, text還會經過 filter_text function 的處理, 該函式會 apply all enabled filters to 傳過來的 text 。該函式返回的是 the result of all of these filters

下面講解如何開發一個簡單的 filter

,該 filter 會對所有 ” Learning is Fun” 的字眼,都把它轉化成帶指向 link

1. create “learningisfunlink” folder ( 目錄名是你的 filter name) in ”moodle/filter” folder

2. create “filter.php” under ”learningisfunlink” folder

filter.php 只需要新增一個函式 learningisfunlink_filter ” ( 格式為

[filter_name]_filter ) ,該函式帶有 2 個引數: course ID and 要過濾的 text 。下面的例子是最簡單的 filter ,就是把 text 原樣輸出。

<?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