Moodle作为一个主流的开源网络课程管理系统,以其简单而清晰的使用方式和灵活的扩展空间赢得了多数人的青睐。它解决了大部分信息化学习和课程管理的 共同问题(课程设计、发布、组织、作业、测试、统计、评价等) ,能够不加任何修改就能够进行实际应用。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com: office: office" />

Moodle数据库模型
Moodle的数据库模型经过几年的发展已经很复杂,为了减少这种复杂关系带来的混乱,它采用了这样的命名方式。如: mdl_course_categories,其中“mdl_”是所有系统表格的前缀,course代表属于course的模块,categroies代 表课程分类表,这样既可以保证清晰的表述,又可以避免不同模块之间数据表格的重名。可以利用DBDesigner4(一种免费的数据库设计软件,可以从http://fabforce.net/dbdesigner4/下载)将Moodle数据库导出成XML文件,并进行分析。Moodle提供了ADODB数据访问抽象层来进行数据库的访问,所以我们不需要直接编写访问数据库的代码,只要通过抽象层的方法即可。

Moodle data(Moodle数据)
Moodle数据是用户上传内容的文件存储位置记录,Moodle数据也存储登录到该系统用户的会话数据(sessions data),如果基于文件的会话(sessions)正在使用。
Moodle数据在文件夹中的组织结构由用户或课程组成。每门课程有一个文件夹,命名为一个整数值。这个整数值即为这门课程的内部数据库的ID。
Moodle 2.0使用一种全新的组织模式来组织用户上传的文件,这是基于哈希算法。

Moodle主要目录结构
admin:
系统管理的代码
包含控制管理用户界面的PHP文件。其中包括一个cron.php:作为批处理进程执行系统维护任务,如消息传递和过程中备份,同时它也用于处理批量操作
auth:验证用户基本模块及扩展模块
包含所有Moodle的身份验证模块。“auth”目录里每一个子目录就是一个身份验证模块。这些认证模块控制创建用户,用户配置文件数据,和用户访问系统权限。
backup:课程备份代码
包含课程备份的核心功能:备份,恢复和导入的课程。
blocks:界面板块基本模块及扩展模块
板块用于显示信息框,可以在Moodle页面的右侧或左侧栏。这是最简单的可扩展的模块设计类型。
course:显示和管理课程的代码
这是Moodle重要的组成部分,Moodle是围绕课程组织的。开发人员最有可能修改或增加课程的格式和报告。定制课程格式,可用于改变课程的布局。
enrol:注册模块
包含所有的Moodle的注册模块。注册模块控制课程级角色分配(注册)的创建和管理。
files:显示和管理上传文件的代码
该文件组件控制文件的上传,访问控制,并查看文件。文件管理在Moodle2.0中改写变化很大。Moodle的2.0将允许外部文件库中的文件存储和使用,如:Alfresco, Box.net, and Google Docs等。
filter:过滤器
过滤器系统是关联从数据库到页面创建用户输入的内容。过滤器匹配和修改页面显示之前。它需要考虑到性能的影响,需要认真制定。
lang:语言模块
包含核心系统的语言字符串。语言字符串映射也都存储在Moodle的数据lang文件夹。不同语言的对应文本,每个目录表示一种语言,并且和具体的模块对应。
lib:Moodle的核心代码库
包含的核心系统库函数。当我们开发和定制模块时,我们将使用在此文件夹中定义的类和功能。
mod:Moodle的基本模块和扩展模块
包含的活动模块(activity modules),如assignment, quiz, wiki, forum, and lesson模块。学习活动是使用Moodle任何课程的核心功能。活动模块(activity modules)比块(blocks)创建更具挑战性和复杂性,因为它们设计到备份,还原,和存储等级等内容。
my:我的课程
它提供了一个上市的分配给学习者的课程列表,包括即将到来的课程活动的总结。用户也可以添加和删除他或她的门户网站页面上的块。“my”提供了一个很好的位置,以最小的核心变化到Moodle显示自定义信息。例如,我们利用“my”作为一个定制许多项目的面板位置。
theme:站点的主题包,控制站点的样式
包含了所有的内置的Moodle主题和任何自定义主题。每个主题都有其自己的文件夹。

其它还有:
calendar:维护及显示日历的代码
doc:Moodle的帮助文档
login:登录及账号创建代码
pix:站点的图片
user:显示和管理用户
onfig.php包含基本的系统设置,一般在第一次安转时设置
ns tall.php安装站点
vers ion版本控制
index.php站点首页

开发概要详见:http://docs.moodle.org/archive/zh/index.php?title=%E5%BC%80%E5%8F%91:%E6%A6%82%E8%A6%81&variant=zh-cn

1、2个很有用的关于path的变量
$CFG->dirroot  指向moodle root folder
$CFG->libdir 指向moodle root folder下的lib folder

例如:若要include moodle_home/lib下的lib library,可以

require_once($CFG->libdir . '/blocklib.php');

optional_param & required_param
这2个是moodle特有的function,用来代替php自身的从$GET, $POST, $COOKIE中获取参数值。
required_param函数则要求必须要所要的参数,而optional_param则不需要一定存在所要的参数。
这两个函数都会验证指定的参数为基础的数据,如果是预期以外的数据通过就会产生错误或警告。(详细描述上网查)
例:

$id = optional_param('id', 0, PARAM_INT);
$name = optional_param('name', '', PARAM_RAW);

第1个参数是param name,第2个参数是缺省值

2、Moodle的入口点

/index.php: The front page(站点首页)
/login/index.php: The login page(登录页)
/admin/index.php: The main administration page(管理页)
/course/view.php: A course page(课程页)
/mod/*/view.php: A module page(模块页)
如:http://localhost/course/view.php?id=23

3、设置与安装:config.php & setup.php

所有的入口点php文件的第一行都是

require_once(‘../config.php’)

config.php文件执行在全局变量$CFG里设置的初始参数
$CFG中的信息包括:database数据库,网页的URL,script脚本目录,以及数据存储目录的定义设置。

注意:config.php includes /lib/setup.php
setup.php设置所有所需的完整的执行环境的初步方案。这包括定义其他几个重要的全局变量,包括: $SESSION, $COURSE, $THEME, and $db。

Setup.php会根据设置在config.php中定义:建立和连接数据库的设置。
Moodle使用ADOdb来进行数据库操作,Moodle使用的默认数据库是MySQL, 是一个开源的关系数据库系统。为了可以使用其他的关系数据库服务器, Moodle使用了ADODB将数据层抽象, 这样Moodle就可以使用诸如MS SQL Server、 Oracle等关系型数据库。使用ADOdb你需要include /lib/adodb/adodb.inc.php
setup.php还会inlude一些常用的库,还会设置其他一些关键的全局变量,从数据库中加载配置变量,设置了缓存(caching),会话 (sessions),环境变量(environment variables),主题(themes),语言(language),和区域(locales)设置。

4、get_record function
该函数是从database里获取record
    例:

if (! ($course = get_record('course', 'id', $id)) ) {
error('Invalid course id');
}

5、require_login function
该函数是用来检查用户是否已登录到网站或课程 (有些课程可能设置成不需要login). 如果需要登录网站,但用户又没有登录,就重定向到登录页面。如果用户已经登录,他正在尝试访问课程,但又没有注册到该课程,那么执行该函数就会将用户重定向到选课注册页面。
例:

require_login($course);

6、在Moodle里的显示函数
输出html header的函数有2个
print_header
print_header_simple

上面函数用于输出html header, 包括主题信息和所要的javascript文件等

例:

$PAGE->print_header(get_string('course').': %fullname%', NULL, '', $bodytags);

输出html body是由course的特定format来处理。首先要先include 该课程的format的php文件。

require($CFG->dirroot .'/course/format/'. $course->format .'/ format.php');

例如,如果课程使用topics format,就会include /course/format/topics/format.php。
该format.php用于处理特定的course page的输出,包括the blocks and main content。
print_footer函数用于输出footer
例:

print_footer(NULL, $course);

7、配置Moodle
Moodle的设置分别处于3个地方:
直接在config.php里hard code。
mdl_config table。可以通过administrative code and interfaces进行控制
mdl_config_plugins table。主要是存储来自各个plugin的设置。可以通过plugin administration来进行控制。
所有的配置信息都存在全局变量$CFG里(plugin的设置则会放在plugin变量里)。

例如:$CFG->theme包含您网站的主题选定的文本名称。
    config.php一开始会调用unset($CFG);来保证在config.php and setup.php之前清除所有的设置。
    在config.php里,包含下列的设置:

$CFG->dbtype    = 'mysql';
$CFG->dbhost    = 'localhost';
$CFG->dbname    = 'moodle';
$CFG->dbuser    = 'xxx';
$CFG->dbpass     = 'xxx';
$CFG->dbpersist =  false;
$CFG->prefix    = 'mdl_';
$CFG->wwwroot   = 'http://xxxx:8080/moodle';
$CFG->dirroot   = 'E:/develop/Zend/Apache2/htdocs/moodle';
$CFG->dataroot  = 'E:/develop/Zend/Apache2/htdocs/moodledata';
$CFG->admin     = 'admin';
$CFG->directorypermissions = xxx;  // try 02777 on a server in Safe Mode
$CFG->passwordsaltmain = 'xxxx';

这是config.php最必须的设置,如果想在config.php里进行更多的设置,则要参看config-dist.php的所有的配置设置,然后修改config.php。

上述设置你可以直接在config.php里修改。
    除了config.php之外的所有其他设置都存储在database的mdl_config 表and mdl_config_plugins 表里。
    那么moodle何时把这些来自database的设置赋给$CFG?

就是在config.php里include了lib/setup.php,setup.php调用了

$CFG = get_config();

来执行。get_config()函数来自/lib/moodlelib.php库文件
   注意:get_config函数不会对于在调用之前已经存在的设置进行覆盖。(will not overwrite any $CFG setting that has already been set)。即它不会覆盖config.php里的设置. 这意味着你可以在config.php里硬编码你希望的设置,在config.php最后一行include了setup.php,但来自 database的设置如果与config.php里的设置同名,则不会覆盖它。

对configuration进行修改是通过set_config函数。该函数会以(name、value、plugin name (optional))作为参数。如果不使用第三个参数,那么set_confg就会把设置存储在mdl_config 表,如果使用这个参数,则存在mdl_config_plugins表里。

我们开发的通常是插件 (modules, blocks, and so on)。在开发过程中,如果你想添加设置的话,强烈建议使用mdl_config_plugins表来存储,即调用set_config时要用到 plugin name参数。这是因为:设置的name必须唯一。如果你想添加设置到mdl_config表里,那么就有可能该设置的name已经存在,产生冲突。而对 于mdl_config_plugins表,它多了一个”plugin” field,这就使你只要保证该设置的name在该plugin里是唯一的即可。

注意:plugin的设置则会放在plugin变量里,而不是存在$CFG里。
通常,我们都是通过administration interfaces来set configuration variables。绝对多数的Moodle configuration variables都可以在Site Administration block (用admin login后的home page会看到它)里进行设置。

8、Moodle API
绝大多数的api都放在lib目录下,该目录下的library php的命名方式是
    [function]lib.php
    例如 textlib.php and weblib.php
    几乎所有的核心库是包含的,当您通过config.php加载/lib/setup.php将其列入。

最常用的library有
•  moodlelib.php
•  weblib.php
•  dmllib.php
•  accesslib.php
•  grouplib.php

Moodle还会用到一些开源的library,如
•  PEAR
•  ADOdb
•  YUI
•  XMLDB

访问控制,登录和角色
Access control, logins, and roles Moodle的登录函数使用PHP的'cookie'的功能设置成当前会话的Cookie。

1、六种分配级别权限:
        ·site/global(网站全局)
        ·course category(课程类)
        ·course(课程)
        ·blocks(块)
        ·activities(活动)
        ·user(用户)
        ·front page(首页)

Contexts是与定义的context水平相关的系统中的元素,Context定义在/lib/accesslib.php里

define('CONTEXT_SYSTEM', 10);
define('CONTEXT_USER', 30);
define('CONTEXT_COURSECAT', 40);
define('CONTEXT_COURSE', 50);
define('CONTEXT_GROUP', 60);
define('CONTEXT_MODULE', 70);
define('CONTEXT_BLOCK', 80);

“System”context只有一个,其他的则有许多个,如”Course”context,“User”context等。

2、有7个内置的角色(role)
     ·administrator(管理员):系统管理员拥有任何权限,操作任何课程。
     ·teacher(教师):教师可以在负责的课程中做任何事,包括更改活动和为学生评分。
     ·non-editing teacher(无编辑权教师):可以在课程中教授和给学生们打分,但是无法改变活动内容。
     ·student(学生):可参加一门课程,通常拥有较少的特权。
     ·course creator(课程创建者):可以创建课程,并可以限制在一个课程类别里。
     ·authenticated user(认证的用户):任何登录的用户都有这个角色
     ·guest(访客):非登录用户拥有最小的权限,而且通常不能在任何地方输入文本。

这些role都可以分配给上面的一个或多个context。
    每个用户可以拥有多个角色,这些角色继承所有适用于从用户访问请求的context级别的权限。
Capabilities are associated with context levels, and are specific access rules that can be granted to roles.
Examples of capabilities are:
    ·moodle/site:manageblocks: Can manage blocks at the site context level
    ·moodle/user:viewdetails: Can view details of a user at the user context level
    ·moodle/course:view: Can view a course at the course context level

每一个capability都可以assign给下列4个访问权限级别(access levels)的其中一个:
    ·Not Set(没有设置)
    ·Allow(允许)
    ·Prohibit(禁止)
    ·Prevent(避免)
   注意:开发者可以通过创建capabilities来控制访问我们的新功能。

总结来说:
     ·Contexts are specific elements in Moodle(Contexts是Moodle中的特定元素)
     ·Roles are associated with all contexts(Roles是与所有的contexts关联的)
     ·Capabilities are assigned to roles in a given context(Capabilities都被分配给特定context下的角色)
     ·Users are assigned to roles in a given context(用户都被分配给特定context下的角色)
      普通系统使用User, Role, Capability就OK了,为什么moodle还要加多一个context?
      这是因为同一个user在不同的context的role不同,比如在system context,user是admin role,而他在course“foo”里是instructor role(导师角色)

3、每个user role在不同的context里的capability都不同。
   获取context对象的函数是get_context_instance()。
例:

#获取system context对象
$context = get_context_instance(CONTEXT_SYSTEM);#获取当前course的context
global $COURSE;
$context = get_context_instance(CONTEXT_COURSE, $COURSE->id);

获取context之后,下列2个函数是用来check当前login的user在该context里是否有所指定的capability。
    ·require_capability测试当前用户的capabilities,看看他们是否在指定context内有指定的capability,如果他们没有,页面就重定向到一个错误页面。
    ·has_capability功能与require_capability类似,但不会重定向到错误页面,而是return true or false
  例:

$context = get_context_instance(CONTEXT_SYSTEM);
require_capability('moodle/site:doanything', $context);

上面的例子是检查当前用户在system context里是否有'moodle/site:doanything'的capability。
   如何为你的moodle plugin/module自定义capability?
   在plugin/module的root目录下创建一个db目录,然后在db目录下创建一个access.php,该文件用来定义capability。

下例是在helloworld block里定义一个block/helloworld:view capability,该capability的type是read,该capability是属于system context level里,并设置只有admin role user拥有该capability,其他role没有。
代码如下:

<?php
$block_helloworld_capabilities = array('block/helloworld:view' => array('captype' => 'read','contextlevel' => CONTEXT_SYSTEM,'legacy' => array('guest' => CAP_PREVENT,'student' => CAP_PREVENT,'teacher' => CAP_PREVENT,'editingteacher' => CAP_PREVENT,'coursecreator' => CAP_PREVENT,'admin' => CAP_ALLOW))
);
?>

注意:该capability适用于任何使用了该block的地方。无论你是把该block加到home page,还是admin page,还是My Moodle page,还是course page,该capability都适用。但由于该capability是定义在system context level,只有那些在system context level具有admin role的user才能够看到这个block。

接下来将学习5种类型的Moodle plugin的开发:
·block
·filter
·activity module
·theme
·course format

来源:http://www.aieln.com/thread-4899-1-1.html

来源: http://www.aieln.com/thread-5089-1-1.html

Moodle插件开发笔记相关推荐

  1. Moodle插件开发大全

    moodle插件开发国内可参考资料少的可怜,该笔记为完成毕设过程整理,囊括插件目录结构自动化创建工具使用.插件数据库创建工具使用.插件开发调试技巧.插件开发必备php基础知识及moodle平台封装源码 ...

  2. Moodle插件开发——Blocks(版块)

    前提: 1)     基于Moodle3.0,要求Moodle版本高于2.0 2)     PHP编程基础:语言的了解和开发工具使用 有经验的开发人员和那些只是想程序员的参考文本应参阅附录A. 1.  ...

  3. moodle分析笔记

    1.输出对象,在\lib\sessionlib.php中定义, $PAGE=newmoodle_page(); 其它的文档都可以直接引用$PAGE. classmoodle_page()在\lib\p ...

  4. Android桌面插件开发笔记

    开发桌面插件步骤:定义桌面插件布局(layout) -> 实现 AppWidgetProvider 子类 -> 定义相关资源文件(res/xml/...)实现appwidget-provi ...

  5. 【moodle】moodle dialog开发笔记 1

    目录 moodle plugin慕课网插件开发笔记 1 安装环境 Dialogflow PHP API 困难重重 开始上手 数据库操作 PHP-DIALOGFLOW API 动态加载 moodle p ...

  6. DL动态加载框架技术

    转载自:http://blog.csdn.net/singwhatiwanna/article/details/40283117 DL动态加载框架技术文档 1. Android apk动态加载机制的研 ...

  7. DL动态加载框架技术文档

    DL动态加载框架技术文档 DL技术交流群:29969245 1. Android apk动态加载机制的研究 2. Android apk动态加载机制的研究(二):资源加载和activity生命周期管理 ...

  8. chrome插件自动登录

    chrome插件开发笔记 实现功能 工程结构 1. manifest.json 2. popup.html 3. popup.js 4. background.js 5. content.js 6. ...

  9. jQuery插件开发学习笔记

    今天想了解一下jQuery的插件开发,于是google了一下,列在前面的两篇文章都很不错,jQuery插件开发全解析 更是将插件开发的方方面面细致入微的进行了讲解,并提供了PDF进行下载.笔者今天详细 ...

最新文章

  1. android 编译之后黑屏_android 模拟器用3.18的内核无法启动,一直黑屏。
  2. Android 开源项目集合
  3. 什么样 信号_深圳停止商务公寓用地审批释放着什么样的信号,会引起房价下跌吗...
  4. shell 下执行mysql 命令
  5. java transient 和Volatile关键字
  6. boost::fibers::launch::dispatch的测试程序
  7. HTML5学习笔记简明版(10):废弃的元素和属性
  8. 【ArcGIS微课1000例】0023:ArcGIS将地理照片(无人机照片)转为点(航迹)案例教程
  9. toj 4607 Multiple of 17
  10. 收获,不止SQL优化——抓住SQL的本质--第二章
  11. (二)ubuntu使用launchpad.net线上编译
  12. Bailian2899 Bailian3242 矩阵交换行【矩阵】
  13. 应用安全-安全设备-Waf系列-软Waf-D盾
  14. Ubuntu16.04上使用Anaconda3的Python3.6的pip安装UWSGI报错解决办法
  15. 学习机器学习,需要具备什么的数学基础?
  16. seo和sem的区别与联系
  17. Me安装教程(同pr)
  18. 兄弟机cnc系统面板图解_兄弟机操作面板及编程
  19. Ambarella处理器启动过程
  20. Codeforces Round #521 (Div. 3) B. Disturbed People 思维

热门文章

  1. 信息学奥赛C++语言:学生人数
  2. LSI最长递增子序列(DP问题)
  3. 9.1 LSMW程序创建操作手册 第1 2步
  4. sparksql 保存点_Spark(十二)【SparkSql中数据读取和保存】
  5. 心态很容易受别人影响_女人生宝宝也看年龄?这3个影响生育能力的因素,你得了解清楚...
  6. tensorflow saver_机器学习入门(6):Tensorflow项目Mnist手写数字识别-分析详解
  7. vuejs项目性能优化 - 总结篇
  8. QQ 一键加群、扫二维码加群 - 腾讯官方API文档接入
  9. mysql数据库集群架构图_搭建MySQL-Cluster集群架构
  10. mysql从库延时好高_部署MySQL延迟从库的几个好处