Moodle开发笔记10-Block开发(五)

开发支持Moodle2.0的block插件      我们以创建一个简单“HTML”版块为例,讲解在Moodle2.0里的block插件开发…

开发支持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

作者: admin

为您推荐

联系我们

联系我们

邮箱:

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部