我正在尝试为Moodle创建一个移动应用程序。这涉及在moodle中创建和启用Web服务。我已成功创建了Web服务,并能够使用core_course_get_courses和core_course_get_contents函数获取课程和课程详细信息。
现在我需要从moodle获得课程的完成状态。有没有可用于执行此操作的功能。我已经浏览了webservices并且没有找到任何提供此数据的函数。是否有任何外部插件来实现这一目标?或任何其他帮助?
答案 0 :(得分:2)
前段时间我遇到过类似的问题。我认为你有两种方法可以解决这个问题:
Develop a local webservice,在Moodle内部,返回完成课程的状态。这样做的功能就是这样:
<?php
require_once("{$CFG->libdir}/completionlib.php");
$cinfo = new completion_info($course_object);
$iscomplete = $cinfo->is_course_complete($USER->id);
?>
创建一个Web服务,在Moodle之外,获取课程的完成页面,解析它,然后返回值。这是我个人选择的路径(虽然它有点危险,因为很容易被Moodle的UI更新破坏)。
我是用Python做的。这是最初获取网页的代码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib, urllib2, cookielib
username = 'USER'
password = 'PASSWORD'
wwwroot = 'wwwroot of your moodle'
remember = 0;
def get_nv_page(url):
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
login_data = urllib.urlencode({'username' : username, 'password' : password, 'rememberusername': remember})
opener.open(wwwroot + '/login/index.php', login_data)
resp = opener.open(url)
return resp.read()
def get_completion_course(course_id):
url = wwwroot + '/course/report/completion/index.php?course=' + str(course_id)
return get_nv_page(url)
并解析它......
import requests, re
from bs4 import BeautifulSoup
def grab_completion_table(self, raw_doc):
""" Convert an html course's completion page from moodle into a python list """
list_video_activities = []
completion_table = {}
doc = BeautifulSoup(raw_doc)
html_table = doc.find('table', id="completion-progress")
activities = html_table.find_all('th', attrs={ 'class': 'criteriaicon'})
for activity in activities:
url = activity.find('a', href=re.compile('.*mod\/url\/view.*'))
if url is not None:
list_video_activities.append(url['title'])
else:
list_video_activities.append(False)
user_rows = html_table.find_all('tr', id=re.compile('user-[0-9]*'))
for user_row in user_rows:
user_id = user_row['id'].split('-')[1]
activities_completion_info = user_row.find_all('td', attrs={ 'class': 'completion-progresscell'})
completion_user_table = []
for i, video_activity in enumerate(list_video_activities):
if video_activity != False:
activity_info = activities_completion_info[i].find('img')['title'].split(',')[1].strip()
activity_completion_info = activity_info.split(':')[1].strip()
# I put this: [ video_title, completion_status ]
completion_user_table.append((video_activity, activity_completion_info))
completion_table[user_id] = completion_user_table
return completion_table
使用Python中的数据,可以很容易地添加Web服务。我不知道你是否可以在你的项目中使用python,但我认为这种方法可以在其他语言中复制。