2008-07-28 12:31:29 +00:00
< ? php
2009-09-25 05:24:13 +00:00
// 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/>.
/**
2010-04-30 03:06:22 +00:00
* Toggles the manual completion flag for a particular activity or course completion
* and the current user .
2009-09-25 05:24:13 +00:00
*
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
* @ package course
*/
2008-07-28 12:31:29 +00:00
require_once ( '../config.php' );
require_once ( $CFG -> libdir . '/completionlib.php' );
// Parameters
2010-04-30 03:06:22 +00:00
$cmid = optional_param ( 'id' , 0 , PARAM_INT );
$courseid = optional_param ( 'course' , 0 , PARAM_INT );
$confirm = optional_param ( 'confirm' , 0 , PARAM_BOOL );
if ( ! $cmid && ! $courseid ) {
print_error ( 'invalidarguments' );
}
// Process self completion
if ( $courseid ) {
2010-07-23 03:25:07 +00:00
$PAGE -> set_url ( new moodle_url ( '/course/togglecompletion.php' , array ( 'course' => $courseid )));
2011-01-30 21:50:04 +01:00
2010-04-30 03:06:22 +00:00
// Check user is logged in
2013-08-21 13:42:30 +08:00
$course = $DB -> get_record ( 'course' , array ( 'id' => $courseid ), '*' , MUST_EXIST );
2012-07-23 15:59:04 +08:00
$context = context_course :: instance ( $course -> id );
2010-04-30 03:06:22 +00:00
require_login ( $course );
$completion = new completion_info ( $course );
2013-01-11 14:41:05 +13:00
if ( ! $completion -> is_enabled ()) {
throw new moodle_exception ( 'completionnotenabled' , 'completion' );
} elseif ( ! $completion -> is_tracked_user ( $USER -> id )) {
throw new moodle_exception ( 'nottracked' , 'completion' );
}
2010-04-30 03:06:22 +00:00
// Check if we are marking a user complete via the completion report
$user = optional_param ( 'user' , 0 , PARAM_INT );
$rolec = optional_param ( 'rolec' , 0 , PARAM_INT );
if ( $user && $rolec ) {
2011-01-30 21:50:04 +01:00
require_sesskey ();
2012-07-23 09:38:28 +12:00
completion_criteria :: factory ( array ( 'id' => $rolec , 'criteriatype' => COMPLETION_CRITERIA_TYPE_ROLE )); //TODO: this is dumb, because it does not fetch the data?!?!
2011-01-30 21:50:04 +01:00
$criteria = completion_criteria_role :: fetch ( array ( 'id' => $rolec ));
2010-04-30 03:06:22 +00:00
2011-01-30 21:50:04 +01:00
if ( $criteria and user_has_role_assignment ( $USER -> id , $criteria -> role , $context -> id )) {
$criteria_completions = $completion -> get_completions ( $user , COMPLETION_CRITERIA_TYPE_ROLE );
2010-04-30 03:06:22 +00:00
2011-01-30 21:50:04 +01:00
foreach ( $criteria_completions as $criteria_completion ) {
if ( $criteria_completion -> criteriaid == $rolec ) {
$criteria -> complete ( $criteria_completion );
break ;
}
2010-04-30 03:06:22 +00:00
}
}
// Return to previous page
if ( ! empty ( $_SERVER [ 'HTTP_REFERER' ])) {
redirect ( $_SERVER [ 'HTTP_REFERER' ]);
} else {
redirect ( 'view.php?id=' . $course -> id );
}
} else {
// Confirm with user
2011-01-30 21:50:04 +01:00
if ( $confirm and confirm_sesskey ()) {
2010-04-30 03:06:22 +00:00
$completion = $completion -> get_completion ( $USER -> id , COMPLETION_CRITERIA_TYPE_SELF );
if ( ! $completion ) {
print_error ( 'noselfcompletioncriteria' , 'completion' );
}
// Check if the user has already marked themselves as complete
if ( $completion -> is_complete ()) {
print_error ( 'useralreadymarkedcomplete' , 'completion' );
}
$completion -> mark_complete ();
redirect ( $CFG -> wwwroot . '/course/view.php?id=' . $courseid );
return ;
}
$strconfirm = get_string ( 'confirmselfcompletion' , 'completion' );
2010-07-23 03:25:07 +00:00
$PAGE -> set_title ( $strconfirm );
$PAGE -> set_heading ( $course -> fullname );
$PAGE -> navbar -> add ( $strconfirm );
echo $OUTPUT -> header ();
2011-01-30 21:50:04 +01:00
$buttoncontinue = new single_button ( new moodle_url ( '/course/togglecompletion.php' , array ( 'course' => $courseid , 'confirm' => 1 , 'sesskey' => sesskey ())), get_string ( 'yes' ), 'post' );
2010-07-23 03:25:07 +00:00
$buttoncancel = new single_button ( new moodle_url ( '/course/view.php' , array ( 'id' => $courseid )), get_string ( 'no' ), 'get' );
echo $OUTPUT -> confirm ( $strconfirm , $buttoncontinue , $buttoncancel );
echo $OUTPUT -> footer ();
2010-04-30 03:06:22 +00:00
exit ;
}
}
2010-02-03 17:50:26 +00:00
$targetstate = required_param ( 'completionstate' , PARAM_INT );
$fromajax = optional_param ( 'fromajax' , 0 , PARAM_INT );
2009-09-25 05:24:13 +00:00
2010-02-03 17:50:26 +00:00
$PAGE -> set_url ( '/course/togglecompletion.php' , array ( 'id' => $cmid , 'completionstate' => $targetstate ));
2009-09-25 05:24:13 +00:00
2008-07-28 12:31:29 +00:00
switch ( $targetstate ) {
case COMPLETION_COMPLETE :
case COMPLETION_INCOMPLETE :
break ;
default :
2008-09-25 02:09:49 +00:00
print_error ( 'unsupportedstate' );
2008-07-28 12:31:29 +00:00
}
// Get course-modules entry
2012-12-14 10:17:33 +08:00
$cm = get_coursemodule_from_id ( null , $cmid , null , true , MUST_EXIST );
2013-08-21 13:42:30 +08:00
$course = $DB -> get_record ( 'course' , array ( 'id' => $cm -> course ), '*' , MUST_EXIST );
2008-07-28 12:31:29 +00:00
2010-02-03 17:50:26 +00:00
// Check user is logged in
require_login ( $course , false , $cm );
if ( isguestuser () or ! confirm_sesskey ()) {
print_error ( 'error' );
2008-07-28 12:31:29 +00:00
}
2013-02-19 16:54:13 +00:00
// Set up completion object and check it is enabled.
2010-02-03 17:50:26 +00:00
$completion = new completion_info ( $course );
if ( ! $completion -> is_enabled ()) {
2013-01-11 14:41:05 +13:00
throw new moodle_exception ( 'completionnotenabled' , 'completion' );
2010-02-03 17:50:26 +00:00
}
2008-07-28 12:31:29 +00:00
2013-02-19 16:54:13 +00:00
// NOTE: All users are allowed to toggle their completion state, including
// users for whom completion information is not directly tracked. (I.e. even
// if you are a teacher, or admin who is not enrolled, you can still toggle
// your own completion state. You just don't appear on the reports.)
2008-07-28 12:31:29 +00:00
// Check completion state is manual
2010-02-03 17:50:26 +00:00
if ( $cm -> completion != COMPLETION_TRACKING_MANUAL ) {
error_or_ajax ( 'cannotmanualctrack' , $fromajax );
2008-07-28 12:31:29 +00:00
}
2010-02-03 17:50:26 +00:00
$completion -> update_state ( $cm , $targetstate );
2008-07-28 12:31:29 +00:00
// And redirect back to course
2010-02-03 17:50:26 +00:00
if ( $fromajax ) {
2008-07-28 12:31:29 +00:00
print 'OK' ;
} else {
2008-08-21 13:54:45 +00:00
// In case of use in other areas of code we allow a 'backto' parameter,
// otherwise go back to course page
2012-12-14 10:17:33 +08:00
if ( $backto = optional_param ( 'backto' , null , PARAM_URL )) {
redirect ( $backto );
} else {
redirect ( course_get_url ( $course , $cm -> sectionnum ));
}
2008-07-28 12:31:29 +00:00
}
2009-09-25 05:24:13 +00:00
2010-02-03 17:50:26 +00:00
// utility functions
function error_or_ajax ( $message , $fromajax ) {
if ( $fromajax ) {
print get_string ( $message , 'error' );
exit ;
} else {
print_error ( $message );
}
}