mirror of
https://github.com/moodle/moodle.git
synced 2025-02-23 11:27:51 +01:00
- The default box for the icons has been increased from 50px to 52px. That way, on the course page, the box for the icons has changed from 30px to 32px. - The icon size has been increased from 16px to 24px on the main course page and from 24px to 40px on the activity page.
416 lines
14 KiB
PHP
416 lines
14 KiB
PHP
<?php
|
|
|
|
// This file is part of Moodle - http://moodle.org/
|
|
//
|
|
// 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/>.
|
|
|
|
/**
|
|
* Mandatory public API of url module
|
|
*
|
|
* @package mod_url
|
|
* @copyright 2009 Petr Skoda {@link http://skodak.org}
|
|
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
|
*/
|
|
|
|
defined('MOODLE_INTERNAL') || die;
|
|
|
|
/**
|
|
* List of features supported in URL module
|
|
* @param string $feature FEATURE_xx constant for requested feature
|
|
* @return mixed True if module supports feature, false if not, null if doesn't know or string for the module purpose.
|
|
*/
|
|
function url_supports($feature) {
|
|
switch($feature) {
|
|
case FEATURE_MOD_ARCHETYPE: return MOD_ARCHETYPE_RESOURCE;
|
|
case FEATURE_GROUPS: return false;
|
|
case FEATURE_GROUPINGS: return false;
|
|
case FEATURE_MOD_INTRO: return true;
|
|
case FEATURE_COMPLETION_TRACKS_VIEWS: return true;
|
|
case FEATURE_GRADE_HAS_GRADE: return false;
|
|
case FEATURE_GRADE_OUTCOMES: return false;
|
|
case FEATURE_BACKUP_MOODLE2: return true;
|
|
case FEATURE_SHOW_DESCRIPTION: return true;
|
|
case FEATURE_MOD_PURPOSE: return MOD_PURPOSE_CONTENT;
|
|
|
|
default: return null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* This function is used by the reset_course_userdata function in moodlelib.
|
|
* @param $data the data submitted from the reset course.
|
|
* @return array status array
|
|
*/
|
|
function url_reset_userdata($data) {
|
|
|
|
// Any changes to the list of dates that needs to be rolled should be same during course restore and course reset.
|
|
// See MDL-9367.
|
|
|
|
return array();
|
|
}
|
|
|
|
/**
|
|
* List the actions that correspond to a view of this module.
|
|
* This is used by the participation report.
|
|
*
|
|
* Note: This is not used by new logging system. Event with
|
|
* crud = 'r' and edulevel = LEVEL_PARTICIPATING will
|
|
* be considered as view action.
|
|
*
|
|
* @return array
|
|
*/
|
|
function url_get_view_actions() {
|
|
return array('view', 'view all');
|
|
}
|
|
|
|
/**
|
|
* List the actions that correspond to a post of this module.
|
|
* This is used by the participation report.
|
|
*
|
|
* Note: This is not used by new logging system. Event with
|
|
* crud = ('c' || 'u' || 'd') and edulevel = LEVEL_PARTICIPATING
|
|
* will be considered as post action.
|
|
*
|
|
* @return array
|
|
*/
|
|
function url_get_post_actions() {
|
|
return array('update', 'add');
|
|
}
|
|
|
|
/**
|
|
* Add url instance.
|
|
* @param object $data
|
|
* @param object $mform
|
|
* @return int new url instance id
|
|
*/
|
|
function url_add_instance($data, $mform) {
|
|
global $CFG, $DB;
|
|
|
|
require_once($CFG->dirroot.'/mod/url/locallib.php');
|
|
|
|
$parameters = array();
|
|
for ($i=0; $i < 100; $i++) {
|
|
$parameter = "parameter_$i";
|
|
$variable = "variable_$i";
|
|
if (empty($data->$parameter) or empty($data->$variable)) {
|
|
continue;
|
|
}
|
|
$parameters[$data->$parameter] = $data->$variable;
|
|
}
|
|
$data->parameters = serialize($parameters);
|
|
|
|
$displayoptions = array();
|
|
if ($data->display == RESOURCELIB_DISPLAY_POPUP) {
|
|
$displayoptions['popupwidth'] = $data->popupwidth;
|
|
$displayoptions['popupheight'] = $data->popupheight;
|
|
}
|
|
if (in_array($data->display, array(RESOURCELIB_DISPLAY_AUTO, RESOURCELIB_DISPLAY_EMBED, RESOURCELIB_DISPLAY_FRAME))) {
|
|
$displayoptions['printintro'] = (int)!empty($data->printintro);
|
|
}
|
|
$data->displayoptions = serialize($displayoptions);
|
|
|
|
$data->externalurl = url_fix_submitted_url($data->externalurl);
|
|
|
|
$data->timemodified = time();
|
|
$data->id = $DB->insert_record('url', $data);
|
|
|
|
$completiontimeexpected = !empty($data->completionexpected) ? $data->completionexpected : null;
|
|
\core_completion\api::update_completion_date_event($data->coursemodule, 'url', $data->id, $completiontimeexpected);
|
|
|
|
return $data->id;
|
|
}
|
|
|
|
/**
|
|
* Update url instance.
|
|
* @param object $data
|
|
* @param object $mform
|
|
* @return bool true
|
|
*/
|
|
function url_update_instance($data, $mform) {
|
|
global $CFG, $DB;
|
|
|
|
require_once($CFG->dirroot.'/mod/url/locallib.php');
|
|
|
|
$parameters = array();
|
|
for ($i=0; $i < 100; $i++) {
|
|
$parameter = "parameter_$i";
|
|
$variable = "variable_$i";
|
|
if (empty($data->$parameter) or empty($data->$variable)) {
|
|
continue;
|
|
}
|
|
$parameters[$data->$parameter] = $data->$variable;
|
|
}
|
|
$data->parameters = serialize($parameters);
|
|
|
|
$displayoptions = array();
|
|
if ($data->display == RESOURCELIB_DISPLAY_POPUP) {
|
|
$displayoptions['popupwidth'] = $data->popupwidth;
|
|
$displayoptions['popupheight'] = $data->popupheight;
|
|
}
|
|
if (in_array($data->display, array(RESOURCELIB_DISPLAY_AUTO, RESOURCELIB_DISPLAY_EMBED, RESOURCELIB_DISPLAY_FRAME))) {
|
|
$displayoptions['printintro'] = (int)!empty($data->printintro);
|
|
}
|
|
$data->displayoptions = serialize($displayoptions);
|
|
|
|
$data->externalurl = url_fix_submitted_url($data->externalurl);
|
|
|
|
$data->timemodified = time();
|
|
$data->id = $data->instance;
|
|
|
|
$DB->update_record('url', $data);
|
|
|
|
$completiontimeexpected = !empty($data->completionexpected) ? $data->completionexpected : null;
|
|
\core_completion\api::update_completion_date_event($data->coursemodule, 'url', $data->id, $completiontimeexpected);
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Delete url instance.
|
|
* @param int $id
|
|
* @return bool true
|
|
*/
|
|
function url_delete_instance($id) {
|
|
global $DB;
|
|
|
|
if (!$url = $DB->get_record('url', array('id'=>$id))) {
|
|
return false;
|
|
}
|
|
|
|
$cm = get_coursemodule_from_instance('url', $id);
|
|
\core_completion\api::update_completion_date_event($cm->id, 'url', $id, null);
|
|
|
|
// note: all context files are deleted automatically
|
|
|
|
$DB->delete_records('url', array('id'=>$url->id));
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Given a course_module object, this function returns any
|
|
* "extra" information that may be needed when printing
|
|
* this activity in a course listing.
|
|
*
|
|
* See {@link course_modinfo::get_array_of_activities()}
|
|
*
|
|
* @param object $coursemodule
|
|
* @return cached_cm_info info
|
|
*/
|
|
function url_get_coursemodule_info($coursemodule) {
|
|
global $CFG, $DB;
|
|
require_once("$CFG->dirroot/mod/url/locallib.php");
|
|
|
|
if (!$url = $DB->get_record('url', array('id'=>$coursemodule->instance),
|
|
'id, name, display, displayoptions, externalurl, parameters, intro, introformat')) {
|
|
return NULL;
|
|
}
|
|
|
|
$info = new cached_cm_info();
|
|
$info->name = $url->name;
|
|
|
|
// Note: there should be a way to differentiate links from normal resources.
|
|
$info->icon = url_guess_icon($url->externalurl);
|
|
|
|
$display = url_get_final_display_type($url);
|
|
|
|
if ($display == RESOURCELIB_DISPLAY_POPUP) {
|
|
$fullurl = "$CFG->wwwroot/mod/url/view.php?id=$coursemodule->id&redirect=1";
|
|
$options = empty($url->displayoptions) ? [] : (array) unserialize_array($url->displayoptions);
|
|
$width = empty($options['popupwidth']) ? 620 : $options['popupwidth'];
|
|
$height = empty($options['popupheight']) ? 450 : $options['popupheight'];
|
|
$wh = "width=$width,height=$height,toolbar=no,location=no,menubar=no,copyhistory=no,status=no,directories=no,scrollbars=yes,resizable=yes";
|
|
$info->onclick = "window.open('$fullurl', '', '$wh'); return false;";
|
|
|
|
} else if ($display == RESOURCELIB_DISPLAY_NEW) {
|
|
$fullurl = "$CFG->wwwroot/mod/url/view.php?id=$coursemodule->id&redirect=1";
|
|
$info->onclick = "window.open('$fullurl'); return false;";
|
|
|
|
}
|
|
|
|
if ($coursemodule->showdescription) {
|
|
// Convert intro to html. Do not filter cached version, filters run at display time.
|
|
$info->content = format_module_intro('url', $url, $coursemodule->id, false);
|
|
}
|
|
|
|
$info->customdata['display'] = $display;
|
|
// The icon will be filtered from now on because the custom icons have been updated.
|
|
$info->customdata['filtericon'] = true;
|
|
|
|
return $info;
|
|
}
|
|
|
|
/**
|
|
* Return a list of page types
|
|
* @param string $pagetype current page type
|
|
* @param stdClass $parentcontext Block's parent context
|
|
* @param stdClass $currentcontext Current context of block
|
|
*/
|
|
function url_page_type_list($pagetype, $parentcontext, $currentcontext) {
|
|
$module_pagetype = array('mod-url-*'=>get_string('page-mod-url-x', 'url'));
|
|
return $module_pagetype;
|
|
}
|
|
|
|
/**
|
|
* Export URL resource contents
|
|
*
|
|
* @return array of file content
|
|
*/
|
|
function url_export_contents($cm, $baseurl) {
|
|
global $CFG, $DB;
|
|
require_once("$CFG->dirroot/mod/url/locallib.php");
|
|
$contents = array();
|
|
$context = context_module::instance($cm->id);
|
|
|
|
$course = $DB->get_record('course', array('id'=>$cm->course), '*', MUST_EXIST);
|
|
$urlrecord = $DB->get_record('url', array('id'=>$cm->instance), '*', MUST_EXIST);
|
|
|
|
$fullurl = str_replace('&', '&', url_get_full_url($urlrecord, $cm, $course));
|
|
$isurl = clean_param($fullurl, PARAM_URL);
|
|
if (empty($isurl)) {
|
|
return [];
|
|
}
|
|
|
|
$url = array();
|
|
$url['type'] = 'url';
|
|
$url['filename'] = clean_param(format_string($urlrecord->name), PARAM_FILE);
|
|
$url['filepath'] = null;
|
|
$url['filesize'] = 0;
|
|
$url['fileurl'] = $fullurl;
|
|
$url['timecreated'] = null;
|
|
$url['timemodified'] = $urlrecord->timemodified;
|
|
$url['sortorder'] = null;
|
|
$url['userid'] = null;
|
|
$url['author'] = null;
|
|
$url['license'] = null;
|
|
$contents[] = $url;
|
|
|
|
return $contents;
|
|
}
|
|
|
|
/**
|
|
* Register the ability to handle drag and drop file uploads
|
|
* @return array containing details of the files / types the mod can handle
|
|
*/
|
|
function url_dndupload_register() {
|
|
return array('types' => array(
|
|
array('identifier' => 'url', 'message' => get_string('createurl', 'url'))
|
|
));
|
|
}
|
|
|
|
/**
|
|
* Handle a file that has been uploaded
|
|
* @param object $uploadinfo details of the file / content that has been uploaded
|
|
* @return int instance id of the newly created mod
|
|
*/
|
|
function url_dndupload_handle($uploadinfo) {
|
|
// Gather all the required data.
|
|
$data = new stdClass();
|
|
$data->course = $uploadinfo->course->id;
|
|
$data->name = $uploadinfo->displayname;
|
|
$data->intro = '<p>'.$uploadinfo->displayname.'</p>';
|
|
$data->introformat = FORMAT_HTML;
|
|
$data->externalurl = clean_param($uploadinfo->content, PARAM_URL);
|
|
$data->timemodified = time();
|
|
$data->coursemodule = $uploadinfo->coursemodule;
|
|
|
|
// Set the display options to the site defaults.
|
|
$config = get_config('url');
|
|
$data->display = $config->display;
|
|
$data->popupwidth = $config->popupwidth;
|
|
$data->popupheight = $config->popupheight;
|
|
$data->printintro = $config->printintro;
|
|
|
|
return url_add_instance($data, null);
|
|
}
|
|
|
|
/**
|
|
* Mark the activity completed (if required) and trigger the course_module_viewed event.
|
|
*
|
|
* @param stdClass $url url object
|
|
* @param stdClass $course course object
|
|
* @param stdClass $cm course module object
|
|
* @param stdClass $context context object
|
|
* @since Moodle 3.0
|
|
*/
|
|
function url_view($url, $course, $cm, $context) {
|
|
|
|
// Trigger course_module_viewed event.
|
|
$params = array(
|
|
'context' => $context,
|
|
'objectid' => $url->id
|
|
);
|
|
|
|
$event = \mod_url\event\course_module_viewed::create($params);
|
|
$event->add_record_snapshot('course_modules', $cm);
|
|
$event->add_record_snapshot('course', $course);
|
|
$event->add_record_snapshot('url', $url);
|
|
$event->trigger();
|
|
|
|
// Completion.
|
|
$completion = new completion_info($course);
|
|
$completion->set_module_viewed($cm);
|
|
}
|
|
|
|
/**
|
|
* Check if the module has any update that affects the current user since a given time.
|
|
*
|
|
* @param cm_info $cm course module data
|
|
* @param int $from the time to check updates from
|
|
* @param array $filter if we need to check only specific updates
|
|
* @return stdClass an object with the different type of areas indicating if they were updated or not
|
|
* @since Moodle 3.2
|
|
*/
|
|
function url_check_updates_since(cm_info $cm, $from, $filter = array()) {
|
|
$updates = course_check_module_updates_since($cm, $from, array('content'), $filter);
|
|
return $updates;
|
|
}
|
|
|
|
/**
|
|
* This function receives a calendar event and returns the action associated with it, or null if there is none.
|
|
*
|
|
* This is used by block_myoverview in order to display the event appropriately. If null is returned then the event
|
|
* is not displayed on the block.
|
|
*
|
|
* @param calendar_event $event
|
|
* @param \core_calendar\action_factory $factory
|
|
* @param int $userid ID override for calendar events
|
|
* @return \core_calendar\local\event\entities\action_interface|null
|
|
*/
|
|
function mod_url_core_calendar_provide_event_action(calendar_event $event,
|
|
\core_calendar\action_factory $factory, $userid = 0) {
|
|
|
|
global $USER;
|
|
if (empty($userid)) {
|
|
$userid = $USER->id;
|
|
}
|
|
|
|
$cm = get_fast_modinfo($event->courseid, $userid)->instances['url'][$event->instance];
|
|
|
|
$completion = new \completion_info($cm->get_course());
|
|
|
|
$completiondata = $completion->get_data($cm, false, $userid);
|
|
|
|
if ($completiondata->completionstate != COMPLETION_INCOMPLETE) {
|
|
return null;
|
|
}
|
|
|
|
return $factory->create_instance(
|
|
get_string('view'),
|
|
new \moodle_url('/mod/url/view.php', ['id' => $cm->id]),
|
|
1,
|
|
true
|
|
);
|
|
}
|