Moodle开发笔记3-Filter开发

来源:互联网 发布:新手单反相机推荐知乎 编辑:程序博客网 时间:2024/06/05 05:51

 

Moodle filters是对修改来自databasecontent进行过滤修改后再输出显示。

 

一个例子是moodle自带的multimedia filter,它能够detect references to video and audio files,然后replace them with a"mini-player" embedded in the content

 

Filter的工作原理

Moodle里所有要输出到screentext都要经过format_textfunction的处理,该函数会使其safe to be displayed there are no security issues andthat any HTML used contains only allowed tags

 

而且,text还会经过filter_textfunction的处理,该函数会apply all enabled filters to 传过来的text。该函数返回的是the result of all of these filters

 

 

下面讲解如何开发一个简单的filter,该filter会对所有” Learning is Fun”的字眼,都把它转化成带指向 http://2fun2learn.orglink

 

1. create “learningisfunlink” folder (目录名是你的filtername) 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开发)

如果不使用languagefile,那么在filter manage page里显示该filtername就是learningisfunlink,但如果我们的lang/en_utf8/filter_learningisfunlink.php里添加下列的code

$string['filtername'] ="Main website link";

那么在filtermanage page里该filter name"Main website link"

 

4. 修改步骤2filter.phplearningisfunlink_filter函数,使得碰到” Learning is Fun”的字眼就转成link

 

会用到/lib/filterlib.phpfile里的filterobject class andthe filter_phrases function.

 

filterobject class定义了一个object来包含所有filter_phrases function所要的info

·        filterstring

·        the tag to start thereplacement with

·        the tag to end thereplacement with

·        whether to match case(optional)

·        whether a full match isrequired (optional)

·        any replacement textfor the match

 

filter_phrases($text, $filterobjects)函数是根据参数$filterobjectsit is an array)来处理第一个参数的text,然后返回处理后的string

 

修改后的learningisfunlink_filter函数代码为

function learningisfunlink_filter($courseid, $text) {

//create filterobjectsobj

$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”。同时能够动态设置linkurl。因此我们就要使filter具有configuration的功能(这样在filter manage page里该filter就会多一个”setting” link)。

 

1) 添加一个filtersettings.php under ”learningisfunlink”folder。当你创建了该文件后,该filtermanage 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(newadmin_setting_configtext('filter_learningisfunlink_phrase',

                   'Phrase','Phraseto hyperlink', 'learning is fun'));

 

   $settings->add(newadmin_setting_configtext('filter_learningisfunlink_link',

                   'url','URLto link phrase to', 'http://2fun.org'));

?>

 

对于上面的代码,当你进入该filterconfiguration page时,就会有2textbox,它们的name分别为“filter_learningisfunlink_phraseandfilter_learningisfunlink_link”,当你submit时,这2text box的值就会自动付给“filter_learningisfunlink_phraseandfilter_learningisfunlink_link”的admin_setting_configtext变量,并把这2个变量添加到$CFG变量里(见下面的代码就清楚).

 

注意:使用admin_setting_configtext,对应的就会在configurationpage里出现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 = "<ahref=/"{$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