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” 的字眼,都把它转化成带指向 ” http://2fun2learn.org ” 的 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 。