Moodle开发笔记9-Block开发(四)

11、设置版块宽度:preferred_width()     设置 block 的 prefer width 。 Moodle 对 block 的 width…

11、设置版块宽度:preferred_width()
    设置 block 的 prefer width 。 Moodle 对 block 的 width 的处理过程包括 2部分:首先 moodle 会检索在课程页里的每一个 block 的 prefer width ,然后使用最大的 prefer width 作为所需的值。因此当你设置 prefer width 时, moodle 不一定保证一定以这个 prefer width 来显示,但显示该 block 时应该不会小于该 prefered width。
   所有标准的Moodle课程格式将提供180和210像素之间的任何要求的宽度,包容。当你使用下列代码时:
function preferred_width(){
  // The preferred value is in pixels
  return 200 ;
}
就会使你的 block width 大于 standard 的宽度。
12、设置HTML属性:html_attributes()
    该方法是用来控制处理 block 的容器的 。每一个 block 都会包含在 <div> or <table> 容器里(即block的HTML代码会包含在 <div> or <table> 里)。那么该方法可以通过添加一些HTML属性来设置包含block的容器。具体方法有下列2种:
    a)直接影响最终的结果(如果我们说,分配bgcolor=”black”) ,b)给容器一个 class ,从而利用CSS来控制,让我们自由定制的最终结果(这是默认情况方法)。     
    下面的例子就用到第二种方法。
function html_attributes(){
  return array (
      ‘class’  =>’sideblock block_’ .$this->name() ,
    ‘onmouseover’=>”alert(‘Mouseover on our block!’);”
  ) ;
}
    以上代码把包住 block 的容器设置为 class=sideblock block_xxx ,这样我们就可以使用这个类,使我们的主题CSS选择器来改变该块的视觉风格(例如, “.sideblock.block_helloworld { border: 1px black solid}”)。另外把 onmouseover 赋予该 block 的容器,使得当鼠标进入该容器时,就弹出“Mouseover on our block!”。
    缺省的 html_attributes() 方法:
function html_attributes(){
    // Default case: an id with the instance and a class with our name
    return array ( ‘id’=>’inst’ . $this -> instance -> id ,
                ‘class’ =>’block_’ .$this -> name ()) ;
}
    如果你打算重写此方法,你应该返回默认属性,再是那些你自己添加的属性。推荐的方法是:
function html_attributes(){
    $attrs = parent::html_attributes();
    // Add your own attributes here, e.g.
    // $attrs[‘width’] = ‘50%’;
    return $attrs;
}
13、设置适用格式:applicable_formats()
    该方法是用来控制 block 可以在哪里使用 。有些 block 可能开发者不希望在所有地方都能够使用,例如 “Social Activities” block 只适用于 social format 的 course ,对于 week format 的 course 并不合适,因此 block 需要设置为只有 social format 的 course 才能够添加该 block ,就要用到 applicable_formats method 。
    注意:在 applicable_formats method 里定义哪些地方可以使用block,是以 page 来设置,而不是以 course 来设置。 这是因为blocks可以显示在支持它们的任何网页中。例如, quit视图页(当我们点击quit的名称,首先看到的页面)也支持blocks。
例1 :
function applicable_formats(){
  return array (
           ‘course-view’=>true ,
            ‘course-view-social’ =>false ) ;
}
    上述代码先设置了允许所有的 course 的 view.php page 都可以添加该 block ,然后再 设置不允许social format 的 course 的 view page 不能够使用它 。
例2 :
function applicable_formats(){
  return array (
           ‘site-index’=>true ,
         ‘course-view’=>true ,
   ‘course-view-social’=>false ,
                  ‘mod’=>true ,
             ‘mod-quiz’=>false
  ) ;
}
   上述代码设置了一个版块可以显示在网站首页,可以显示在除social课程的所有课程里, 也可以显示在除quiz活动的所有活动模块里。
例3
function applicable_formats(){
  return array ( ‘site’=>true ) ;
}
    上述代码设置了一个版块只显示在网站首页(如果省略网页名称,则看作是首页,即site = site-index)
    从上面的例子可以看出页面格式名称(page format name)的格式定义方法 。 例如,如果你需要设置 /course/view.php 是否能够使用block ,则它的页面格式名称是course-view。类似的,请理解一个测试页面格式名称应是:mod-quiz-view
    定义格式名称的规则:
    1、Moodle首页的格式名称是:site-index .
    2、课程页的格式名称不只是course-view,可以是course-view-weeks, course-view-topics ,等等。
    3、即使没有这样的页面,总的格式名称可以用来匹配所有选项。
    在我们定义的适用格式里,我们概括了我们希望的尽可能多的格式名称。每种格式都可以被允许或不允许的,而且,这儿也有三个规则,以帮助解决这个问题:“此版块是允许到这个页面或不允许?”:
    a、格式名称前缀将匹配该格式名称,例如,mod将匹配所有活动模块(activity modules)。course-view将匹配任何课程,无论课程的具体格式。最后,site也将匹配网站首页(记住其完整格式名称是site-index)。
    b、当决定此block是否将被允许时,有匹配您页面的更专门、更高优先级的格式名称。例如:mod,mod-quiz和mod-quiz-view 都是匹配quiz view page的。但是,如果所有三个目前都设置,mod-quiz-view将采取优先于其他两个以上,因为它是一个更好的匹配。
    c、字符“*”可以用来代替任何单词。例如,mod和mod-*是等价的。在本文档的写作时,还没有实际利用“通配符匹配”功能,但它存在,以便以后使用。
    d、格式名称出现的顺序不作任何区别。
14、设置定期响应cron计划
    它可以允许你的block响应cron进程。它有一个定期运行的方法,不论用户是否交互。Moodle的cron.php用来运行一个计划表来执行维护任务,例如电子邮件传送和备份。它可能每5~15分钟就运行一次。
要使 block 具有任务调度功能,只需要2步
Step 1: 添加cron计划功能
function cron(){
    mtrace(“Hey, my cron script is running”) ;
    // do something
    return true ;
}
Step 2: 在block_helloworld class的init函数里添加代码:
      $this->cron = 5;
    这表示每5秒就会执行上面定义的cron函数一次。
    注意:如果你修改了cron interval ,你必须修改 block 的 version number ,然后访问通知页安装更新才能生效。
    注意:此block块的cron脚本是调用该块类型。也就是说cron并不关心该版块有多少个实例,在cron功能里,你如果需要获取版块的实例,你要自己写代码来迭代它们。
    例:
function cron(){
    // get the block type from the name
    $blocktype = get_record( ‘block’, ‘name’, ‘my_block_name’ );
    // get the instances of the block
    $instances = get_records( ‘block_instance’,’blockid’,$blocktype->id );
    // iterate over the instances
    foreach( $instancesas$instance ){
        // recreate block object
        $block= block_instance(‘my_block_name’ ,$instance) ;
        $someconfigitem=$block -> config -> item2 ;
    }
}
“my_block_name”将是版块存储的目录名称。
提示:这也意味着,创建一个block来创建cron运行计划是一个可行的办法。block的实际实例不是必需的。
15、Lists and Icons类型的block
它是一个只提供 item list 的 block type ,该 list 的每一行只显示一个项目和项目旁边的一个可选的图像(图标)。典型的例子就是 course page 里的 “administration” block 。
    开发这种类型的 block ,你应该 extend block_list ,而不是 block_base 。另外,在 getContent 里不是使用 $this->content->text ,而是使用 $this->content->items and $this->content->icons array 。
例如:
class block_my_menu extends block_list{
     // init()方法不需要改变
function get_content(){
  if( $this -> content!==null ){
    return $this -> content ;
  }
  $this -> content  =new stdClass;
  $this -> content->items  = array();
  $this -> content->icons  = array();
  $this -> content -> footer=’Footer here…’ ;
  $this – >content->items[] = ‘<a href=” a .php”>Menu Option 1</a>’ ;
  $this – >content->icons[] ='<img src=”1.gif” />’ ;
  // Add more list items here
  return  $this -> content ;
}
}
具体参考官网:http://docs.moodle.org/dev/Blocks/Blocks_for_1.5_to_1.9#Authorized_Personnel_Only

作者: admin

为您推荐

联系我们

联系我们

邮箱:

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

微信扫一扫关注我们

关注微博
返回顶部