开发支持Moodle2.0的block插件 我们以创建一个简单“HTML”版块为例,讲解在Moodle2.0里的block插件开发,它跟在moodle1.9里有些不一样。 1、三个基本文件 在Moodle2.0里定义一个“block”,在最基本的情况下,我们需要提供三个PHP文件: /blocks/simplehtml/block_simplehtml.php 该文件将用于block类的定义,并用于此插件管理并呈现在屏幕上。 /blocks/simplehtml/version.php 这个文件将包含该插件的版本信息,以及其它高级参数(这里不讨论)。 /blocks/simplehtml/lang/en/block_simplehtml.php 这是你的block的英文文件。如果您不会说英语,你可以用适当的语言代码取代“en”,如中文“zh_cn”。(注意这跟moodle1.9不一样) 第一个文件。/blocks/simplehtml/block_simplehtml.php文件里,输入如下代码 <?php class block_simplehtml extends block_base { public function init() { $this->title = get_string(‘simplehtml’, ‘block_simplehtml’); } public function get_content() { if ($this->content !== null) { return $this->content; } $this->content = new stdClass; $this->content->text = ‘The content of our SimpleHTML block!’; $this->content->footer = ‘Footer here…’; return $this->content; } } // 这里基本与Moodle1.9里一样 ?> 第二个文件,是一个版本文件。Moodle2.0之前版本的详细信息是与第一个文件合在一起的。2.0以后存在专门的文件/block/ simplehtml/ version.php。版本的文件很简单,只有少数几个领域的定义。下面是一个例子: <?php $plugin->version = 2011081200; // YYYYMMDDHH (year, month, day, 24-hr time)命名规则与原来一样 $plugin->requires = 2010112400; // YYYYMMDDHH (这是Moodle的2.0的发行版本号,表示此插件需要Moodle的最低支持版本) ?> 第三个文件,语言包文件/blocks/simplehtml/lang/en/block_simplehtml.php输入代码如下: <?php $string[‘pluginname’] = ‘Simple html block’; $string[‘simplehtml’] = ‘Simple html’; ?> 2、添加配置界面 1)需要在“block类里添加一个返回为true的instance_allow_config函数,代码如下: public function instance_allow_config() { return true; } 2)扩展配置form,创建文件/blocks/simplehtml/edit_form.php(这跟Moodle1.9完全不一样,代码也不同: <?php class block_simplehtml_edit_form extends block_edit_form { protected function specific_definition($mform) { // 标题部分的语言文字。 $mform->addElement(‘header’, ‘configheader’, get_string(‘blocksettings’, ‘block’)); // 一个带“default value”默认值的字符串变量。 $mform->addElement(‘text’, ‘config_text’, get_string(‘blockstring’, ‘block_simplehtml’)); $mform->setDefault(‘config_text’, ‘default value’); $mform->setType(‘config_text’, PARAM_MULTILANG); } } ?> 第一行声明了一个从block_edit_form继承的类,这使Moodle明确要执行代码是配置页。 specific_definition()方法是在您的表单元素定义,这些都需要相同的格式与标准的Moodle表单库。在我们的specific_definition方法,我们已经创建了一个头header,和一个输入字段将接受text文字输入。请注意,您的所有的字段名称应有“config_”前缀,然后他们可以通过这个配置包含在$this->config里。因此,一旦我们的实例配置表已保存,我们可以在block类内,修改代码如下: if (! empty($this->config->text)) { $this->content->text = $this->config->text; } 3、设置版块的标题 首先在/blocks/simplehtml/edit_form.php文件里加入代码: // 一个带“default value”默认值的标题字符串变量。 $mform->addElement(‘text’, ‘config_title’, get_string(‘blocktitle’, ‘block_simplehtml’)); $mform->setDefault(‘config_title’, ‘default value’); $mform->setType(‘config_title’, PARAM_MULTILANG); 同样,在类文件里加入一个specialization()方法(与Moodle1.9一样),实现标题的更改: public function specialization() { if (!empty($this->config->title)) { $this->title = $this->config->title; } else { $this->config->title = ‘Default title …’; } if (empty($this->config->text)) { $this->config->text = ‘Default text …’; } } 4、实现全局统一设置功能 有时候admin可能希望他能够有一个地方对某个block的所有实例能一次性进行设置。 例如,admin希望 helloworld block 的content 长度不要超过200字,或者 content只允许纯文本(plain text) ,如果是html text ,则过滤HTML标签。我们创建一个新的文件,/block/ simplehtml/ settings.php,Moodle会使用全局设置的界面产生和处理每个设置领域的定义。这与早些时候概念颇为相似,但实际用于生成的形式和领域的代码是有所不同的。 settings.php文件(moodle1.9里是config_global.html文件): <?php $settings->add(new admin_setting_heading( ‘headerconfig’, get_string(‘headerconfig’, ‘block_simplehtml’), get_string(‘descconfig’, ‘block_simplehtml’) )); $settings->add(new admin_setting_configcheckbox( ‘simplehtml/Allow_HTML’, get_string(‘labelallowhtml’, ‘block_simplehtml’), get_string(‘descallowhtml’, ‘block_simplehtml’), ‘0’ )); ?> block的配置数据存储的首选方法是在您的settings.php文件里的配置变量名称由“版块名称”前缀+“/”+配置变量,如上面的“simplehtml/Allow_HTML”,。如果你这样写你的settings.php文件,然后将您的变量存储在<前缀>_config_plugin表里,根据block的名字。你的配置数据将仍然可以通过get_config()调用,插件之间的名称冲突将不可能发生。 最后,你想知道为什么每个元素都指定两种语言标签?其实第一个标签是为元素的标签名或主要文本,而第二个标签是其描述,非常简单。 版本升级注意:你会发现settings.php文件和解析的元素名称取代了Moodle的旧的存储方法,config_save()方法在Moodle2.x中不再使用,但instance_config_save()方法是运用最好的方法,你很快就会看到。 访问全局配置数据 现在,我们已经为插件定义了全局数据,我们需要知道在我们的代码里如何访问它。如果您保存您的配置变量在全局命名空间,您可以由全局的$CFG对象访问他们,像这样: $allowHTML = $CFG->Allow_HTML; 如果你在一个block的自定义命名空间里保存配置变量,那么你就可以通过调用get_config()访问它们: $allowHTML = get_config(‘simplehtml’, ‘Allow_HTML’); OK,我们现在有一个实例配置的form,允许用户为block输入自定义内容,和一个全局配置选项,决定是否应该允许该用户使用HTML标签。现在我们只需要两者结合起来配合工作。 但如果Moodle的需要,我们怎么能捕获,并删除HTML标记。 幸运的是,有一个方法可以做到这一点。就是在我们的block类里覆盖instance_config_save()方法,我们可以修改实例配置数据输入后的存储方式如下: public function instance_config_save($data) { if(get_config(‘simplehtml’, ‘Allow_HTML’) == ‘1’) { $data->text = strip_tags($data->text); } return parent::instance_config_save($data); } (这个例子假设您在block里使用的是自定义命名空间。) 其他情况,请参考官方网站:http://docs.moodle.org/dev/Blocks |
Moodle开发笔记10-Block开发(五)
开发支持Moodle2.0的block插件 我们以创建一个简单“HTML”版块为例,讲解在Moodle2.0里的block插件开发…