mirror of
https://github.com/moodle/moodle.git
synced 2025-08-03 16:13:28 +02:00
MDL-32581 support additional format field with all text field in extrnal lib function + new possible ws params to decide how format is returned (which are stored in a singleton)
This commit is contained in:
parent
4631e39533
commit
93ce0e8296
11 changed files with 382 additions and 88 deletions
|
@ -119,9 +119,10 @@ class core_course_external extends external_api {
|
|||
$sectionvalues = array();
|
||||
$sectionvalues['id'] = $section->id;
|
||||
$sectionvalues['name'] = get_section_name($course, $section);
|
||||
$summary = file_rewrite_pluginfile_urls($section->summary, 'webservice/pluginfile.php', $context->id, 'course', 'section', $section->id);
|
||||
$sectionvalues['visible'] = $section->visible;
|
||||
$sectionvalues['summary'] = format_text($summary, $section->summaryformat);
|
||||
list($sectionvalues['summary'], $sectionvalues['summaryformat']) =
|
||||
external_format_text($section->summary, $section->summaryformat,
|
||||
$context->id, 'course', 'section', $section->id);
|
||||
$sectioncontents = array();
|
||||
|
||||
//for each module of the section
|
||||
|
@ -205,6 +206,7 @@ class core_course_external extends external_api {
|
|||
'name' => new external_value(PARAM_TEXT, 'Section name'),
|
||||
'visible' => new external_value(PARAM_INT, 'is the section visible', VALUE_OPTIONAL),
|
||||
'summary' => new external_value(PARAM_RAW, 'Section description'),
|
||||
'summaryformat' => new external_format_value('summary'),
|
||||
'modules' => new external_multiple_structure(
|
||||
new external_single_structure(
|
||||
array(
|
||||
|
@ -311,8 +313,8 @@ class core_course_external extends external_api {
|
|||
$courseinfo['fullname'] = $course->fullname;
|
||||
$courseinfo['shortname'] = $course->shortname;
|
||||
$courseinfo['categoryid'] = $course->category;
|
||||
$courseinfo['summary'] = $course->summary;
|
||||
$courseinfo['summaryformat'] = $course->summaryformat;
|
||||
list($courseinfo['summary'], $courseinfo['summaryformat']) =
|
||||
external_format_text($course->summary, $course->summaryformat, $context->id, 'course', 'summary', 0);
|
||||
$courseinfo['format'] = $course->format;
|
||||
$courseinfo['startdate'] = $course->startdate;
|
||||
$courseinfo['numsections'] = $course->numsections;
|
||||
|
@ -367,8 +369,7 @@ class core_course_external extends external_api {
|
|||
'fullname' => new external_value(PARAM_TEXT, 'full name'),
|
||||
'idnumber' => new external_value(PARAM_RAW, 'id number', VALUE_OPTIONAL),
|
||||
'summary' => new external_value(PARAM_RAW, 'summary'),
|
||||
'summaryformat' => new external_value(PARAM_INT,
|
||||
'the summary text Moodle format'),
|
||||
'summaryformat' => new external_format_value('summary'),
|
||||
'format' => new external_value(PARAM_PLUGIN,
|
||||
'course format: weeks, topics, social, site,..'),
|
||||
'showgrades' => new external_value(PARAM_INT,
|
||||
|
@ -435,8 +436,7 @@ class core_course_external extends external_api {
|
|||
'categoryid' => new external_value(PARAM_INT, 'category id'),
|
||||
'idnumber' => new external_value(PARAM_RAW, 'id number', VALUE_OPTIONAL),
|
||||
'summary' => new external_value(PARAM_RAW, 'summary', VALUE_OPTIONAL),
|
||||
'summaryformat' => new external_value(PARAM_INT,
|
||||
'the summary text Moodle format', VALUE_DEFAULT, FORMAT_MOODLE),
|
||||
'summaryformat' => new external_format_value('summary', VALUE_DEFAULT),
|
||||
'format' => new external_value(PARAM_PLUGIN,
|
||||
'course format: weeks, topics, social, site,..',
|
||||
VALUE_DEFAULT, $courseconfig->format),
|
||||
|
@ -560,6 +560,9 @@ class core_course_external extends external_api {
|
|||
|
||||
$course['category'] = $course['categoryid'];
|
||||
|
||||
// Summary format.
|
||||
$course['summaryformat'] = external_validate_format($course['summaryformat']);
|
||||
|
||||
//Note: create_course() core function check shortname, idnumber, category
|
||||
$course['id'] = create_course((object) $course)->id;
|
||||
|
||||
|
@ -1085,13 +1088,9 @@ class core_course_external extends external_api {
|
|||
$categoryinfo = array();
|
||||
$categoryinfo['id'] = $category->id;
|
||||
$categoryinfo['name'] = $category->name;
|
||||
$categoryinfo['description'] = file_rewrite_pluginfile_urls($category->description,
|
||||
'webservice/pluginfile.php', $context->id, 'coursecat', 'description', null);
|
||||
$options = new stdClass;
|
||||
$options->noclean = true;
|
||||
$options->para = false;
|
||||
$categoryinfo['description'] = format_text($categoryinfo['description'],
|
||||
$category->descriptionformat, $options);
|
||||
list($categoryinfo['description'], $categoryinfo['descriptionformat']) =
|
||||
external_format_text($category->description, $category->descriptionformat,
|
||||
$context->id, 'coursecat', 'description', null);
|
||||
$categoryinfo['parent'] = $category->parent;
|
||||
$categoryinfo['sortorder'] = $category->sortorder;
|
||||
$categoryinfo['coursecount'] = $category->coursecount;
|
||||
|
@ -1160,6 +1159,7 @@ class core_course_external extends external_api {
|
|||
'name' => new external_value(PARAM_TEXT, 'category name'),
|
||||
'idnumber' => new external_value(PARAM_RAW, 'category id number', VALUE_OPTIONAL),
|
||||
'description' => new external_value(PARAM_RAW, 'category description'),
|
||||
'descriptionformat' => new external_format_value('description'),
|
||||
'parent' => new external_value(PARAM_INT, 'parent category id'),
|
||||
'sortorder' => new external_value(PARAM_INT, 'category sorting order'),
|
||||
'coursecount' => new external_value(PARAM_INT, 'number of courses in this category'),
|
||||
|
@ -1193,6 +1193,7 @@ class core_course_external extends external_api {
|
|||
'the new category idnumber', VALUE_OPTIONAL),
|
||||
'description' => new external_value(PARAM_RAW,
|
||||
'the new category description', VALUE_OPTIONAL),
|
||||
'descriptionformat' => new external_format_value('description', VALUE_DEFAULT),
|
||||
'theme' => new external_value(PARAM_THEME,
|
||||
'the new category theme. This option must be enabled on moodle',
|
||||
VALUE_OPTIONAL),
|
||||
|
@ -1257,7 +1258,7 @@ class core_course_external extends external_api {
|
|||
if (!empty($category['description'])) {
|
||||
$newcategory->description = $category['description'];
|
||||
}
|
||||
$newcategory->descriptionformat = FORMAT_HTML;
|
||||
$newcategory->descriptionformat = external_validate_format($category['descriptionformat']);
|
||||
if (isset($category['theme']) and !empty($CFG->allowcategorythemes)) {
|
||||
$newcategory->theme = $category['theme'];
|
||||
}
|
||||
|
@ -1308,6 +1309,7 @@ class core_course_external extends external_api {
|
|||
'idnumber' => new external_value(PARAM_RAW, 'category id number', VALUE_OPTIONAL),
|
||||
'parent' => new external_value(PARAM_INT, 'parent category id', VALUE_OPTIONAL),
|
||||
'description' => new external_value(PARAM_RAW, 'category description', VALUE_OPTIONAL),
|
||||
'descriptionformat' => new external_format_value('description', VALUE_DEFAULT),
|
||||
'theme' => new external_value(PARAM_THEME,
|
||||
'the category theme. This option must be enabled on moodle', VALUE_OPTIONAL),
|
||||
)
|
||||
|
@ -1356,7 +1358,7 @@ class core_course_external extends external_api {
|
|||
}
|
||||
if (!empty($cat['description'])) {
|
||||
$category->description = $cat['description'];
|
||||
$category->descriptionformat = FORMAT_HTML;
|
||||
$category->descriptionformat = external_validate_format($cat['descriptionformat']);
|
||||
}
|
||||
if (!empty($cat['theme'])) {
|
||||
$category->theme = $cat['theme'];
|
||||
|
|
|
@ -277,7 +277,7 @@ class core_enrol_external extends external_api {
|
|||
'firstaccess' => new external_value(PARAM_INT, 'first access to the site (0 if never)', VALUE_OPTIONAL),
|
||||
'lastaccess' => new external_value(PARAM_INT, 'last access to the site (0 if never)', VALUE_OPTIONAL),
|
||||
'description' => new external_value(PARAM_RAW, 'User profile description', VALUE_OPTIONAL),
|
||||
'descriptionformat' => new external_value(PARAM_INT, 'User profile description format', VALUE_OPTIONAL),
|
||||
'descriptionformat' => new external_format_value('description', VALUE_OPTIONAL),
|
||||
'city' => new external_value(PARAM_NOTAGS, 'Home city of the user', VALUE_OPTIONAL),
|
||||
'url' => new external_value(PARAM_URL, 'URL of the user', VALUE_OPTIONAL),
|
||||
'country' => new external_value(PARAM_ALPHA, 'Home country code of the user, such as AU or CZ', VALUE_OPTIONAL),
|
||||
|
@ -298,6 +298,7 @@ class core_enrol_external extends external_api {
|
|||
'id' => new external_value(PARAM_INT, 'group id'),
|
||||
'name' => new external_value(PARAM_RAW, 'group name'),
|
||||
'description' => new external_value(PARAM_RAW, 'group description'),
|
||||
'descriptionformat' => new external_format_value('description'),
|
||||
)
|
||||
), 'user groups', VALUE_OPTIONAL),
|
||||
'roles' => new external_multiple_structure(
|
||||
|
|
|
@ -52,6 +52,7 @@ class core_group_external extends external_api {
|
|||
'courseid' => new external_value(PARAM_INT, 'id of course'),
|
||||
'name' => new external_value(PARAM_TEXT, 'multilang compatible name, course unique'),
|
||||
'description' => new external_value(PARAM_RAW, 'group description text'),
|
||||
'descriptionformat' => new external_format_value('description', VALUE_DEFAULT),
|
||||
'enrolmentkey' => new external_value(PARAM_RAW, 'group enrol secret phrase'),
|
||||
)
|
||||
), 'List of group object. A group has a courseid, a name, a description and an enrolment key.'
|
||||
|
@ -99,6 +100,9 @@ class core_group_external extends external_api {
|
|||
}
|
||||
require_capability('moodle/course:managegroups', $context);
|
||||
|
||||
// Validate format.
|
||||
$group->descriptionformat = external_validate_format($group->descriptionformat);
|
||||
|
||||
// finally create the group
|
||||
$group->id = groups_create_group($group, false);
|
||||
$groups[] = (array)$group;
|
||||
|
@ -123,6 +127,7 @@ class core_group_external extends external_api {
|
|||
'courseid' => new external_value(PARAM_INT, 'id of course'),
|
||||
'name' => new external_value(PARAM_TEXT, 'multilang compatible name, course unique'),
|
||||
'description' => new external_value(PARAM_RAW, 'group description text'),
|
||||
'descriptionformat' => new external_format_value('description'),
|
||||
'enrolmentkey' => new external_value(PARAM_RAW, 'group enrol secret phrase'),
|
||||
)
|
||||
), 'List of group object. A group has an id, a courseid, a name, a description and an enrolment key.'
|
||||
|
@ -157,7 +162,7 @@ class core_group_external extends external_api {
|
|||
$groups = array();
|
||||
foreach ($params['groupids'] as $groupid) {
|
||||
// validate params
|
||||
$group = groups_get_group($groupid, 'id, courseid, name, description, enrolmentkey', MUST_EXIST);
|
||||
$group = groups_get_group($groupid, 'id, courseid, name, description, descriptionformat, enrolmentkey', MUST_EXIST);
|
||||
|
||||
// now security checks
|
||||
$context = get_context_instance(CONTEXT_COURSE, $group->courseid);
|
||||
|
@ -171,6 +176,10 @@ class core_group_external extends external_api {
|
|||
}
|
||||
require_capability('moodle/course:managegroups', $context);
|
||||
|
||||
list($group->description, $group->descriptionformat) =
|
||||
external_format_text($group->description, $group->descriptionformat,
|
||||
$context->id, 'group', 'description', $group->id);
|
||||
|
||||
$groups[] = (array)$group;
|
||||
}
|
||||
|
||||
|
@ -191,6 +200,7 @@ class core_group_external extends external_api {
|
|||
'courseid' => new external_value(PARAM_INT, 'id of course'),
|
||||
'name' => new external_value(PARAM_TEXT, 'multilang compatible name, course unique'),
|
||||
'description' => new external_value(PARAM_RAW, 'group description text'),
|
||||
'descriptionformat' => new external_format_value('description'),
|
||||
'enrolmentkey' => new external_value(PARAM_RAW, 'group enrol secret phrase'),
|
||||
)
|
||||
)
|
||||
|
@ -233,10 +243,14 @@ class core_group_external extends external_api {
|
|||
}
|
||||
require_capability('moodle/course:managegroups', $context);
|
||||
|
||||
$gs = groups_get_all_groups($params['courseid'], 0, 0, 'g.id, g.courseid, g.name, g.description, g.enrolmentkey');
|
||||
$gs = groups_get_all_groups($params['courseid'], 0, 0,
|
||||
'g.id, g.courseid, g.name, g.description, g.descriptionformat, g.enrolmentkey');
|
||||
|
||||
$groups = array();
|
||||
foreach ($gs as $group) {
|
||||
list($group->description, $group->descriptionformat) =
|
||||
external_format_text($group->description, $group->descriptionformat,
|
||||
$context->id, 'group', 'description', $group->id);
|
||||
$groups[] = (array)$group;
|
||||
}
|
||||
|
||||
|
@ -257,6 +271,7 @@ class core_group_external extends external_api {
|
|||
'courseid' => new external_value(PARAM_INT, 'id of course'),
|
||||
'name' => new external_value(PARAM_TEXT, 'multilang compatible name, course unique'),
|
||||
'description' => new external_value(PARAM_RAW, 'group description text'),
|
||||
'descriptionformat' => new external_format_value('description'),
|
||||
'enrolmentkey' => new external_value(PARAM_RAW, 'group enrol secret phrase'),
|
||||
)
|
||||
)
|
||||
|
@ -557,7 +572,8 @@ class core_group_external extends external_api {
|
|||
array(
|
||||
'courseid' => new external_value(PARAM_INT, 'id of course'),
|
||||
'name' => new external_value(PARAM_TEXT, 'multilang compatible name, course unique'),
|
||||
'description' => new external_value(PARAM_RAW, 'grouping description text')
|
||||
'description' => new external_value(PARAM_RAW, 'grouping description text'),
|
||||
'descriptionformat' => new external_format_value('descripiton', VALUE_DEFAULT)
|
||||
)
|
||||
), 'List of grouping object. A grouping has a courseid, a name and a description.'
|
||||
)
|
||||
|
@ -604,8 +620,7 @@ class core_group_external extends external_api {
|
|||
}
|
||||
require_capability('moodle/course:managegroups', $context);
|
||||
|
||||
// We must force allways FORMAT_HTML.
|
||||
$grouping->descriptionformat = FORMAT_HTML;
|
||||
$grouping->descriptionformat = external_validate_format($grouping->descriptionformat);
|
||||
|
||||
// Finally create the grouping.
|
||||
$grouping->id = groups_create_grouping($grouping);
|
||||
|
@ -630,7 +645,8 @@ class core_group_external extends external_api {
|
|||
'id' => new external_value(PARAM_INT, 'grouping record id'),
|
||||
'courseid' => new external_value(PARAM_INT, 'id of course'),
|
||||
'name' => new external_value(PARAM_TEXT, 'multilang compatible name, course unique'),
|
||||
'description' => new external_value(PARAM_CLEANHTML, 'grouping description text')
|
||||
'description' => new external_value(PARAM_RAW, 'grouping description text'),
|
||||
'descriptionformat' => new external_format_value('description')
|
||||
)
|
||||
), 'List of grouping object. A grouping has an id, a courseid, a name and a description.'
|
||||
);
|
||||
|
@ -650,7 +666,8 @@ class core_group_external extends external_api {
|
|||
array(
|
||||
'id' => new external_value(PARAM_INT, 'id of grouping'),
|
||||
'name' => new external_value(PARAM_TEXT, 'multilang compatible name, course unique'),
|
||||
'description' => new external_value(PARAM_RAW, 'grouping description text')
|
||||
'description' => new external_value(PARAM_RAW, 'grouping description text'),
|
||||
'descriptionformat' => new external_format_value('description', VALUE_DEFAULT)
|
||||
)
|
||||
), 'List of grouping object. A grouping has a courseid, a name and a description.'
|
||||
)
|
||||
|
@ -705,7 +722,7 @@ class core_group_external extends external_api {
|
|||
require_capability('moodle/course:managegroups', $context);
|
||||
|
||||
// We must force allways FORMAT_HTML.
|
||||
$grouping->descriptionformat = FORMAT_HTML;
|
||||
$grouping->descriptionformat = external_validate_format($grouping->descriptionformat);
|
||||
|
||||
// Finally update the grouping.
|
||||
groups_update_grouping($grouping);
|
||||
|
@ -772,12 +789,9 @@ class core_group_external extends external_api {
|
|||
}
|
||||
require_capability('moodle/course:managegroups', $context);
|
||||
|
||||
$grouping->description = file_rewrite_pluginfile_urls($grouping->description, 'webservice/pluginfile.php', $context->id, 'grouping', 'description', $grouping->id);
|
||||
|
||||
$options = new stdClass;
|
||||
$options->noclean = true;
|
||||
$options->para = false;
|
||||
$grouping->description = format_text($grouping->description, FORMAT_HTML, $options);
|
||||
list($grouping->description, $grouping->descriptionformat) =
|
||||
external_format_text($grouping->description, $grouping->descriptionformat,
|
||||
$context->id, 'grouping', 'description', $grouping->id);
|
||||
|
||||
$groupings[] = (array)$grouping;
|
||||
}
|
||||
|
@ -798,7 +812,8 @@ class core_group_external extends external_api {
|
|||
'id' => new external_value(PARAM_INT, 'grouping record id'),
|
||||
'courseid' => new external_value(PARAM_INT, 'id of course'),
|
||||
'name' => new external_value(PARAM_TEXT, 'multilang compatible name, course unique'),
|
||||
'description' => new external_value(PARAM_CLEANHTML, 'grouping description text')
|
||||
'description' => new external_value(PARAM_RAW, 'grouping description text'),
|
||||
'descriptionformat' => new external_format_value('description')
|
||||
)
|
||||
)
|
||||
);
|
||||
|
@ -849,13 +864,9 @@ class core_group_external extends external_api {
|
|||
|
||||
$groupings = array();
|
||||
foreach ($gs as $grouping) {
|
||||
$grouping->description = file_rewrite_pluginfile_urls($grouping->description, 'webservice/pluginfile.php', $context->id, 'grouping', 'description', $grouping->id);
|
||||
|
||||
$options = new stdClass;
|
||||
$options->noclean = true;
|
||||
$options->para = false;
|
||||
$grouping->description = format_text($grouping->description, FORMAT_HTML, $options);
|
||||
|
||||
list($grouping->description, $grouping->descriptionformat) =
|
||||
external_format_text($grouping->description, $grouping->descriptionformat,
|
||||
$context->id, 'grouping', 'description', $grouping->id);
|
||||
$groupings[] = (array)$grouping;
|
||||
}
|
||||
|
||||
|
@ -875,7 +886,8 @@ class core_group_external extends external_api {
|
|||
'id' => new external_value(PARAM_INT, 'grouping record id'),
|
||||
'courseid' => new external_value(PARAM_INT, 'id of course'),
|
||||
'name' => new external_value(PARAM_TEXT, 'multilang compatible name, course unique'),
|
||||
'description' => new external_value(PARAM_CLEANHTML, 'grouping description text')
|
||||
'description' => new external_value(PARAM_RAW, 'grouping description text'),
|
||||
'descriptionformat' => new external_format_value('description')
|
||||
)
|
||||
)
|
||||
);
|
||||
|
|
|
@ -584,19 +584,242 @@ function external_delete_descriptions($component) {
|
|||
}
|
||||
|
||||
/**
|
||||
* Creates a warnings external_multiple_structure
|
||||
* Standard Moodle web service warnings
|
||||
*
|
||||
* @return external_multiple_structure
|
||||
* @since Moodle 2.3
|
||||
* @package core_webservice
|
||||
* @copyright 2012 Jerome Mouneyrac
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
* @since Moodle 2.3
|
||||
*/
|
||||
function external_warnings() {
|
||||
return new external_multiple_structure(
|
||||
new external_single_structure(array(
|
||||
'item' => new external_value(PARAM_TEXT, 'item', VALUE_OPTIONAL),
|
||||
'itemid' => new external_value(PARAM_INT, 'item id', VALUE_OPTIONAL),
|
||||
'warningcode' => new external_value(PARAM_ALPHANUM, 'the warning code can be used by
|
||||
the client app to implement specific behaviour'),
|
||||
'message' => new external_value(PARAM_TEXT, 'untranslated english message to explain the warning')
|
||||
), 'warning'), 'list of warnings', VALUE_OPTIONAL
|
||||
);
|
||||
class external_warnings extends external_multiple_structure {
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @since Moodle 2.3
|
||||
*/
|
||||
public function __construct() {
|
||||
|
||||
parent::__construct(
|
||||
new external_single_structure(
|
||||
array(
|
||||
'item' => new external_value(PARAM_TEXT, 'item', VALUE_OPTIONAL),
|
||||
'itemid' => new external_value(PARAM_INT, 'item id', VALUE_OPTIONAL),
|
||||
'warningcode' => new external_value(PARAM_ALPHANUM,
|
||||
'the warning code can be used by the client app to implement specific behaviour'),
|
||||
'message' => new external_value(PARAM_TEXT,
|
||||
'untranslated english message to explain the warning')
|
||||
), 'warning'),
|
||||
'list of warnings', VALUE_OPTIONAL);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A pre-filled external_value class for text format.
|
||||
*
|
||||
* Default is FORMAT_HTML
|
||||
* This should be used all the time in external xxx_params()/xxx_returns functions
|
||||
* as it is the standard way to implement text format param/return values.
|
||||
*
|
||||
* @package core_webservice
|
||||
* @copyright 2012 Jerome Mouneyrac
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
* @since Moodle 2.3
|
||||
*/
|
||||
class external_format_value extends external_value {
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param string $textfieldname Name of the text field
|
||||
* @param int $required if VALUE_REQUIRED then set standard default FORMAT_HTML
|
||||
* @since Moodle 2.3
|
||||
*/
|
||||
public function __construct($textfieldname, $required = VALUE_REQUIRED) {
|
||||
|
||||
$default = ($required == VALUE_DEFAULT) ? FORMAT_HTML : null;
|
||||
|
||||
$desc = $textfieldname . ' format (' . FORMAT_HTML . ' = HTML, '
|
||||
. FORMAT_MOODLE . ' = MOODLE, '
|
||||
. FORMAT_PLAIN . ' = PLAIN or '
|
||||
. FORMAT_MARKDOWN . ' = MARKDOWN)';
|
||||
|
||||
parent::__construct($type, $desc='', $required, $default);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate text field format against known FORMAT_XXX
|
||||
*
|
||||
* @param array $format the format to validate
|
||||
* @return the validated format
|
||||
* @throws coding_exception
|
||||
* @since 2.3
|
||||
*/
|
||||
function external_validate_format($format) {
|
||||
$allowedformats = array(FORMAT_HTML, FORMAT_MOODLE, FORMAT_PLAIN, FORMAT_MARKDOWN);
|
||||
if (!in_array($format, $allowedformats)) {
|
||||
throw new moodle_exception('formatnotsupported', 'webservice', '' , null,
|
||||
'The format with value=' . $format . ' is not supported by this Moodle site');
|
||||
}
|
||||
return $format;
|
||||
}
|
||||
|
||||
/**
|
||||
* Format the text to be returned properly as requested by the either the web service server,
|
||||
* either by an internally call.
|
||||
* The caller can change the format (raw, filter, file, fileurl) with the external_settings singleton
|
||||
* All web service servers must set this singleton when parsing the $_GET and $_POST.
|
||||
*
|
||||
* @param string $text The content that may contain ULRs in need of rewriting.
|
||||
* @param int $textformat The text format, by default FORMAT_HTML.
|
||||
* @param int $contextid This parameter and the next two identify the file area to use.
|
||||
* @param string $component
|
||||
* @param string $filearea helps identify the file area.
|
||||
* @param int $itemid helps identify the file area.
|
||||
* @return array text + textformat
|
||||
* @since Moodle 2.3
|
||||
*/
|
||||
function external_format_text($text, $textformat, $contextid, $component, $filearea, $itemid) {
|
||||
global $CFG;
|
||||
|
||||
// Get settings (singleton).
|
||||
$settings = external_settings::get_instance();
|
||||
|
||||
if ($settings->get_fileurl()) {
|
||||
$text = file_rewrite_pluginfile_urls($text, $settings->get_file(), $contextid, $component, $filearea, $itemid);
|
||||
}
|
||||
|
||||
if (!$settings->get_raw()) {
|
||||
$textformat = FORMAT_HTML; // Force format to HTML when not raw.
|
||||
$text = format_text($text, $textformat,
|
||||
array('noclean' => true, 'para' => false, 'filter' => $settings->get_filter()));
|
||||
}
|
||||
|
||||
return array($text, $textformat);
|
||||
}
|
||||
|
||||
/**
|
||||
* Singleton to handle the external settings.
|
||||
*
|
||||
* We use singleton to encapsulate the "logic"
|
||||
*
|
||||
* @package core_webservice
|
||||
* @copyright 2012 Jerome Mouneyrac
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
* @since Moodle 2.3
|
||||
*/
|
||||
class external_settings {
|
||||
|
||||
/** @var object the singleton instance */
|
||||
public static $instance = null;
|
||||
|
||||
/** @var boolean Should the external function return raw text or formatted */
|
||||
private $raw = false;
|
||||
|
||||
/** @var boolean Should the external function filter the text */
|
||||
private $filter = false;
|
||||
|
||||
/** @var boolean Should the external function rewrite plugin file url */
|
||||
private $fileurl = true;
|
||||
|
||||
/** @var string In which file should the urls be rewritten */
|
||||
private $file = 'webservice/pluginfile.php';
|
||||
|
||||
/**
|
||||
* Constructor - protected - can not be instanciated
|
||||
*/
|
||||
protected function __construct() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Clone - private - can not be cloned
|
||||
*/
|
||||
private final function __clone() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Return only one instance
|
||||
*
|
||||
* @return object
|
||||
*/
|
||||
public static function get_instance() {
|
||||
if (self::$instance === null) {
|
||||
self::$instance = new external_settings;
|
||||
}
|
||||
|
||||
return self::$instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set raw
|
||||
*
|
||||
* @param boolean $raw
|
||||
*/
|
||||
public function set_raw($raw) {
|
||||
$this->raw = $raw;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get raw
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function get_raw() {
|
||||
return $this->raw;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set filter
|
||||
*
|
||||
* @param boolean $filter
|
||||
*/
|
||||
public function set_filter($filter) {
|
||||
$this->filter = $filter;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get filter
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function get_filter() {
|
||||
return $this->filter;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set fileurl
|
||||
*
|
||||
* @param boolean $fileurl
|
||||
*/
|
||||
public function set_fileurl($fileurl) {
|
||||
$this->fileurl = $fileurl;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get fileurl
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function get_fileurl() {
|
||||
return $this->fileurl;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set file
|
||||
*
|
||||
* @param string $file
|
||||
*/
|
||||
public function set_file($file) {
|
||||
$this->file = $file;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get file
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get_file() {
|
||||
return $this->file;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -50,7 +50,8 @@ class core_message_external extends external_api {
|
|||
new external_single_structure(
|
||||
array(
|
||||
'touserid' => new external_value(PARAM_INT, 'id of the user to send the private message'),
|
||||
'text' => new external_value(PARAM_RAW, 'the text of the message - not that you can send anything it will be automatically cleaned to PARAM_TEXT and used againt MOODLE_FORMAT'),
|
||||
'text' => new external_value(PARAM_RAW, 'the text of the message'),
|
||||
'textformat' => new external_format_value('text', VALUE_DEFAULT),
|
||||
'clientmsgid' => new external_value(PARAM_ALPHANUMEXT, 'your own client id for the message. If this id is provided, the fail message id will be returned to you', VALUE_OPTIONAL),
|
||||
)
|
||||
)
|
||||
|
@ -111,7 +112,6 @@ class core_message_external extends external_api {
|
|||
|
||||
$resultmessages = array();
|
||||
foreach ($params['messages'] as $message) {
|
||||
$text = clean_param($message['text'], PARAM_TEXT);
|
||||
$resultmsg = array(); //the infos about the success of the operation
|
||||
|
||||
//we are going to do some checking
|
||||
|
@ -143,7 +143,8 @@ class core_message_external extends external_api {
|
|||
//now we can send the message (at least try)
|
||||
if ($success) {
|
||||
//TODO MDL-31118 performance improvement - edit the function so we can pass an array instead one touser object
|
||||
$success = message_post_message($USER, $tousers[$message['touserid']], $text, FORMAT_MOODLE);
|
||||
$success = message_post_message($USER, $tousers[$message['touserid']],
|
||||
$message['text'], external_validate_format($message['textformat']));
|
||||
}
|
||||
|
||||
//build the resultmsg
|
||||
|
@ -153,6 +154,9 @@ class core_message_external extends external_api {
|
|||
if ($success) {
|
||||
$resultmsg['msgid'] = $success;
|
||||
} else {
|
||||
// WARNINGS: for backward compatibility we return this errormessage.
|
||||
// We should have thrown exceptions as these errors prevent results to be returned.
|
||||
// See http://docs.moodle.org/dev/Errors_handling_in_web_services#When_to_send_a_warning_on_the_server_side .
|
||||
$resultmsg['msgid'] = -1;
|
||||
$resultmsg['errormessage'] = $errormessage;
|
||||
}
|
||||
|
|
|
@ -53,7 +53,11 @@ class core_notes_external extends external_api {
|
|||
'publishstate' => new external_value(PARAM_ALPHA, '\'personal\', \'course\' or \'site\''),
|
||||
'courseid' => new external_value(PARAM_INT, 'course id of the note (in Moodle a note can only be created into a course, even for site and personal notes)'),
|
||||
'text' => new external_value(PARAM_RAW, 'the text of the message - text or HTML'),
|
||||
'format' => new external_value(PARAM_ALPHA, '\'text\' or \'html\'', VALUE_DEFAULT, 'text'),
|
||||
'format' => new external_value(PARAM_ALPHANUMEXT, // For backward compatibility it can not be PARAM_INT, so we don't use external_format_value.
|
||||
'text format (' . FORMAT_HTML . ' = HTML, '
|
||||
. FORMAT_MOODLE . ' = MOODLE, '
|
||||
. FORMAT_PLAIN . ' = PLAIN or '
|
||||
. FORMAT_MARKDOWN . ' = MARKDOWN)', VALUE_DEFAULT, FORMAT_HTML),
|
||||
'clientnoteid' => new external_value(PARAM_ALPHANUMEXT, 'your own client id for the note. If this id is provided, the fail message id will be returned to you', VALUE_OPTIONAL),
|
||||
)
|
||||
)
|
||||
|
@ -130,18 +134,19 @@ class core_notes_external extends external_api {
|
|||
$dbnote = new stdClass;
|
||||
$dbnote->courseid = $note['courseid'];
|
||||
$dbnote->userid = $note['userid'];
|
||||
//clean param text and set format accordingly
|
||||
// Need to support 'html' and 'text' format values for backward compatibility.
|
||||
switch (strtolower($note['format'])) {
|
||||
case 'html':
|
||||
$dbnote->content = clean_param($note['text'], PARAM_CLEANHTML);
|
||||
$dbnote->format = FORMAT_HTML;
|
||||
$textformat = FORMAT_HTML;
|
||||
break;
|
||||
case 'text':
|
||||
$textformat = FORMAT_PLAIN;
|
||||
default:
|
||||
$dbnote->content = clean_param($note['text'], PARAM_TEXT);
|
||||
$dbnote->format = FORMAT_PLAIN;
|
||||
$textformat = external_validate_format($note['format']);
|
||||
break;
|
||||
}
|
||||
$dbnote->content = $note['text'];
|
||||
$dbnote->format = $textformat;
|
||||
|
||||
//get the state ('personal', 'course', 'site')
|
||||
switch ($note['publishstate']) {
|
||||
|
@ -169,6 +174,9 @@ class core_notes_external extends external_api {
|
|||
|
||||
$resultnote['noteid'] = $success;
|
||||
} else {
|
||||
// WARNINGS: for backward compatibility we return this errormessage.
|
||||
// We should have thrown exceptions as these errors prevent results to be returned.
|
||||
// See http://docs.moodle.org/dev/Errors_handling_in_web_services#When_to_send_a_warning_on_the_server_side .
|
||||
$resultnote['noteid'] = -1;
|
||||
$resultnote['errormessage'] = $errormessage;
|
||||
}
|
||||
|
|
|
@ -473,7 +473,7 @@ class core_user_external extends external_api {
|
|||
'timezone' => new external_value(PARAM_TIMEZONE, 'Timezone code such as Australia/Perth, or 99 for default', VALUE_OPTIONAL),
|
||||
'mailformat' => new external_value(PARAM_INTEGER, 'Mail format code is 0 for plain text, 1 for HTML etc', VALUE_OPTIONAL),
|
||||
'description' => new external_value(PARAM_RAW, 'User profile description', VALUE_OPTIONAL),
|
||||
'descriptionformat' => new external_value(PARAM_INT, 'User profile description format', VALUE_OPTIONAL),
|
||||
'descriptionformat' => new external_format_value('description', VALUE_OPTIONAL),
|
||||
'city' => new external_value(PARAM_NOTAGS, 'Home city of the user', VALUE_OPTIONAL),
|
||||
'url' => new external_value(PARAM_URL, 'URL of the user', VALUE_OPTIONAL),
|
||||
'country' => new external_value(PARAM_ALPHA, 'Home country code of the user, such as AU or CZ', VALUE_OPTIONAL),
|
||||
|
@ -618,7 +618,7 @@ class core_user_external extends external_api {
|
|||
'firstaccess' => new external_value(PARAM_INT, 'first access to the site (0 if never)', VALUE_OPTIONAL),
|
||||
'lastaccess' => new external_value(PARAM_INT, 'last access to the site (0 if never)', VALUE_OPTIONAL),
|
||||
'description' => new external_value(PARAM_RAW, 'User profile description', VALUE_OPTIONAL),
|
||||
'descriptionformat' => new external_value(PARAM_INT, 'User profile description format', VALUE_OPTIONAL),
|
||||
'descriptionformat' => new external_format_value('description', VALUE_OPTIONAL),
|
||||
'city' => new external_value(PARAM_NOTAGS, 'Home city of the user', VALUE_OPTIONAL),
|
||||
'url' => new external_value(PARAM_URL, 'URL of the user', VALUE_OPTIONAL),
|
||||
'country' => new external_value(PARAM_ALPHA, 'Home country code of the user, such as AU or CZ', VALUE_OPTIONAL),
|
||||
|
@ -639,6 +639,7 @@ class core_user_external extends external_api {
|
|||
'id' => new external_value(PARAM_INT, 'group id'),
|
||||
'name' => new external_value(PARAM_RAW, 'group name'),
|
||||
'description' => new external_value(PARAM_RAW, 'group description'),
|
||||
'descriptionformat' => new external_format_value('description'),
|
||||
)
|
||||
), 'user groups', VALUE_OPTIONAL),
|
||||
'roles' => new external_multiple_structure(
|
||||
|
|
23
user/lib.php
23
user/lib.php
|
@ -171,6 +171,10 @@ function user_get_users_by_id($userids) {
|
|||
*
|
||||
* Give user record from mdl_user, build an array conntains
|
||||
* all user details
|
||||
*
|
||||
* Warning: description file urls are 'webservice/pluginfile.php' is use.
|
||||
* it can be changed with $CFG->moodlewstextformatlinkstoimagesfile
|
||||
*
|
||||
* @param stdClass $user user record from mdl_user
|
||||
* @param stdClass $context context object
|
||||
* @param stdClass $course moodle course
|
||||
|
@ -319,11 +323,10 @@ function user_get_user_details($user, $course = null, array $userfields = array(
|
|||
if (!$cannotviewdescription) {
|
||||
|
||||
if (in_array('description', $userfields)) {
|
||||
$user->description = file_rewrite_pluginfile_urls($user->description, 'pluginfile.php', $usercontext->id, 'user', 'profile', null);
|
||||
$userdetails['description'] = $user->description;
|
||||
}
|
||||
if (in_array('descriptionformat', $userfields)) {
|
||||
$userdetails['descriptionformat'] = $user->descriptionformat;
|
||||
// Always return the descriptionformat if description is requested.
|
||||
list($userdetails['description'], $userdetails['descriptionformat']) =
|
||||
external_format_text($user->description, $user->descriptionformat,
|
||||
$usercontext->id, 'user', 'profile', null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -417,11 +420,15 @@ function user_get_user_details($user, $course = null, array $userfields = array(
|
|||
|
||||
// If groups are in use and enforced throughout the course, then make sure we can meet in at least one course level group
|
||||
if (in_array('groups', $userfields) && !empty($course) && $canaccessallgroups) {
|
||||
$usergroups = groups_get_all_groups($course->id, $user->id, $course->defaultgroupingid, 'g.id, g.name,g.description');
|
||||
$usergroups = groups_get_all_groups($course->id, $user->id, $course->defaultgroupingid,
|
||||
'g.id, g.name,g.description,g.descriptionformat');
|
||||
$userdetails['groups'] = array();
|
||||
foreach ($usergroups as $group) {
|
||||
$group->description = file_rewrite_pluginfile_urls($group->description, 'pluginfile.php', $context->id, 'group', 'description', $group->id);
|
||||
$userdetails['groups'][] = array('id'=>$group->id, 'name'=>$group->name, 'description'=>$group->description);
|
||||
list($group->description, $group->descriptionformat) =
|
||||
external_format_text($group->description, $group->descriptionformat,
|
||||
$context->id, 'group', 'description', $group->id);
|
||||
$userdetails['groups'][] = array('id'=>$group->id, 'name'=>$group->name,
|
||||
'description'=>$group->description, 'descriptionformat'=>$group->descriptionformat);
|
||||
}
|
||||
}
|
||||
//list of courses where the user is enrolled
|
||||
|
|
|
@ -960,6 +960,38 @@ abstract class webservice_server implements webservice_server_interface {
|
|||
return $user;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Intercept some moodlewssettingXXX $_GET and $_POST parameter
|
||||
* that are related to the web service call and are not the function parameters
|
||||
*/
|
||||
protected function set_web_service_call_settings() {
|
||||
global $CFG;
|
||||
|
||||
// Default web service settings.
|
||||
// Must be the same XXX key name as the external_settings::set_XXX function.
|
||||
// Must be the same XXX ws parameter name as 'moodlewssettingXXX'.
|
||||
$externalsettings = array(
|
||||
'raw' => false,
|
||||
'fileurl' => true,
|
||||
'filter' => false);
|
||||
|
||||
// Load the external settings with the web service settings.
|
||||
$settings = external_settings::get_instance();
|
||||
foreach ($externalsettings as $name => $default) {
|
||||
|
||||
$wsparamname = 'moodlewssetting' . $name;
|
||||
|
||||
// Retrieve and remove the setting parameter from the request.
|
||||
$value = optional_param($wsparamname, $default, PARAM_BOOL);
|
||||
unset($_GET[$wsparamname]);
|
||||
unset($_POST[$wsparamname]);
|
||||
|
||||
$functioname = 'set_' . $name;
|
||||
$settings->$functioname($value);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1336,7 +1368,10 @@ class '.$classname.' {
|
|||
*/
|
||||
protected function parse_request() {
|
||||
|
||||
//Get GET and POST paramters
|
||||
// We are going to clean the POST/GET parameters from the parameters specific to the server.
|
||||
parent::set_web_service_call_settings();
|
||||
|
||||
// Get GET and POST paramters.
|
||||
$methodvariables = array_merge($_GET,$_POST);
|
||||
|
||||
if ($this->authmethod == WEBSERVICE_AUTHMETHOD_USERNAME) {
|
||||
|
|
|
@ -43,10 +43,9 @@ class webservice_rest_server extends webservice_base_server {
|
|||
* @param string $authmethod authentication method of the web service (WEBSERVICE_AUTHMETHOD_PERMANENT_TOKEN, ...)
|
||||
* @param string $restformat Format of the return values: 'xml' or 'json'
|
||||
*/
|
||||
public function __construct($authmethod, $restformat = 'xml') {
|
||||
public function __construct($authmethod) {
|
||||
parent::__construct($authmethod);
|
||||
$this->wsname = 'rest';
|
||||
$this->restformat = ($restformat != 'xml' && $restformat != 'json')?'xml':$restformat; //sanity check, we accept only xml or json
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -55,11 +54,22 @@ class webservice_rest_server extends webservice_base_server {
|
|||
* 1/ user authentication - username+password or token (wsusername, wspassword and wstoken parameters)
|
||||
* 2/ function name (wsfunction parameter)
|
||||
* 3/ function parameters (all other parameters except those above)
|
||||
* 4/ text format parameters
|
||||
* 5/ return rest format xml/json
|
||||
*/
|
||||
protected function parse_request() {
|
||||
|
||||
//Get GET and POST paramters
|
||||
$methodvariables = array_merge($_GET,$_POST);
|
||||
// Retrieve and clean the POST/GET parameters from the parameters specific to the server.
|
||||
parent::set_web_service_call_settings();
|
||||
|
||||
// Get GET and POST parameters.
|
||||
$methodvariables = array_merge($_GET, $_POST);
|
||||
|
||||
// Retrieve REST format parameter - 'xml' (default) or 'json'.
|
||||
$restformatisset = isset($methodvariables['moodlewsrestformat'])
|
||||
&& (($methodvariables['moodlewsrestformat'] == 'xml' || $methodvariables['moodlewsrestformat'] == 'json'));
|
||||
$this->restformat = $restformatisset ? $methodvariables['moodlewsrestformat'] : 'xml';
|
||||
unset($methodvariables['moodlewsrestformat']);
|
||||
|
||||
if ($this->authmethod == WEBSERVICE_AUTHMETHOD_USERNAME) {
|
||||
$this->username = isset($methodvariables['wsusername']) ? $methodvariables['wsusername'] : null;
|
||||
|
|
|
@ -42,16 +42,7 @@ if (!webservice_protocol_is_enabled('rest')) {
|
|||
die;
|
||||
}
|
||||
|
||||
$restformat = optional_param('moodlewsrestformat', 'xml', PARAM_ALPHA);
|
||||
//remove the alt from the request
|
||||
if(isset($_GET['moodlewsrestformat'])) {
|
||||
unset($_GET['moodlewsrestformat']);
|
||||
}
|
||||
if(isset($_POST['moodlewsrestformat'])) {
|
||||
unset($_POST['moodlewsrestformat']);
|
||||
}
|
||||
|
||||
$server = new webservice_rest_server(WEBSERVICE_AUTHMETHOD_PERMANENT_TOKEN, $restformat);
|
||||
$server = new webservice_rest_server(WEBSERVICE_AUTHMETHOD_PERMANENT_TOKEN);
|
||||
$server->run();
|
||||
die;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue