--- /dev/null
+<?php
+/*
+* Created on 01/12/2008
+ *
+ * Moodle base webservice api
+ *
+ * @author Jerome Mouneyrac
+ */
+
+/**
+ * DO NOT USE ANYTHING FROM THIS FILE - WORK IN PROGRESS
+ */
+abstract class moodle_external {
+
+ protected $descriptions;
+
+ /**
+ * Constructor - We set the description of this API in order to be access by Web service
+ */
+ function __construct () {
+ $this->descriptions = array();
+ }
+
+ /**
+ *
+ * @param string $functionname
+ * @return array
+ */
+ public function get_function_webservice_description($functionname) {
+ if (key_exists($functionname, $this->descriptions)) {
+ return $this->descriptions[$functionname];
+ }
+ else {
+ return false;
+ }
+ }
+
+ /**
+ *
+ * @return array
+ */
+ public function get_descriptions() {
+ return $this->descriptions;
+ }
+
+ /**
+ * This function clean params, because it should only be called by external itself, it has to be protected (server should not call it)
+ * @param array $params
+ */
+ protected function clean_function_params($functionname, &$params) {
+ $description = $this->get_function_webservice_description($functionname);
+ varlog($functionname);
+ foreach ($params as $param) { //we are applying the algo for all params
+ $key = key($description['params']); //get next key of the description array => params need to be ordered !
+ $this->clean_params($description['params'][$key], $param);
+
+ }
+ }
+
+ /**
+ *
+ * @param <type> $params
+ */
+ protected function clean_params($description, &$params) {
+ if (!is_array($params)) {
+ $paramvalue = clean_param($params, $description);
+ } else {
+ foreach ($params as $paramname => &$paramvalue) {
+ if (is_array($paramvalue)) { //it's a list
+ //A description array does not support list of different objects
+ //it's why we retrieve the first key, because there should be only one key
+ $this->clean_params($description[key($description)], $paramvalue);
+ }
+ else {
+ if (is_object($paramvalue)) { //is it a object
+ $this->clean_object_types($description[$paramname], $paramvalue);
+ }
+ else { //it's a primary type
+ $paramvalue = clean_param($paramvalue, $description[$paramname]);
+ }
+ }
+
+
+ }
+
+ }
+ }
+
+ protected function clean_object_types($objectdescription, &$paramobject) {
+ foreach (get_object_vars($paramobject) as $propertyname => $propertyvalue) {
+ if (is_array($propertyvalue)) {
+ $this->clean_params($objectdescription->$propertyname, $propertyvalue);
+ $paramobject->$propertyname = $propertyvalue;
+ } else {
+ $paramobject->$propertyname = clean_param($propertyvalue, $objectdescription->$propertyname);
+
+ }
+ }
+ }
+
+}
+?>
* @copyright Copyright (c) 1999 onwards Martin Dougiamas http://dougiamas.com
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL License
*/
+require_once(dirname(dirname(__FILE__)) . '/lib/moodleexternal.php');
require_once(dirname(dirname(__FILE__)) . '/user/lib.php');
/**
*
* @author Jerome Mouneyrac
*/
-final class user_external {
+final class user_external extends moodle_external {
+
+/**
+ * Constructor - We set the description of this API in order to be access by Web service
+ */
+ function __construct () {
+ $this->descriptions = array();
+ ///The desciption of the web service
+
+ $user = new stdClass();
+ $user->password = PARAM_ALPHANUMEXT;
+ $user->auth = PARAM_ALPHANUMEXT;
+ $user->confirmed = PARAM_NUMBER;
+ $user->username = PARAM_ALPHANUMEXT;
+ $user->idnumber = PARAM_ALPHANUMEXT;
+ $user->firstname = PARAM_ALPHANUMEXT;
+ $user->lastname = PARAM_ALPHANUMEXT;
+ $user->email = PARAM_NOTAGS;
+ $user->emailstop = PARAM_NUMBER;
+ $user->lang = PARAM_ALPHA;
+ $user->theme = PARAM_ALPHANUM;
+ $user->timezone = PARAM_ALPHANUMEXT;
+ $user->mailformat = PARAM_ALPHA;
+ $user->description = PARAM_TEXT;
+ $user->city = PARAM_ALPHANUMEXT;
+ $user->country = PARAM_ALPHANUMEXT;
+
+ $this->descriptions['create_users'] = array( 'params' => array('users' => array($user)),
+ 'optionalinformation' => 'All params are not mandatory',
+ 'return' => array('userids' => array(PARAM_NUMBER)));
+
+ $user = new stdClass();
+ $user->id = PARAM_NUMBER;
+ $user->auth = PARAM_ALPHANUMEXT;
+ $user->confirmed = PARAM_NUMBER;
+ $user->username = PARAM_ALPHANUMEXT;
+ $user->idnumber = PARAM_ALPHANUMEXT;
+ $user->firstname = PARAM_ALPHANUMEXT;
+ $user->lastname = PARAM_ALPHANUMEXT;
+ $user->email = PARAM_NOTAGS;
+ $user->emailstop = PARAM_NUMBER;
+ $user->lang = PARAM_ALPHA;
+ $user->theme = PARAM_ALPHANUM;
+ $user->timezone = PARAM_ALPHANUMEXT;
+ $user->mailformat = PARAM_ALPHA;
+ $user->description = PARAM_TEXT;
+ $user->city = PARAM_ALPHANUMEXT;
+ $user->country = PARAM_ALPHANUMEXT;
+
+ $this->descriptions['get_users'] = array( 'params' => array('search'=> PARAM_ALPHANUM),
+ 'optionalparams' => 'All params are not mandatory',
+ 'return' => array('user' => array( $user)));
+
+
+ $this->descriptions['delete_users'] = array( 'params' => array('usernames' => array(PARAM_ALPHANUMEXT)),
+ 'optionalparams' => 'All params are not mandatory',
+ 'return' => array('result' => PARAM_BOOL));
+
+ $user->newusername = PARAM_ALPHANUMEXT;
+ $this->descriptions['update_users'] = array( 'params' => array('users' => array($user),
+ 'optionalparams' => 'All params are not mandatory',
+ 'return' => array('result' => PARAM_BOOL)));
+ }
/**
* Retrieve all user
* @param array|struct $params - need to be define as struct for XMLRPC
- * @subparam string $params->search - the string to search
* @return object $return
- * @subreturn integer $return:user->id
- * @subreturn integer $return:user->auth
- * @subreturn integer $return:user->confirmed
- * @subreturn string $return:user->username
- * @subreturn string $return:user->idnumber
- * @subreturn string $return:user->firstname
- * @subreturn string $return:user->lastname
- * @subreturn string $return:user->email
- * @subreturn string $return:user->emailstop
- * @subreturn string $return:user->lang
- * @subreturn string $return:user->theme
- * @subreturn string $return:user->timezone
- * @subreturn string $return:user->mailformat
*/
- static function get_users($params) {
+ public function get_users($params) {
global $USER;
- $params['search'] = clean_param($params['search'], PARAM_ALPHANUM);
+ $this->clean_function_params('get_users', $params);
if (has_capability('moodle/user:viewdetails', get_context_instance(CONTEXT_SYSTEM))) {
return get_users(true, $params['search'], false, null, 'firstname ASC','', '', '', 1000, 'id, auth, confirmed, username, idnumber, firstname, lastname, email, emailstop, lang, theme, timezone, mailformat, city, description, country');
}
}
- /**
+ /**
* Create multiple users
* @param array|struct $params - need to be define as struct for XMLRPC
- * @subparam string $params:user->username
- * @subparam string $params:user->firstname
- * @subparam string $params:user->lastname
- * @subparam string $params:user->email
- * @subparam string $params:user->password
* @return array $return ids of new user
- * @subreturn integer $return:id user id
*/
- static function create_users($params) {
+ public function create_users($params) {
global $USER;
if (has_capability('moodle/user:create', get_context_instance(CONTEXT_SYSTEM))) {
$userids = array();
- foreach ($params as $userparams) {
-
- $user = new stdClass();
- if (array_key_exists('email', $userparams)) {
- $user->email = clean_param($userparams['email'], PARAM_NOTAGS);
- }
-
- if (array_key_exists('password', $userparams)) {
- $user->password = clean_param($userparams['password'], PARAM_ALPHANUMEXT);
- }
-
- if (array_key_exists('idnumber', $userparams)) {
- $user->idnumber = clean_param($userparams['idnumber'], PARAM_ALPHANUMEXT);
- }
-
- if (array_key_exists('description', $userparams)) {
- $user->description = clean_param($userparams['description'], PARAM_TEXT);
- }
-
- if (array_key_exists('username', $userparams)) {
- $user->username = clean_param($userparams['username'], PARAM_ALPHANUMEXT);
- }
-
- if (array_key_exists('auth', $userparams)) {
- $user->auth = clean_param($userparams['auth'], PARAM_ALPHANUMEXT);
- }
-
- if (array_key_exists('confirmed', $userparams)) {
- $user->confirmed = clean_param($userparams['confirmed'], PARAM_ALPHANUMEXT);
- }
-
- if (array_key_exists('firstname', $userparams)) {
- $user->firstname = clean_param($userparams['firstname'], PARAM_ALPHANUMEXT);
- }
-
- if (array_key_exists('lastname', $userparams)) {
- $user->lastname = clean_param($userparams['lastname'], PARAM_ALPHANUMEXT);
- }
-
- if (array_key_exists('emailstop', $userparams)) {
- $user->emailstop = clean_param($userparams['emailstop'], PARAM_ALPHANUMEXT);
- }
-
- if (array_key_exists('lang', $userparams)) {
- $user->lang = clean_param($userparams['lang'], PARAM_ALPHANUMEXT);
- }
-
- if (array_key_exists('theme', $userparams)) {
- $user->theme = clean_param($userparams['theme'], PARAM_ALPHANUMEXT);
- }
-
- if (array_key_exists('timezone', $userparams)) {
- $user->timezone = clean_param($userparams['timezone'], PARAM_ALPHANUMEXT);
- }
-
- if (array_key_exists('city', $userparams)) {
- $user->city = clean_param($userparams['city'], PARAM_ALPHANUMEXT);
- }
-
- if (array_key_exists('country', $userparams)) {
- $user->country = clean_param($userparams['country'], PARAM_ALPHANUMEXT);
- }
-
- if (array_key_exists('mailformat', $userparams)) {
- $user->mailformat = clean_param($userparams['mailformat'], PARAM_ALPHANUMEXT);
- }
-
+ $this->clean_function_params('create_users', $params);
+ foreach ($params['users'] as $user) {
try {
- $userids[$userparams['username']] = create_user($user);
+ $userids[$user->username] = create_user($user);
}
catch (dml_write_exception $e) {
throw new moodle_exception('wscouldnotcreateeuserindb');
}
}
- /**
+ /**
* Delete multiple users
* @global object $DB
* @param array|struct $params - need to be define as struct for XMLRPC
- * @subparam string $params:user->username
* @return boolean result true if success
*/
- static function delete_users($params) {
+ public function delete_users($params) {
global $DB,$USER;
$deletionsuccessfull = true;
if (has_capability('moodle/user:delete', get_context_instance(CONTEXT_SYSTEM))) {
- foreach ($params as $userparams) {
-
- $username = clean_param($userparams['username'], PARAM_ALPHANUMEXT);
+ $this->clean_function_params('delete_users', $params);
+ foreach ($params['usernames'] as $username) {
$user = $DB->get_record('user', array('username'=>$username, 'mnethostid'=>1));
-
if (empty($user)) {
throw new moodle_exception('wscouldnotdeletenoexistinguser');
}
-
+
if (!delete_user($user)) {
$deletionsuccessfull = false; //this function is in moodlelib.php
}
}
}
- /**
+ /**
* Update some users information
* @global object $DB
* @param array|struct $params - need to be define as struct for XMLRPC
- * @subparam string $params:user->username
- * @subparam string $params:user->newusername
- * @subparam string $params:user->firstname
* @return boolean result true if success
*/
- static function update_users($params) {
+ public function update_users($params) {
global $DB,$USER;
if (has_capability('moodle/user:update', get_context_instance(CONTEXT_SYSTEM))) {
$updatesuccessfull = true;
- foreach ($params as $userparams) {
- if (array_key_exists('username', $userparams)) {
- $username = clean_param($userparams['username'], PARAM_NOTAGS);
- }
+ $this->clean_function_params('update_users', $params);
- $user = $DB->get_record('user', array('username'=>$username, 'mnethostid'=>1));
+ foreach ($params['users'] as $paramuser) {
+
+ $user = $DB->get_record('user', array('username'=> $paramuser->username, 'mnethostid'=>1));
if (empty($user)) {
throw new moodle_exception('wscouldnotupdatenoexistinguser');
}
-
- if (array_key_exists('email', $userparams)) {
- $user->email = clean_param($userparams['email'], PARAM_NOTAGS);
- }
-
- if (array_key_exists('description', $userparams)) {
- $user->description = clean_param($userparams['description'], PARAM_TEXT);
- }
-
- if (array_key_exists('newusername', $userparams)) {
- $user->username = clean_param($userparams['newusername'], PARAM_ALPHANUMEXT);
- }
-
- if (array_key_exists('auth', $userparams)) {
- $user->auth = clean_param($userparams['auth'], PARAM_ALPHANUMEXT);
- }
-
- if (array_key_exists('confirmed', $userparams)) {
- $user->confirmed = clean_param($userparams['confirmed'], PARAM_ALPHANUMEXT);
- }
-
- if (array_key_exists('firstname', $userparams)) {
- $user->firstname = clean_param($userparams['firstname'], PARAM_ALPHANUMEXT);
- }
-
- if (array_key_exists('lastname', $userparams)) {
- $user->lastname = clean_param($userparams['lastname'], PARAM_ALPHANUMEXT);
- }
-
- if (array_key_exists('emailstop', $userparams)) {
- $user->emailstop = clean_param($userparams['emailstop'], PARAM_ALPHANUMEXT);
- }
-
- if (array_key_exists('lang', $userparams)) {
- $user->lang = clean_param($userparams['lang'], PARAM_ALPHANUMEXT);
- }
-
- if (array_key_exists('theme', $userparams)) {
- $user->theme = clean_param($userparams['theme'], PARAM_ALPHANUMEXT);
- }
-
- if (array_key_exists('timezone', $userparams)) {
- $user->timezone = clean_param($userparams['timezone'], PARAM_ALPHANUMEXT);
- }
-
- if (array_key_exists('city', $userparams)) {
- $user->city = clean_param($userparams['city'], PARAM_ALPHANUMEXT);
- }
-
- if (array_key_exists('country', $userparams)) {
- $user->country = clean_param($userparams['country'], PARAM_ALPHANUMEXT);
- }
-
- if (array_key_exists('mailformat', $userparams)) {
- $user->mailformat = clean_param($userparams['mailformat'], PARAM_ALPHANUMEXT);
- }
-
+ $user->username = $paramuser->newusername;
try {
if( !update_user($user)) {
$updatesuccessfull = false;
$path = $directorypath . '/' . $file;
///browse the subfolder
if( is_dir($path) ) {
+ if ($file != 'db') { //we don't want to browse the 'db' subfolder of webservice folder
require_once($path."/lib.php");
$classname = $file."_server";
$protocols[] = new $classname;
+ }
}
///retrieve api.php file
else {
* @param array|struct $params
* @return integer
*/
- function get_token($params) {
+ function get_token($params) {
if ($params['username'] == 'wsuser' && $params['password'] == 'wspassword') {
return '456';
} else {
throw new moodle_exception('wrongusernamepassword');
- }
+ }
}
}
$classpath = optional_param('classpath',null,PARAM_ALPHANUM);
}
require_once(dirname(__FILE__) . '/../../'.$classpath.'/external.php');
-
/// run the server
if(isset($_GET['wsdl'])) {
$autodiscover = new Zend_Soap_AutoDiscover();
* Zend Soap sclient
*/
-require_once('../../../config.php');
-require_once('../lib.php');
+require_once('../../../../config.php');
+require_once('../../lib.php');
+
+
+
include "Zend/Loader.php";
Zend_Loader::registerAutoload();
+$PAGE->set_course($COURSE);
+$PAGE->set_url('webservice/soap/testclient/zend/zend_soap_client.php');
+
///Display Moodle page header
-print_header('Soap test client', 'Soap test client'.":", true);
+$PAGE->set_title('Soap test client');
+$PAGE->set_heading('Soap test client');
+echo $OUTPUT->header();
+//print_header('Soap test client', 'Soap test client'.":", true);
/// check that webservices are enable into your Moodle
/// WARNING: it makes sens here only because this client runs on the same machine as the
echo "<br/><br/>";
echo "Please fix the previous problem(s), the testing session has been interupted.";
echo $OUTPUT->footer();
+ // print_footer();
exit();
}
+/// Following some code in order to print the authentication WSDL into the end of the source code page
+/*
+ $client = new Zend_Http_Client($CFG->wwwroot."/webservice/soap/server.php?wsdl", array(
+ 'maxredirects' => 0,
+ 'timeout' => 30));
+ $response = $client->request();
+ $wsdl = $response->getBody();
+ print $wsdl;
+ exit();
+*/
+
+
/// authenticate => get a conversation token from the server
/// You need a wsuser/wspassword user in the remote Moodle
$client = new Zend_Soap_Client($CFG->wwwroot."/webservice/soap/server.php?wsdl");
try {
+
+ $params = new stdClass();
+ $params->username = 'wsuser';
+ $params->password = 'wspassword';
$token = $client->get_token(array('username' => "wsuser", 'password' => "wspassword"));
+ //$token = $client->get_token($params);
print "<pre>\n";
- print "<br><br><strong>Token: </strong>".$token;
+ print "<br><br><strong>Token: </strong>".$token;
print "</pre>";
} catch (exception $exception) {
print "<br><br><strong>An exception occured during authentication: \n</strong>";
/// Following some code in order to print the WSDL into the end of the source code page
/// Change the classpath to get specific service
-/*
- $client = new Zend_Http_Client($CFG->wwwroot."/webservice/soap/server.php?token=".$token."&classpath=user&wsdl", array(
- 'maxredirects' => 0,
- 'timeout' => 30));
- $response = $client->request();
- $wsdl = $response->getBody();
- print $wsdl;
- exit();
- *
- */
-
+/**
+ $client = new Zend_Http_Client($CFG->wwwroot."/webservice/soap/server.php?token=".$token."&classpath=user&wsdl", array(
+ 'maxredirects' => 0,
+ 'timeout' => 30));
+ $response = $client->request();
+ $wsdl = $response->getBody();
+ print $wsdl;
+ exit();
+ **/
+
/// build the Zend SOAP client from the remote WSDL
$client = new Zend_Soap_Client($CFG->wwwroot."/webservice/soap/server.php?token=".$token."&classpath=user&wsdl");
print "<br><br><strong>Create user:</strong>";
print "<pre>\n";
try {
- var_dump($client->create_users(array(array('username' => "mockuser66",'firstname' => "firstname6",'lastname' => "lastname6",'email' => "mockuser6@mockuser6.com",'password' => "password6"))));
+ $user = new stdClass();
+ $user->password = "password6";
+ $user->email = "mockuser6@mockuser6.com";
+ $user->username = "mockuser66";
+ $user->firstname = "firstname6";
+ $user->lastname = "lastname6";
+ var_dump($client->create_users(array('users' => array($user))));
} catch (exception $exception) {
print $exception;
print "<br><br><strong>An exception occured: \n</strong>";
print "<br><br><strong>Update user:</strong>";
print "<pre>\n";
try {
- var_dump($client->update_users(array(array('username' => "mockuser66",'newusername' => "mockuser6b",'firstname' => "firstname6b"))));
+ $user1 = new stdClass();
+ $user1->email = "mockuser6@mockuser6.com";
+ $user1->username = "mockuser66";
+ $user1->newusername = 'mockuser6b';
+ $user1->firstname = "firstname6b";
+ var_dump($client->update_users(array('users' => array($user1))));
} catch (exception $exception) {
print $exception;
print "<br><br><strong>An exception occured: \n</strong>";
print "<br><br><strong>Delete user:</strong>";
print "<pre>\n";
try {
- var_dump($client->delete_users(array(array('username' => "mockuser6b"))));
+ var_dump($client->delete_users(array('usernames' => array("mockuser6b"))));
} catch (exception $exception) {
print $exception;
print "<br><br><strong>An exception occured: \n</strong>";
/// Display Moodle page footer
echo $OUTPUT->footer();
+//print_footer();
/**
print "</pre>";
}
-?>
+?>
\ No newline at end of file
--- /dev/null
+<?php
+///////////////////////////////////////////////////////////////////////////
+// //
+// This file is part of Moodle - http://moodle.org/ //
+// Moodle - Modular Object-Oriented Dynamic Learning Environment //
+// //
+// Moodle is free software: you can redistribute it and/or modify //
+// it under the terms of the GNU General Public License as published by //
+// the Free Software Foundation, either version 3 of the License, or //
+// (at your option) any later version. //
+// //
+// Moodle is distributed in the hope that it will be useful, //
+// but WITHOUT ANY WARRANTY; without even the implied warranty of //
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
+// GNU General Public License for more details. //
+// //
+// You should have received a copy of the GNU General Public License //
+// along with Moodle. If not, see <http://www.gnu.org/licenses/>. //
+// //
+///////////////////////////////////////////////////////////////////////////
+
+/**
+ * This file generate a web service documentation in HTML
+ * This documentation describe how to call a Moodle Web Service
+ */
+require_once('../config.php');
+require_once('lib.php');
+$protocol = optional_param('protocol',"soap",PARAM_ALPHA);
+
+/// PAGE settings
+$PAGE->set_course($COURSE);
+$PAGE->set_url('webservice/wsdoc.php');
+$PAGE->set_title(get_string('wspagetitle', 'webservice'));
+$PAGE->set_heading(get_string('wspagetitle', 'webservice'));
+echo $OUTPUT->header();
+webservice_lib::display_webservices_availability($protocol);
+generate_documentation($protocol);
+generate_functionlist();
+echo $OUTPUT->footer();
+
+
+
+/**
+ * Generate documentation specific to a protocol
+ * @param string $protocol
+ */
+function generate_documentation($protocol) {
+ switch ($protocol) {
+
+ case "soap":
+ $documentation = get_string('soapdocumentation','webservice');
+ break;
+ case "xmlrpc":
+ $documentation = get_string('xmlrpcdocumentation','webservice');
+ break;
+ default:
+ break;
+ }
+ echo $documentation;
+ echo "<strong style=\"color:orange\">".get_string('wsuserreminder','webservice')."</strong>";
+
+}
+
+
+/**
+ * Generate web service function list
+ * @global object $CFG
+ */
+function generate_functionlist () {
+ global $CFG;
+ $documentation = "<H2>".get_string('functionlist','webservice')."</H2>";
+
+ //retrieve all external file
+ $externalfiles = array();
+ $externalfunctions = array();
+ setListApiFiles($externalfiles, $CFG->dirroot);
+
+ foreach ($externalfiles as $file) {
+ require($file);
+
+ $classpath = substr($file,strlen($CFG->dirroot)+1); //remove the dir root + / from the file path
+ $classpath = substr($classpath,0,strlen($classpath) - 13); //remove /external.php from the classpath
+ $classpath = str_replace('/','_',$classpath); //convert all / into _
+ $classname = $classpath."_external";
+ $api = new $classname();
+ $documentation .= "<H3><u>".get_string('moodlepath','webservice').": ".$classpath."</u></H3><ul>";
+ if ($classname == "user_external") {
+ $description = $api->get_descriptions();
+ var_dump("<pre>");
+ convertDescriptionType($description);
+ var_dump("</pre>");
+ foreach ($description as $functionname => $functiondescription) {
+ $documentation .= <<<EOF
+ <li><b>{$functionname}(</b>
+EOF;
+ $arrayparams = array();
+ $comma="";
+ foreach($functiondescription['params'] as $param => $type) {
+ // $type = converterMoodleParamIntoWsParam($type);
+ $documentation .= <<<EOF
+ <span style=color:green>{$comma} {$type} <b>{$param}</b>
+EOF;
+ if (empty($comma)) {
+ $comma = ',';
+ }
+ }
+ $documentation .= <<<EOF
+ <b></span>)</b> :
+EOF;
+ if (array_key_exists('return', $functiondescription)) {
+ foreach($functiondescription['return'] as $return => $type) {
+ // $thetype = converterMoodleParamIntoWsParam($type);
+ $documentation .= <<<EOF
+ <span style=color:blue>
+ <i>
+ {$type}</i>
+EOF;
+ if (is_array($type)) {
+ $arraytype = "<pre>".print_r($type, true)."</pre>";
+ $documentation .= <<<EOF
+ <b>{$return}</b><br/><br/><b>{$return}</b> {$arraytype} </span>
+EOF;
+ }
+ }
+ }
+
+ $documentation .= <<<EOF
+ <br/><br/><span style=color:green>
+EOF;
+ foreach($functiondescription['params'] as $param => $type) {
+
+ if (is_array($type)) {
+ $arraytype = "<pre>".print_r($type, true)."</pre>";
+ $documentation .= <<<EOF
+ <b>{$param}</b> : {$arraytype} <br>
+EOF;
+ }
+ else {
+ // $type = converterMoodleParamIntoWsParam($type);
+ $documentation .= <<<EOF
+ <b>{$param}</b> : {$type} <br>
+EOF;
+ }
+
+ }
+ $documentation .= <<<EOF
+ </div><br/><br/>
+EOF;
+
+ }
+ }
+ $documentation .= <<<EOF
+ </ul>
+EOF;
+
+ }
+
+ echo $documentation;
+
+}
+
+function convertDescriptionType(&$description) {
+ foreach ($description as &$type) {
+ if (is_array($type)) { //is it a List ?
+ convertDescriptionType($type);
+ }
+ else {
+ if (is_object($type)) { //is it a object
+ convertObjectTypes($type);
+ }
+ else { //it's a primary type
+
+ $type = converterMoodleParamIntoWsParam($type);
+ }
+ }
+
+ }
+}
+
+function convertObjectTypes(&$type) {
+ foreach (get_object_vars($type) as $propertyname => $propertytype) {
+ if (is_array($propertytype)) {
+ convertDescriptionType($propertytype);
+ $type->$propertyname = $propertytype;
+ } else {
+ $type->$propertyname = converterMoodleParamIntoWsParam($propertytype);
+ }
+ }
+}
+
+/**
+ * Convert a Moodle type (PARAM_ALPHA, PARAM_NUMBER,...) as a SOAP type (string, interger,...)
+ * @param integer $moodleparam
+ * @return string SOAP type
+ */
+function converterMoodleParamIntoWsParam($moodleparam) {
+ switch ($moodleparam) {
+ case PARAM_NUMBER:
+ return "integer";
+ break;
+ case PARAM_INT:
+ return "integer";
+ break;
+ case PARAM_BOOL:
+ return "boolean";
+ break;
+ case PARAM_ALPHANUM:
+ return "string";
+ break;
+ case PARAM_ALPHA:
+ return "string";
+ break;
+ case PARAM_RAW:
+ return "string";
+ break;
+ case PARAM_ALPHANUMEXT:
+ return "string";
+ break;
+ case PARAM_NOTAGS:
+ return "string";
+ break;
+ case PARAM_TEXT:
+ return "string";
+ break;
+ default:
+
+ //return get_object_vars($moodleparam);
+ return "object";
+ break;
+ }
+}
+
+/**
+ * Retrieve all external.php from Moodle
+ * @param array $files
+ * @param string $directorypath
+ * @return boolean result true if n
+ */
+function setListApiFiles( &$files, $directorypath ) {
+ if(is_dir($directorypath)) { //check that we are browsing a folder not a file
+
+ if( $dh = opendir($directorypath)) {
+ while( false !== ($file = readdir($dh))) {
+
+ if( $file == '.' || $file == '..') { // Skip '.' and '..'
+ continue;
+ }
+ $path = $directorypath . '/' . $file;
+ ///browse the subfolder
+ if( is_dir($path) ) {
+ setListApiFiles($files, $path);
+ }
+ ///retrieve api.php file
+ else if ($file == "external.php") {
+ $files[] = $path;
+ }
+ }
+ closedir($dh);
+
+ }
+ }
+}
+
+
+?>