Moodle開發基礎1

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主題和任何自定義主題。每一個主題都有其本身的文件夾。javascript

 

其它還有:
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-cnphp

 

一、2個頗有用的關於path的變量
$CFG->dirroot  指向moodle root folder
$CFG->libdir 指向moodle root folder下的lib folderhtml


例如:若要include moodle_home/lib下的lib library,能夠java

Php代碼   收藏代碼
  1. require_once($CFG->libdir . '/blocklib.php');  

 
optional_param & required_param
這2個是moodle特有的function,用來代替php自身的從$GET, $POST, $COOKIE中獲取參數值。
required_param函數則要求必需要所要的參數,而optional_param則不須要必定存在所要的參數。
這兩個函數都會驗證指定的參數爲基礎的數據,若是是預期之外的數據經過就會產生錯誤或警告。(詳細描述上網查)
例:mysql

Php代碼   收藏代碼
  1. $id = optional_param('id', 0, PARAM_INT);  
  2. $name = optional_param('name', '', PARAM_RAW);  

第1個參數是param name,第2個參數是缺省值web

 

二、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

三、設置與安裝:config.php & setup.php

全部的入口點php文件的第一行都是算法

C代碼   收藏代碼
  1. require_once(‘../config.php’)  

 
config.php文件執行在全局變量$CFG裏設置的初始參數
$CFG中的信息包括:database數據庫,網頁的URL,script腳本目錄,以及數據存儲目錄的定義設置。sql


注意: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)設置。

四、get_record function
該函數是從database裏獲取record
    例:api

Php代碼   收藏代碼
  1. if (! ($course = get_record('course', 'id', $id)) ) {  
  2. error('Invalid course id');  
  3. }  


五、require_login function
該函數是用來檢查用戶是否已登陸到網站或課程 (有些課程可能設置成不須要login). 若是須要登陸網站,但用戶又沒有登陸,就重定向到登陸頁面。若是用戶已經登陸,他正在嘗試訪問課程,但又沒有註冊到該課程,那麼執行該函數就會將用戶重定向到選課註冊頁面。
例:

Php代碼   收藏代碼
  1. require_login($course);  


六、在Moodle裏的顯示函數
輸出html header的函數有2個
print_header
print_header_simple


上面函數用於輸出html header, 包括主題信息和所要的javascript文件等

例:

Php代碼   收藏代碼
  1. $PAGE->print_header(get_string('course').': %fullname%', NULL, '', $bodytags);  

 
輸出html body是由course的特定format來處理。首先要先include 該課程的format的php文件。

Php代碼   收藏代碼
  1. 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
例:

Php代碼   收藏代碼
  1. print_footer(NULL, $course);  

 

七、配置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裏,包含下列的設置:

Php代碼   收藏代碼
  1. $CFG->dbtype    = 'mysql';  
  2. $CFG->dbhost    = 'localhost';  
  3. $CFG->dbname    = 'moodle';  
  4. $CFG->dbuser    = 'xxx';  
  5. $CFG->dbpass     = 'xxx';  
  6. $CFG->dbpersist =  false;  
  7. $CFG->prefix    = 'mdl_';  
  8. $CFG->wwwroot   = 'http://xxxx:8080/moodle';  
  9. $CFG->dirroot   = 'E:/develop/Zend/Apache2/htdocs/moodle';  
  10. $CFG->dataroot  = 'E:/develop/Zend/Apache2/htdocs/moodledata';  
  11. $CFG->admin     = 'admin';  
  12. $CFG->directorypermissions = xxx;  // try 02777 on a server in Safe Mode  
  13. $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調用了

Php代碼   收藏代碼
  1. $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會看到它)裏進行設置。

 

八、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。

 

一、六種分配級別權限:
        ·site/global(網站全局)
        ·course category(課程類)
        ·course(課程)
        ·blocks(塊)
        ·activities(活動)
        ·user(用戶)
        ·front page(首頁)

 

Contexts是與定義的context水平相關的系統中的元素,Context定義在/lib/accesslib.php裏

Php代碼   收藏代碼
  1. define('CONTEXT_SYSTEM', 10);  
  2. define('CONTEXT_USER', 30);  
  3. define('CONTEXT_COURSECAT', 40);  
  4. define('CONTEXT_COURSE', 50);  
  5. define('CONTEXT_GROUP', 60);  
  6. define('CONTEXT_MODULE', 70);  
  7. define('CONTEXT_BLOCK', 80);  

「System」context只有一個,其餘的則有許多個,如」Course」context,「User」context等。

二、有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(導師角色)

 

三、每一個user role在不一樣的context裏的capability都不一樣。
   獲取context對象的函數是get_context_instance()。
例:

Php代碼   收藏代碼
  1. #獲取system context對象  
  2. $context = get_context_instance(CONTEXT_SYSTEM);  
  3.   
  4. #獲取當前course的context  
  5. global $COURSE;  
  6. $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
  例:

Php代碼   收藏代碼
  1. $context = get_context_instance(CONTEXT_SYSTEM);  
  2. 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代碼   收藏代碼
  1. <?php  
  2. $block_helloworld_capabilities = array(  
  3.     'block/helloworld:view' => array(  
  4.            'captype' => 'read',  
  5.            'contextlevel' => CONTEXT_SYSTEM,  
  6.            'legacy' => array(  
  7.                   'guest' => CAP_PREVENT,  
  8.                   'student' => CAP_PREVENT,  
  9.                   'teacher' => CAP_PREVENT,  
  10.                   'editingteacher' => CAP_PREVENT,  
  11.                   'coursecreator' => CAP_PREVENT,  
  12.                   'admin' => CAP_ALLOW  
  13.            )  
  14.      )  
  15. );  
  16. ?>  

 
   注意:該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

http://justcoding.iteye.com/blog/2004090

相關文章
相關標籤/搜索