special_param1==1) $lTA=true;' to call '$ilm->view_iLM(...lTA)'
*
* - v 4.9 2017/03/13
* + Great number of changes to allow the use o iVProgH5 (e.g. function changed: from 'applet_ilm' to 'build_ilm_tags')
*
* - v 4.8 2016/05/12
* + Function add_to_log() is deprecated it was then rewritten to the new events API
* + Resolved: the field "description" table "iassign_ilm" was being filled with the codes in HTML when importing magnet package and
* due to this the language field was not being displayed because in place of the quotes was recorded in the & quot field.
* ("$description_str = htmlentities(str_replace(array('',''), array('',''), $application_xml->description->asXML()));"
* replaced by
* "description_str = str_replace(array('',''), array('',''), $application_xml->description->asXML());")
* - v 4.7 2016/02/17
* + Moodle 3.X: now iAssign is working fine under version 3.X (iassign/version.php: '$module->' changed to '$plugin->'; iassign/locallib.php: 'format_text(...)' replaced 'filter_text(...)')
* + Improved: now is possible to see the iGeom menus in preview (from iAssign Repository) - it depends on the version 1.3 of iAssign filter!
* + Improved: new names for 'form.input.MA_POST_Archive' and 'form.input.MA_POST_Value', now: 'iLM_PARAM_ArchiveContent' and 'iLM_PARAM_ActivityEvaluation'
* + BUG fixed: now it is fine the "online" edition of activities (in iAssign Repository) - inserted 'iLM_PARAM_Authoring' (iLM 2) and 'MA_POST_ArchiveTeacher' (iLM 1)
* + BUG fixed: it is possible to change the name of any file in iAssign Repository - problems was in 'optional_param(...)', 'PARAM_TEXT' replaced 'PARAM_ALPHANUMEXT'
* + BUG fixed: it is possible to duplicate any file in iAssign Repository - problems also in 'optional_param(...)', 'PARAM_TEXT' replaced 'PARAM_ALPHANUMEXT'
* + BUG fixed: now is possible to edit an iAssign activity with no new object been created (in iGeom: turn an example in exercise)
*
* --------------- (abaixo estava no MOOC e NAO incorporei aqui!)
* - v 4.6 2014/02/25
* + Fix bugs in filter function for open applets.
* - v 4.5 2014/02/24
* + Fix bugs in params.
* + Insert new param type.
* - v 4.4 2014/01/24
* + Allow select type of params.
* + Insert the use of applet params specific for activities.
* - v 4.3 2014/01/23
* + Insert function for move activities for other iLM (ilm_settings::confirm_move_iassign, ilm_settings::move_iassign).
* - v 4.2 2016/02/13
* + Fixed API usage to work fine under Moodle 3.X: ilm_editor_new()
* --------------- (acima estava no MOOC)
*
* - v 4.1 2013/12/13
* + Insert log in iAssign actions.
* + Allow use the language in iLM description (ilm_settings::new_file_ilm, ilm_settings::new_ilm, ilm_settings::edit_ilm, ilm_settings::copy_new_version_ilm, ilm_settings::add_edit_copy_ilm, iassign_language::get_description_lang, iassign_language::get_all_lang).
* + Insert class for Log actions in system.
* - v 4.0 2013/10/31
* + Insert support of export iLM in zip packages (ilm_settings::export_ilm).
* + Insert support of import iLM from zip packages (ilm_settings::import_ilm).
* + Fix bugs in message alert in iassign title and remove message alert of the description by cache error.
* - v 3.9 2013/10/25
* + Insert support of upgrade iLM.
* + Insert support for more than one extension in iLM.
* + Fix bugs in verion control.
* - v 3.8 2013/09/19
* + Get data of general fields in iassign statement table (iassign::add_edit_iassign).
* - v 3.7 2013/09/12
* + Change tag APPLET in all functions of module (ilm::view_iLM, ilm_manager::ilm_editor_new, ilm_manager::ilm_editor_update).
* + Insert tool for manage aditional params for iLM (ilm_settings::add_edit_copy_param, ilm_settings::visible_param, ilm_settings::add_param, ilm_settings::edit_param, ilm_settings::copy_param, ilm_settings::delete_param).
* - v 3.6 2013/09/05
* + Insert function ilm_settings::applet_ilm for create APPLET html tag.
* + Insert function ilm_settings::applet_filetime for get modified date of iLM file.
* + Change tag APPLET in function ilm_settings::view_ilm.
* - v 3.5 2013/08/26
* + Fix bug in download package iassign without answers (iassign::report).
* - v 3.4 2013/08/23
* + Fix bug in export package iassign.
* - v 3.3 2013/08/22
* + Insert functions for export users answer in iassign (iassign::export_file_answer, iassign::export_package_answer, iassign::view_iassign_current, iassign::report).
* + Insert function for rename iassign file (ilm_manager::rename_file_ilm, ilm_manager::view_files_ilm).
* - v 3.2 2013/08/21
* + Change title link with message for get file for donwload file (ilm_manager::view_files_ilm).
* + Change functions for import files for ilm_manager.php.
* + Create static utils class for functions system utils (iassign_utils::format_filename, iassign_utils::version_filename).
* - v 3.1 2013/08/15
* + Change return file selected (ilm_manager::add_ilm).
* + Insert functions for import files, export files and remove selected files (ilm_manager::view_files_ilm, ilm_manager::import_files_ilm, ilm_manager::export_files_ilm, ilm_manager::delete_selected_ilm).
* - v 3.0 2013/08/02
* + Insert link for view informations of iLMs in teacher view, same screen of admin view but wiht some features hide (ilm_settings::list_ilm, ilm_settings::view_ilm, iassign::view_iassigns).
* - v 2.9 2013/08/01
* + Fix bugs in functions ilm_settings::new_file_ilm, ilm_settings::copy_new_version_ilm, ilm_settings::add_edit_copy_ilm.
* - v 2.8 2013/07/25
* + Insert the activity name in header of view (activity::view_dates).
* + Set function default iLM in view iLMs versions (ilm_settings::default_ilm and ilm_settings::confirm_default_ilm).
* - v 2.7 2013/07/24
* + Create link previous and next for student view in one activity (activity::view_dates).
* + Fix bugs for view error in iLM not on DB in function iassign::view_iassign_current.
* - v 2.6 2013/07/23
* + Fix bugs for view files in function ilm_manager::view_files_ilm.
* + Fix bugs for comment on teacher view in function iassign::view_iassign_current.
* - v 2.5 2013/07/12
* + Change iLM settings for accept versions (ilm_settings::new_file_ilm, ilm_settings::new_ilm, ilm_settings::edit_ilm, ilm_settings::copy_new_version_ilm).
* + Insert new informations in iLMs table: created date, modified date, author, version, modified date of JAR (ilm_settings::view_ilm).
* + Added support for PHP 7.0 Constructors and fallback for previous Moodle Versions (<3.1) - Márcio
*
* @author Patricia Alves Rodrigues
* @author Leônidas O. Brandão
* @contributor Luciano Oliveira Borges
* @contributor Márcio de Lima Passos
* @version v 4.8 2016/05/12
* @package mod_iassign_lib
* @since 2010/09/27
* @copyright iMatica (iMath) - Computer Science Dep. of IME-USP (Brazil)
*
* License
* - http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
//TODO Review: eliminate iLM JAR under MoodleData? It is necessary to HTML5 packages (like iVProgH5), anyway
//TODO Whenever under HTTPS, verify if MoodleData is working, if it is not, please use iLM JAR under WWW setting $CONF_WWW = 1
//TODO (under HTTPS could fail 'pluginfile', like 'https://saw.atp.usp.br/pluginfile.php/1/mod_iassign/ilm/182563135/iassign/ilm/igeom/5920/iGeom.jar"'
$CONF_WWW = 1; //TODO get iLM (JAR) from WWW, avoiding MoodleData
/**
* Standard base class for all iAssign
*/
class iassign {
var $cm;
var $course;
var $iassign;
var $striassign;
var $striassigns;
var $context;
var $activity;
var $iassign_up;
var $iassign_down;
var $action;
var $iassign_submission_current;
var $userid_iassign;
var $bottonPost;
var $write_solution;
var $view_iassign;
// 3.1 update PHP 7.0 compatibility for all moodle versions
//D public function iassign($iassign, $cm, $course) { self::__construct($iassign, $cm, $course); }
/// Constructor for the base iassign class
// @calledby ./mod/iassign/view.php : $iassigninstance = new iassign($iassign, $cm, $course)
// @calledby ./mod/iassign/grade.php : $iassigninstance = new iassign($iassign, $cm, $course);
// @calledby ./mod/iassign/renderer.php : return $this->render(new iassign_files($context, $itemid, $filearea));
function __construct ($iassign, $cm, $course) {
global $COURSE, $CFG, $USER, $DB;
$botton = optional_param('botton', NULL, PARAM_TEXT);
$this->userid_iassign = optional_param('userid_iassign', 0, PARAM_INT);
if (!is_null($botton))
$USER->iassignEdit = $botton;
//D The Moodle function 'optional_param(...)' allow to filter GET parameters over a click that launches, e.g., './mod/iassign/view.php&userid_iassign=6'
//D If "$var1 = optional_param('userid_iassign', 'NOT', PARAM_TEXT);", $var1 will be set to 6 (if 'userid_iassign' is not present, $var1 will be set to 'NOT'
$this->iassign_up = optional_param('iassign_up', 0, PARAM_INT); // if parameter 'iassign_up' does not exists or it is not integer => use 0 as "default"
$this->iassign_down = optional_param('iassign_down', 0, PARAM_INT);
$this->iassign_submission_current = optional_param('iassign_submission_current', 0, PARAM_INT);
$this->write_solution = optional_param('write_solution', 0, PARAM_INT);
$this->action = optional_param('action', NULL, PARAM_TEXT);
$this->cm = $cm;
$this->context = context_module::instance($this->cm->id);
//D echo "locallib.php: new iassign(): action=" . $this->action . ", write_solution=" . $this->write_solution . ", this->cm->id=" . $this->cm->id . " ";
if (!has_capability('mod/iassign:evaluateiassign', $this->context, $USER->id))
$this->userid_iassign = $USER->id;
if ($course) {
$this->course = $course;
} else if ($this->cm->course == $COURSE->id) {
$this->course = $COURSE;
} else if (!$this->course = $DB->get_record('course', array('id' => $this->cm->course))) {
print_error('invalidid', 'iassign');
}
$this->coursecontext = context_course::instance($this->course->id);
if ($iassign) {
$this->iassign = $iassign;
} else if (!$this->iassign = $DB->get_record('iassign', array('id' => $this->cm->instance))) {
print_error('invalidid', 'iassign');
}
$USER->context = context_module::instance($this->cm->id);
$USER->cm = $this->cm->id;
$this->iassign->cmidnumber = $this->cm->idnumber; // compatibility with modedit ia obj
$this->iassign->courseid = $this->course->id; // compatibility with modedit ia obj
$this->context = context_module::instance($this->cm->id);
$this->striassign = get_string('modulename', 'iassign');
$this->striassigns = get_string('modulenameplural', 'iassign');
$this->return = $CFG->wwwroot . "/mod/iassign/view.php?id=" . $this->cm->id;
$this->bottonPost = 0;
$this->view_iassign = optional_param('action', false, PARAM_BOOL);
$this->activity = new activity(optional_param('iassign_current', NULL, PARAM_TEXT));
$this->view();
} // function __construct ($iassign, $cm, $course)
/// Show iAssign by using the security filter (temporary data on '*_iassign_security')
// This method provides the page to view each iLM with any interactive activity
// @calledby view.php : $iassigninstance->view($id); that instantiate 'iassign' (constructor above)
function view () { // This is an standard function for each iAssign instance (to not use parameters, it is ignored)
global $USER, $DB, $OUTPUT;
//$iassign_statementid = $this->iassign->iassign_statementid;
$iassign_statementid = $this->activity->get_activity()->id;
// '$this' has : iassign Object = cm ; course ; iassign ; striassign ; striassigns ; context ; activity ; iassign_up ; iassign_down ; action ; ... ; coursecontext ; return
//D echo "1: locallib.php: view(): action=" . $this->action . ", iassign_statementid=" . $iassign_statementid . " \n";
// If this user has no capability to View 'iassign': stop here
require_capability('mod/iassign:view', $this->context);
// Trigger module viewed event.
$event = \mod_iassign\event\course_module_viewed::create(array(
'objectid' => $this->iassign->id,
'context' => $this->context
));
$event->add_record_snapshot('course', $this->course);
$event->trigger();
if ($this->action) { // when student do/redo activity or teacher see student solution
$this->action(); // calls '$this->view_iLM();'
} else {
print $OUTPUT->header();
$this->view_iassigns(); // show the iLM with the content
print $OUTPUT->footer();
}
// Security: delete all records with an error loading iLM - 'iassign_security : id iassign_statementid userid file timecreated view'
//D $DB->delete_records("iassign_security", array("userid" => $USER->id, "view" => 1));
//D $iassign_iLM_security = $DB->get_record("iassign_security", array("iassign_statementid" => $iassign_statementid));
//D foreach ($iassign_iLM_security as $item) { echo $iassign_iLM_security->id . " ; " . $iassign_iLM_security->iassign_statementid . " ; " . $iassign_iLM_security->userid . " ; " . $iassign_iLM_security->timecreated . " ; " . $iassign_iLM_security->view . " ; " . $iassign_iLM_security->file . " \n" }
$DB->delete_records("iassign_security", array("userid" => $USER->id, "iassign_statementid" => $iassign_statementid));
//D $iassign_iLM_security = $DB->get_record("iassign_security", array("iassign_statementid" => $iassign_statementid));
//D if ($iassign_iLM_security) foreach ($iassign_iLM_security as $item) { echo $iassign_iLM_security->id . " ; " . $iassign_iLM_security->iassign_statementid . " ; " . $iassign_iLM_security->userid . " ; " . $iassign_iLM_security->timecreated . " ; " . $iassign_iLM_security->view . " ; " . $iassign_iLM_security->file . " \n" }
//D else echo "Apagou! ";
die();
} // function view()
/// Execute the action from Moodle (move, make visible, register the exercise (teacher) or its answer (learner)...)
function action () {
global $USER;
// action:
// up - move up activity (mover atividade para cima)
// down - move down activity (mover atividade para baixo)
// visible - view/hide activity (exibir/ocultar atividade)
// delete - delete activity (excluir atividade)
// deleteyes - confirms exclusion of activity (confirma exclusão de atividade)
// deleteno - does not erase activity (não apaga atividade)
// add - add activity (adicionar atividade)
// edit - edit activity (modificar atividade)
$action_iassign = array(
'newcomment' => '$this->get_answer();',
'view' => '$this->view_iassign_current();',
'get_answer' => '$this->get_answer();',
'repeat' => '$this->view_iassign_current();',
'overwrite' => '$this->get_answer();',
'stats_student' => '$this->stats_students();',
'download_answer' => '$this->export_file_answer();',
'download_all_answer' => '$this->export_package_answer();');
$action_iassign_limit = array(
'view' => '$this->view_iassign_current();',
'newcomment' => '$this->get_answer();',
'viewsubmission' => '$this->view_iassign_current();',
'edit_status' => '$this->edit_status();',
'edit_grade' => '$this->edit_grade();',
'report' => '$this->report();',
'print' => '$this->report();',
'stats' => '$this->stats();',
'printstats' => '$this->stats();');
$restricted = array('up' => '$this->activity->move_iassign($this->iassign_up,$this->return);',
'down' => '$this->activity->move_iassign($this->iassign_down,$this->return);',
'visible' => '$this->activity->visible_iassign($this->return);',
'delete' => '$this->activity->delete($this->return);',
'deleteno' => '$this->return_home_course("confirm_not_delete_iassign");',
'deleteyes' => '$this->activity->deleteyes($this->return, $this);',
'add' => '$this->add_edit_iassign();',
'edit' => '$this->add_edit_iassign();',
'get_answer' => '$this->get_answer();',
'duplicate_activity' => '$this->duplicate_activity();',
'move_activity' => '$this->move_activity();');
$action_iassign_restricted = array_merge($restricted, $action_iassign_limit, $action_iassign);
// On depends the user's capability: precedence to edit power ('editiassign'); after to analyse ('evaluateiassign'); otherwise only view (any other).
if (has_capability('mod/iassign:editiassign', $this->context, $USER->id)) {
// When teacher is seeing student solution. By 'viewsubmission' goes to the function 'view_iassign_current()'
eval($action_iassign_restricted[$this->action]); // Now load 'view_iassign_current()' with 'viewsubmission'
}
elseif (has_capability('mod/iassign:evaluateiassign', $this->context, $USER->id)) {
eval($action_iassign_limit[$this->action]);
}
else {
// When student do/redo activity: do => action = "view"; redo => action = "repeat"
eval($action_iassign[$this->action]); // Now load 'view_iassign_current()' with 'view'
}
} // function action()
/// This method moves an iAssign activity
function move_activity () {
global $USER, $CFG, $DB, $COURSE;
$iassign_id = optional_param('iassign_current', NULL, PARAM_TEXT);
$iassign_destiny = optional_param('iassign_destiny', NULL, PARAM_TEXT);
$update_entry_new_iassign = new stdClass();
$update_entry_new_iassign->id = $iassign_id;
$update_entry_new_iassign->iassignid = $iassign_destiny;
// Update the iassign_statement
$DB->update_record("iassign_statement", $update_entry_new_iassign);
// Update file context
$c_i = context_module::instance($this->cm->id);
$ret = get_coursemodule_from_id("iassign", $c_i->instanceid);
$course_module_info = $DB->get_record("course_modules", array("course" => $COURSE->id, "module" => $ret->module, "instance" => $iassign_destiny));
$path_module = context_course::instance($COURSE->id);
$context_file = $DB->get_record_sql('SELECT * FROM {context} WHERE instanceid="' . $course_module_info->id . '" AND path like "'.$path_module->path.'%"');
if ($context_file) {
$id_context = $context_file->id;
$iassign_statement = $DB->get_record("iassign_statement", array("id" => $iassign_id));
$fs = get_file_storage();
$files = $fs->get_area_files(context_module::instance($this->cm->id)->id, 'mod_iassign', 'exercise', $iassign_statement->file);
foreach ($files as $value) {
if ($value->get_filename() != ".") {
$last_id = $DB->get_record_sql('SELECT itemid FROM {files} WHERE component="mod_iassign" ORDER BY itemid DESC LIMIT 1')->itemid;
$newfile = $fs->create_file_from_storedfile(array('contextid' => $id_context, 'component' => 'mod_iassign', 'filearea' => 'exercise', 'itemid' => ($last_id + 1)), $value);
$updateentry = new stdClass();
$updateentry->id = $iassign_id;
$updateentry->file = $newfile->get_itemid();
$DB->update_record("iassign_statement", $updateentry);
$fs->delete_area_files(context_module::instance($this->cm->id)->id, 'mod_iassign', 'exercise', $value->get_itemid());
break;
}
}
}
$this->return_home_course('moved_activity');
exit;
}
/// This method duplicates an iAssign activity
function duplicate_activity () {
global $USER, $CFG, $COURSE, $DB, $OUTPUT;
$id = $this->cm->id;
$iassignid = optional_param('iassign_current', NULL, PARAM_TEXT);
$context = context_module::instance($this->cm->id);
$contextuser = context_user::instance($USER->id);
// Get the the iAssign acitivity to be duplicated
$iassign_statement = $DB->get_record("iassign_statement", array("id" => $iassignid));
// Remove the current id of activity
$iassign_statement->id=0;
// Get the information about current author, and add this information in author_modified field
$author = $DB->get_record("user", array('id' => $USER->id));
$iassign_statement->author_modified_name = $author->firstname . ' ' . $author->lastname;
$iassign_statement->author_modified = $iassign_statement->author_modified_name;
// Store the activity in the table
if ($id_ = $DB->insert_record("iassign_statement", $iassign_statement)) {
// Duplicate activity file
$fs = get_file_storage();
$files = $fs->get_area_files($context->id, 'mod_iassign', 'exercise', $iassign_statement->file);
foreach ($files as $value) {
if ($value->get_filename() != ".") {
$last_id = $DB->get_record_sql('SELECT itemid FROM {files} WHERE component="mod_iassign" ORDER BY itemid DESC LIMIT 1')->itemid;
$newfile = $fs->create_file_from_storedfile(array('contextid' => $context->id, 'component' => 'mod_iassign', 'filearea' => 'exercise', 'itemid' => ($last_id + 1)), $value);
$updateentry = new stdClass();
$updateentry->id = $id_;
$updateentry->file = $newfile->get_itemid();
// Update the duplicated iLM iAssign with new file id
$DB->update_record("iassign_statement", $updateentry);
}
}
}
// log event --------------------------------------------------------------------------------------
iassign_log::add_log('duplicate_iassign_exercise', 'name: ' . $author->firstname, $id_, $this->cm->id);
$this->return_home_course('duplicated_activity');
exit;
}
/// This method gets the content from the iLM and register it
// It could be the exercise (teacher) or an answer (student)
function get_answer () {
global $USER, $CFG, $DB, $OUTPUT;
$id = $this->cm->id;
$submission_comment = optional_param('submission_comment', NULL, PARAM_TEXT);
$comment = false;
if ($submission_comment)
$comment = $this->write_comment_submission();
// receives data of iLM using the current activity
$iassign_ilm = $DB->get_record("iassign_ilm", array("id" => $this->activity->get_activity()->iassign_ilmid)); // has automatic evaluation?
$iassign = $DB->get_record("iassign", array("id" => $this->activity->get_activity()->iassignid)); // activity
// receives data of submission of current activity
$iassign_submission = $DB->get_record("iassign_submission", array("iassign_statementid" => $this->activity->get_activity()->id, "userid" => $this->userid_iassign)); // data about student solution
//D echo "DEBUG: "; $x = array("iassign_statementid" => $this->activity->get_activity()->id, "userid" => $this->userid_iassign);
//D print_r($x); exit;
// receives post and get
$iLM_PARAM_ActivityEvaluation = optional_param('iLM_PARAM_ActivityEvaluation', 0, PARAM_INT); // 1 - activity evaluated as correct / 0 - activity evaluated as incorrect
//2016/02/16: IMPORTANTE trocar formatador para "nao formatado", pois esta destruindo o conteudo do arquivo
$iLM_PARAM_ArchiveContent = optional_param('iLM_PARAM_ArchiveContent', NULL, PARAM_RAW); // answer file (ATTENTION: do not change format, use RAW in order to ensure the correct content)
$MA_POST_Info = optional_param('MA_POST_Info', NULL, PARAM_FORMAT);
$MA_POST_SystemData = optional_param('MA_POST_SystemData', NULL, PARAM_FORMAT);
$return_get_answer = optional_param('return_get_answer', 0, PARAM_INT);
$msg = '';
// Feedback
// Activity status: 0 => not post 1; => post; 2 => evaluated as incorrect; 3 => evaluated as correct
$str_action = "view"; // repeat
if (strtolower($iassign_ilm->name) == "igeom") {
}
$title = get_string('evaluate_iassign', 'iassign');
print $OUTPUT->header();
print $OUTPUT->box_start();
// Action = { view ; repeat ; viewsubmission }
// * 'view' => it is impossible to re-send answer (this is correct with iGeom because its model to ensure security - do not allow the learner's access to the "answer model")
// * 'repeat' => student explicitly requested to redo the activiy or enter in the last submission under iLM other then iGeom
// * 'viewsubmission' => teacher/non editing teacher seeing the learner's activity
$return = $CFG->wwwroot . "/mod/iassign/view.php?action=view&id=" . $id . "&iassign_submission_current=" . $this->iassign_submission_current . "&userid_iassign=" . $this->userid_iassign . "&iassign_current=" . $this->activity->get_activity()->id;
$return_last = " " . iassign_icons::insert('return_home') . ' ' . get_string('return_iassign', 'iassign') . "";
$link_return = " " . iassign_icons::insert('home') . ' ' . get_string('activities_page', 'iassign') . "";
print '
';
if ($iLM_PARAM_ArchiveContent == - 1 || empty($iLM_PARAM_ArchiveContent)) { // if ($iLM_PARAM_ActivityEvaluation == -1)
//TODO alterar aqui???
$this->write_solution = 0; // necessary in order to take note in Moodle 'grade' system
// empty_answer_post = No solution was posted.
if ($comment)
print '
';
} else {
if ($iassign_ilm->evaluate == 1 && $this->activity->get_activity()->automatic_evaluate == 1) { // iLM with automatic evaluator
if (intval($iLM_PARAM_ActivityEvaluation) == 1) {
// Correct answer!!
//TODO apelei - o melhor e' alterar acima o 'write_solution=0'?
$this->write_solution = 1; //
$status = 3;
$grade_student = $this->activity->get_activity()->grade; // evaluated as correct solution submitted is assigned the note pattern of activity
$msg = '
' . "\n";
} // elseif (has_capability('mod/iassign:submitiassign', $this->context, $USER->id))
else
print '' . "\n";
} // function view_legend_icons()
/// Display activity current
// @calledby view() -> action() : when student do/redo activity and teacher see student answer
function view_iassign_current () {
global $USER, $CFG, $COURSE, $DB, $OUTPUT;
$id = $this->cm->id;
$iassignid = $this->iassign->id;
// Get data of current activity
$iassign_statement_activity_item = $this->activity->get_activity(); // search data of current activity
$ilm = new ilm($iassign_statement_activity_item->iassign_ilmid);
$iassign = $DB->get_record("iassign", array("id" => $iassignid));
$ilm_name = strtolower($ilm->ilm->name); // class ilm has a unique property ('ilm'), get the iLM name
// Do not allow the learner resent his solution only is iGeom iLM ("igeom") - why? iGeom acitivity "model answer" is not sent with the learner solution
$allow_resubmission = (substr($ilm_name, 0, 5) != "igeom" ? 1 : 0);
// log record
$info = $iassign->name . ":" . $iassign_statement_activity_item->name;
//Trigger module viewed event.
$event = \mod_iassign\event\submission_viewed::create(array(
'objectid' => $iassign->id,
'context' => $this->context,
'other' => $info
));
$event->add_record_snapshot('course', $this->course);
$event->trigger();
print $OUTPUT->header();
// Search of iLM data used in the current activity
$iassign_ilm = $DB->get_record("iassign_ilm", array("id" => $iassign_statement_activity_item->iassign_ilmid));
if ($this->action == 'viewsubmission') {
if (!empty($this->iassign_submission_current) || $this->iassign_submission_current != 0)
$iassign_submission = $DB->get_record("iassign_submission", array("id" => $this->iassign_submission_current)); // data about activity current
else
$iassign_submission = $DB->get_record("iassign_submission", array("iassign_statementid" => $this->activity->get_activity()->id, "userid" => $this->userid_iassign)); // data about student solution
} else {
$iassign_submission = $DB->get_record("iassign_submission", array("iassign_statementid" => $this->activity->get_activity()->id, "userid" => $this->userid_iassign)); // data about student solution
}
if ($iassign_submission)
$this->update_comment($iassign_submission->id);
$file = $iassign_statement_activity_item->file;
// 1 when open previous file; 2 when the activity is redone!; 3 when the teacher enter in the activity
// 1 => locallib.php: view_iassign_current(): action=view will set write_solution=0!!!!!
// 2 => locallib.php: view_iassign_current(): action=repeat will set write_solution=0!!!!!
// 3 => locallib.php: view_iassign_current(): action=viewsubmission will set write_solution=0!!!!!
$this->bottonPost = 0; // hide submit button
//xxx $this->write_solution = 0; // disable recording solution (however, iVProg allow the learner to edit previou solution)
$this->view_iassign = false; // disable visualization of activity
$repeat = "";
$last_iassign = "";
$student_answer = "";
$comment = "";
// *** Teacher access (view learner's submission)
if (($this->action != 'viewsubmission') && has_capability('mod/iassign:evaluateiassign', $USER->context, $USER->id)) {
//TODO leo Verificar se o correto eh '$this->context' ou '$USER->context' como deixei
// It is not 'viewsubmission' and it is teacher or 'non editing teacher'?
// ---> access teacher for test
if ($iassign_statement_activity_item->type_iassign != 1) // type_iassign=1 => activity of type "example" - not submit button for submission
$this->bottonPost = 1;
print $OUTPUT->box('
';
} // if ($iassign_statement_activity_item->type_iassign == 3)
print '
';
print $OUTPUT->box_end();
$USER->iassignEdit = $this->bottonPost;
if ($iassign_submission && $allow_resubmission) {
// Put the iLM to
print $OUTPUT->box_start();
print '
' . $last_iassign . '
';
//d if ($ilm->confirms_jar ( $iassign_statement_activity_item->file, $iassign_ilm->file_jar, $this->cm->id )) {
$enderecoPOST = "";
// Prepare tags to present the iLM
print $ilm->view_iLM($iassign_statement_activity_item, $student_answer, $enderecoPOST, false);
//d } // if ($this->confirms_jar($iassign_statement_activity_item->file, $iassign_ilm->file_jar))
print $OUTPUT->box_end();
} else { // if ($iassign_submission && $allow_resubmission) - techer view student answer
// ATTENTION: exception used by iGeom (exercise with "script")
$loadTeacherActivity = false; // use 'true' whenever 'special_param1 == 1'
if (substr($ilm_name, 0, 5)=="igeom") {
if ($iassign_statement_activity_item->special_param1 == 1) // if 1 => use the teacher activity with some complement from the student (in iGeom = GEO + SCR)
$loadTeacherActivity = true;
}
print $OUTPUT->box('
' . "\n";
} // if ($iassign_statement_activity_item->type_iassign == 3)
print $OUTPUT->box($output);
} // function show_info_iassign()
/// Shows date of opening and closing activities
function view_dates () {
global $USER, $CFG, $DB, $OUTPUT;
$return = $CFG->wwwroot . "/mod/iassign/view.php?id=" . $USER->cm;
$link_return = " " . iassign_icons::insert('home') . get_string('activities_page', 'iassign') . "";
$status_iassign = "";
$status_iassign1 = "";
$status_iassign2 = "";
if ($this->activity->type_iassign == 1) // activity of type example
$type_iassign = get_string('example_iassign', 'iassign');
elseif ($this->activity->type_iassign == 2) { // activity of type test
$type_iassign = get_string('test_iassign', 'iassign');
if ($this->activity->timeavailable > time()) {
$status_iassign = get_string('previous_timeavailable', 'iassign');
} elseif ($this->activity->timedue < time()) {
$status_iassign = get_string('last_timedue', 'iassign');
}
} elseif ($this->activity->type_iassign == 3) { // activity of type exercise
$type_iassign = get_string('exercise_iassign', 'iassign');
if ($this->activity->timeavailable > time()) {
$status_iassign = get_string('previous_timeavailable', 'iassign'); // before of deadline
} elseif ($this->activity->timedue < time()) { // after delivery
$status_iassign = get_string('last_timedue', 'iassign');
if ($this->activity->preventlate == 1) // permitted to submit after the deadline
$status_iassign1 = get_string('duedate_preventlate_enable', 'iassign');
elseif ($this->activity->preventlate == 0) { // not permitted to submit after the deadline
$status_iassign1 = get_string('duedate_preventlate_desable', 'iassign');
if ($this->activity->test == 1) // allowed to test after of deadline
$status_iassign2 = get_string('test_preventlate', 'iassign');
elseif ($this->activity->test == 0) { // not allowed to test after of deadline
$status_iassign2 = get_string('test_preventlate_no', 'iassign');
} // elseif ($iassign_statement_activity_item->test == 0)
} // elseif ($iassign_statement_activity_item->preventlate == 0)
} // elseif ($iassign_statement_activity_item->timedue < time())
} // elseif ($iassign_statement_activity_item->type_iassign == 3)
$output = '
' . "\n";
$output .= '
' . $this->activity->name . '
' . "\n";
$output .= '
' . "\n";
// TODO duvida: como permitir ao admin,professor,monitor ver a atividade mesmo apos prazo???
// Leo testes para passar por cima com 'has_capability('mod/iassign:...', $this->context, $USER->id)
$output .= '
' . "\n";
print $OUTPUT->box($output);
} // function view_dates()
} // class activity
/// Class to manage Interactive Learning Module (iLM)
class ilm {
var $ilm;
/// Constructor of class
// @param int $id Id of iLM
//D 3.1 update PHP 7.0 compatibility for all moodle versions
//D public function ilm($id) { self::__construct($iassign, $cm, $course); }
function __construct ($id) {
global $DB;
$this->ilm = $DB->get_record("iassign_ilm", array("id" => $id));
if (empty($this->ilm))
$this->ilm = null;
}
/// Shows activity in iLM
// @calledby view_iassign_current()
function view_iLM ($iassign_statement_activity_item, $student_answer, $enderecoPOST, $view_teacherfileversion) {
global $USER, $CFG, $DB;
$iassign_ilm = $DB->get_record('iassign_ilm', array('id' => $iassign_statement_activity_item->iassign_ilmid));
// Faz a leitura do tipo de iLM e realiza a chamada à classe adequada
$typec = strtolower($iassign_ilm->type);
require_once 'ilm_handlers/' . $typec . '.php';
$retorno = $typec::show_activity_in_ilm($iassign_statement_activity_item, $student_answer, $enderecoPOST, $view_teacherfileversion);
return $retorno;
} // function view_iLM($iassign_statement_activity_item, $student_answer, $enderecoPOST, $view_teacherfileversion)
/// Function to give a single access to an iLM content avoi (after used, 'view()', after 'view_iLM(...)', will erase the entry)
// @calledby view_iLM($iassign_statement_activity_item, $student_answer, $enderecoPOST, $view_teacherfileversion) : $id_iLM_security=$this->write_iLM_security($iassign_statement_activity_item->id,$content_or_id_from_ilm_security);
// @param int $iassign_statement_activity_itemid Id of iassign statement
// @param Object $file File in use in activity
// @return int Return the id of log
function write_iLM_security ($iassign_activity_itemid, $content_or_id_from_ilm_security) {
global $CFG, $USER, $COURSE, $DB, $OUTPUT;
$newentry = new stdClass();
$newentry->iassign_statementid = $iassign_activity_itemid;
$newentry->userid = $USER->id;
$newentry->file = $content_or_id_from_ilm_security;
$newentry->timecreated = time();
$newentry->view = 1;
$id_iLM_security = $DB->insert_record("iassign_security", $newentry);
if (!$id_iLM_security) {
print_error('error_security', 'iassign'); // ./lib/setuplib.php: moodle_exception thrown
} // from (!$DB->insert_record("iassign_security", $newentry))
return $id_iLM_security;
}
/// Function to avoid that erros in remotion of entries in table 'iassign_security' allow future access to this contents
// @calledby view_iLM($iassign_statement_activity_item, $student_answer, $enderecoPOST, $view_teacherfileversion) : $this->remove_old_iLM_security_entries($USER->id, $iassign_statement_activity_item->id);
// @param int $userid
// @param int $iassign_activity_itemid Id of iassign statement
function remove_old_iLM_security_entries ($userid, $iassign_activity_itemid) {
global $DB;
// This is an additional security: erase eventually old entries in 'iassign_security' table (do not remove '$iassign_activity_itemid' since it is going to be used "now")
$result = $DB->delete_records_select("iassign_security", "userid=" . $userid . " AND iassign_statementid<>" . $iassign_activity_itemid, null);
}
} // class ilm
/// Class to manage settings of iLM.
class ilm_settings {
/// Function to prepare tag to load iLM (that is stored in Moodle filesystem - usually /var/moodledata/filedir/).
// In case of JAR it will prepare the tag "applet". In case of HTML5 will prepare an "iframe".
// @param int $ilm_id Id of iLM
// @param array $options An array with options for create dynamic tag html APPLET
// @return string Return with a tag html APPLET created
static function build_ilm_tags ($ilm_id, $options = array()) {
global $DB;
$iassign_ilm = $DB->get_record('iassign_ilm', array('id' => $ilm_id));
// Faz a leitura do tipo de iLM e realiza a chamada à classe adequada
$typec = strtolower($iassign_ilm->type);
require_once 'ilm_handlers/' . $typec . '.php';
$retorno = $typec::build_ilm_tags($ilm_id, $options);
return $retorno;
} // static function build_ilm_tags($ilm_id, $options = array())
/// Function for get modified date of iLM file
// @param string $file_jar String with Ids of iLM files
// @return string Return with the filenames and modified date
static function applet_filetime ($file_jar) {
$filetime = "";
$fs = get_file_storage();
$files_jar = explode(",", $file_jar);
foreach ($files_jar as $one_file) {
$file = $fs->get_file_by_id($one_file);
if ($file)
$filetime .= "\n" . $file->get_filename() . ' (' . userdate($file->get_timemodified()) . ')' . '';
}
return $filetime;
}
/// Function for verify an default applet
// @param String $file_jar String containing an list de ids of applet files
// @return boolean Return true or fale if applet is default
static function applet_default ($file_jar) {
$is_default = true;
$fs = get_file_storage();
$files_jar = explode(",", $file_jar);
foreach ($files_jar as $one_file) {
$file = $fs->get_file_by_id($one_file);
if ($file)
$is_default &= ($file->get_itemid() == 0);
}
return $is_default;
}
/// Function for get form variables for add, edit, or copy iLM
// @calledby settings_ilm.php
// @see settings_form.php
// @param int $ilm_id Id of iLM
// @param string $action String with the action
// @return object Return an object with forms variables
static function add_edit_copy_ilm ($ilm_id, $action) {
global $USER, $DB, $CFG;
require_once('settings_form.php');
$iassign_ilm = $DB->get_record('iassign_ilm', array('id' => $ilm_id));
$param = new stdClass();
$param->action = $action;
$param->ilm_id = $ilm_id;
$CFG->action_ilm = $action;
$CFG->ilm_id = $ilm_id;
if ($action == 'add') {
$param->title = get_string('add_ilm', 'iassign');
$param->name = "";
$param->version = "";
$param->url = "";
$param->description = "";
$param->extension = "";
$param->author = $USER->id;
$param->file_jar = "";
$param->file_jar_static = "";
$param->file_class = "";
$param->width = 800;
$param->height = 600;
$param->enable = 0; // 0 - hide / 1 - show
$param->timecreated = time();
$param->timemodified = time();
$param->evaluate = 0;
$param->parent = 0;
}
elseif ($action == 'edit') {
if ($iassign_ilm) {
$description = json_decode($iassign_ilm->description);
$param->title = get_string('edit_ilm', 'iassign');
$param->id = $iassign_ilm->id;
$param->name_ilm = $iassign_ilm->name;
$param->name = $iassign_ilm->name;
$param->version = $iassign_ilm->version;
$param->ilm_type = $iassign_ilm->type;
$param->url = $iassign_ilm->url;
$param->description = $description->{current_language()};
$param->description_lang = $iassign_ilm->description;
$param->extension = $iassign_ilm->extension;
$param->author = $iassign_ilm->author;
$param->file_jar = $iassign_ilm->file_jar;
$param->file_jar_static = ilm_settings::applet_filetime($iassign_ilm->file_jar);
$param->file_class = $iassign_ilm->file_class;
$param->width = $iassign_ilm->width;
$param->height = $iassign_ilm->height;
$param->enable = $iassign_ilm->enable;
$param->timecreated = $iassign_ilm->timecreated;
$param->timemodified = time();
$param->evaluate = $iassign_ilm->evaluate;
$param->parent = $iassign_ilm->parent;
}
}
elseif ($action == 'new_version') {
$description = json_decode($iassign_ilm->description);
if ($iassign_ilm) {
if ($iassign_ilm->parent == 0)
$iassign_ilm->parent = $ilm_id;
$param->title = get_string('new_version_ilm', 'iassign');
$param->name_ilm = $iassign_ilm->name;
$param->name = $iassign_ilm->name;
$param->version = "";
$param->ilm_type = $iassign_ilm->type;
$param->url = $iassign_ilm->url;
$param->description = $description->{current_language()};
$param->description_lang = $iassign_ilm->description;
$param->extension = $iassign_ilm->extension;
$param->author = $USER->id;
$param->file_jar = '';
$param->file_jar_static = '';
$param->file_class = $iassign_ilm->file_class;
$param->width = $iassign_ilm->width;
$param->height = $iassign_ilm->height;
$param->enable = 0;
$param->timecreated = time();
$param->timemodified = time();
$param->evaluate = $iassign_ilm->evaluate;
$param->parent = $iassign_ilm->parent;
}
} elseif ($action == 'copy') {
$description = json_decode($iassign_ilm->description);
if ($iassign_ilm) {
if ($iassign_ilm->parent == 0)
$iassign_ilm->parent = $ilm_id;
$param->title = get_string('copy_ilm', 'iassign');
$param->id = $iassign_ilm->id;
$param->name_ilm = $iassign_ilm->name;
$param->name = $iassign_ilm->name;
$param->version = "";
$param->ilm_type = $iassign_ilm->type;
$param->url = $iassign_ilm->url;
$param->description = $description->{current_language()};
$param->description_lang = $iassign_ilm->description;
$param->extension = $iassign_ilm->extension;
$param->author = $USER->id;
$param->file_jar = '';
$param->file_jar_static = '';
$param->file_class = $iassign_ilm->file_class;
$param->width = $iassign_ilm->width;
$param->height = $iassign_ilm->height;
$param->enable = 0;
$param->timecreated = time();
$param->timemodified = time();
$param->evaluate = $iassign_ilm->evaluate;
$param->parent = $iassign_ilm->parent;
}
}
return $param;
} // static function add_edit_copy_ilm($ilm_id, $action)
/// Function for save iLM file in moodledata
// @param int $itemid Itemid of file save in draft (upload file)
// @param int $ilm_id Id of iLM
// @return string Return an string with ids of iLM files
static function new_file_ilm ($itemid, $iassign_ilm) {
global $CFG, $USER, $DB;
$return = null;
$file_jar = array();
$fs = get_file_storage();
$contextuser = context_user::instance($USER->id);
$contextsystem = context_system::instance();
$files_ilm = $fs->get_area_files($contextuser->id, 'user', 'draft', $itemid);
if ($files_ilm) {
foreach ($files_ilm as $value) {
// VERIFICA SE e' DO TIPO HTML5
if ($iassign_ilm->type == 1) {
// Verifica a extensão do arquivo iLM para verificar se é ZIP
$ext = pathinfo($value->get_filename(), PATHINFO_EXTENSION);
// CASO SEJA ZIP: COPIA O ARQUIVO, PARA O ilm_debug E DESCOMPACTA no diretorio 'ilm'
if ((strtolower($ext) == 'zip')) {
// COPIA:
$destination = 'ilm_debug/' . $value->get_filename();
$value->copy_content_to($destination);
// EXTRAIR CONTEUDO:
$zip = new ZipArchive();
$extracted = './ilm';
$dir = "";
if ($zip->open($destination) === TRUE) {
$dir = './ilm/' . trim($zip->getNameIndex(0));
if (is_dir($dir)) {
$i = 1;
$previous = str_replace("/", "", $zip->getNameIndex(0));
while (file_exists('./ilm/' . $previous . "_" . $i)) {
$i ++;
}
$name = $previous . "_" . $i;
$dir = './ilm/' . $name . "/";
$j = 0;
while ($item_name = $zip->getNameIndex($j)) {
$zip->renameIndex($j, str_replace($previous, $name, $item_name));
$j++;
}
$zip->close();
}
$zip->open($destination);
$zip->extractTo($extracted);
$zip->close();
// Apos extrair, remover do DEBUG:
unlink($destination);
} else {
// APÓS NAO CONSEGUIR EXTRAIR, apagar O ZIP:
unlink($destination);
print_error('error_add_ilm_zip', 'iassign');
}
return $dir;
}
}
if ($value->get_filename() != '.') {
$file_ilm = array(
'userid' => $USER->id,
'contextid' => $contextsystem->id,
'component' => 'mod_iassign',
'filearea' => 'ilm',
'itemid' => rand(1, 999999999),
'filepath' => '/iassign/ilm/' . iassign_utils::format_pathname($iassign_ilm->name) . '/' . iassign_utils::format_pathname($iassign_ilm->version) . '/',
'filename' => $value->get_filename());
$file_ilm = $fs->create_file_from_storedfile($file_ilm, $value);
array_push($file_jar, $file_ilm->get_id());
}
}
if (!empty($file_jar)) {
$return = implode(",", $file_jar);
$old_file_jar = explode(",", $iassign_ilm->file_jar);
foreach ($old_file_jar as $value) {
$file = $fs->get_file_by_id($value);
if ($file)
$fs->delete_area_files($contextsystem->id, 'mod_iassign', 'ilm', $file->get_itemid());
}
}
} else
$return = $iassign_ilm->file_jar;
$delete_file = $fs->delete_area_files($contextuser->id, 'user', 'draft', $itemid);
return $return;
}
/// Function for save in database an new iLM
// @param object $param An object with iLM params
static function new_ilm ($itemid) {
global $CFG, $USER, $OUTPUT;
// Verifica se existe algum XML anterior na pasta temp e o exclui
if (file_exists($CFG->dataroot . '/temp/' . 'ilm-application.xml')) {
unlink($CFG->dataroot . '/temp/' . 'ilm-application.xml');
}
$pathtemp = $CFG->dataroot . '/temp/';
$contextuser = context_user::instance($USER->id);
$fs = get_file_storage();
$zip = new zip_packer();
$files = $fs->get_directory_files($contextuser->id, 'user', 'draft', $itemid, '/');
foreach ($files as $file) {
if (!$file->is_directory())
$files_extract = $zip->extract_to_pathname($file, $pathtemp);
}
$application_xml = @simplexml_load_file($CFG->dataroot . '/temp/' . 'ilm-application.xml', null, LIBXML_NOCDATA);
// Verifica se o pacote possui o XML
if (!$application_xml) {
print($OUTPUT->notification(get_string('error_xml_ilm', 'iassign'), 'notifyproblem'));
return;
} else {
$missing = "";
if (!isset($application_xml->name)) {
$missing .= "name";
}
if (!isset($application_xml->version)) {
$missing .= ", version";
}
if (!isset($application_xml->type)) {
$missing .= ", type";
}
if (!isset($application_xml->extension)) {
$missing .= ", extension";
}
if (!isset($application_xml->file_jar)) {
$missing .= ", file_jar";
}
if (!isset($application_xml->file_class)) {
$missing .= ", file_class";
}
if (!isset($application_xml->width)) {
$missing .= ", width";
}
if (!isset($application_xml->height)) {
$missing .= ", height";
}
if (!isset($application_xml->evaluate)) {
$missing .= ", evaluate";
}
if (strlen($missing) > 2) {
print($OUTPUT->notification(get_string('error_xml_missing', 'iassign') . $missing . ".", 'notifyproblem'));
return;
}
}
// Faz a leitura do tipo de iLM e realiza a chamada à classe adequada
$typec = strtolower($application_xml->type);
require_once 'ilm_handlers/' . $typec . '.php';
$retorno = $typec::new_ilm($itemid, $files_extract, $application_xml, $contextuser, $fs);
return $retorno;
}
/// Function for save in database an iLM edit
// @param object $param An object with iLM params
static function edit_ilm ($param, $itemid) {
// Descobrir o tipo de iLM:
global $DB, $USER, $CFG;
$iassign_t = $DB->get_record('iassign_ilm', array('id' => $param->id));
$pathtemp = $CFG->dataroot . '/temp/';
$contextuser = context_user::instance($USER->id);
$fs = get_file_storage();
$zip = new zip_packer();
$files = $fs->get_directory_files($contextuser->id, 'user', 'draft', $itemid, '/');
$files_extract = null;
foreach ($files as $file) {
if (!$file->is_directory())
$files_extract = $zip->extract_to_pathname($file, $pathtemp);
}
// Faz a leitura do tipo de iLM e realiza a chamada à classe adequada
$typec = strtolower($iassign_t->type);
require_once 'ilm_handlers/' . $typec . '.php';
$typec::edit_ilm($param, $itemid, $files_extract, $contextuser);
}
/// Function for save in database an iLM copy
// @param object $param An object with iLM params
static function copy_new_version_ilm ($param) {
global $DB, $CFG, $USER;
$itemid = $param->file;
$pathtemp = $CFG->dataroot . '/temp/';
$contextuser = context_user::instance($USER->id);
$fs = get_file_storage();
$zip = new zip_packer();
$files = $fs->get_directory_files($contextuser->id, 'user', 'draft', $itemid, '/');
$files_extract = null;
foreach ($files as $file) {
if (!$file->is_directory())
$files_extract = $zip->extract_to_pathname($file, $pathtemp);
}
// Faz a leitura do tipo de iLM e realiza a chamada à classe adequada
$iassign_t = $DB->get_record('iassign_ilm', array('id' => $param->parent));
$typec = strtolower($iassign_t->type);
require_once 'ilm_handlers/' . $typec . '.php';
$typec::copy_new_version_ilm($param, $files_extract);
}
//VER::
//Notice: Undefined variable: output_ilm in C:\Users\Igor\OneDrive\htdocs\moodleteste\moodle\mod\iassign\locallib.php on line 5054
// Notice: Trying to get property of non-object in C:\Users\Igor\OneDrive\htdocs\moodleteste\moodle\mod\iassign\locallib.php on line 192
//Notice: Trying to get property of non-object in C:\Users\Igor\OneDrive\htdocs\moodleteste\moodle\mod\iassign\locallib.php on line 194
/// Function for change visibility of iLM
// @param int $ilm_id Id of iLM
// @param int $status Indicator of change vibility (0 = hide, 1 = show)
static function visible_ilm ($ilm_id, $status) {
global $DB;
if ($status == 0)
$visible = 1;
else
$visible = 0;
$newentry = new stdClass();
$newentry->id = $ilm_id;
$newentry->enable = $visible;
if (!$DB->update_record("iassign_ilm", $newentry))
error(get_string('error_edit_ilm', 'iassign'));
}
/// Function for confirm change default iLM
// @param int $ilm_id Id of iLM
// @param int $ilm_parent Id of parent iLM
// @return string Return with an string for create default page confirmation
static function confirm_default_ilm ($ilm_id, $ilm_parent) {
global $OUTPUT, $DB;
$iassign_ilm = $DB->get_record('iassign_ilm', array('id' => $ilm_id));
$optionsno = new moodle_url('/admin/settings.php', array('section' => 'modsettingiassign', 'action' => 'config', 'ilm_id' => $ilm_parent));
$optionsyes = new moodle_url('/mod/iassign/settings_ilm.php', array('action' => 'default', 'ilm_id' => $ilm_id, 'ilm_parent' => $ilm_parent));
$return = $OUTPUT->heading(get_string('confirm_default', 'iassign') . ': ' . $iassign_ilm->name);
$return .= $OUTPUT->confirm(get_string('confirm_default_ilm', 'iassign') . $OUTPUT->help_icon('confirm_default_ilm', 'iassign'), $optionsyes, $optionsno);
return $return;
}
/// Function for change default iLM
// @param int $ilm_id Id of iLM
// @return int Return Id of default iLM
static function default_ilm ($ilm_id) {
global $DB;
$iassign_ilm_default = $DB->get_record("iassign_ilm", array('id' => $ilm_id));
$iassign_ilm = $DB->get_record("iassign_ilm", array('id' => $iassign_ilm_default->parent));
$DB->delete_records("iassign_ilm", array('id' => $iassign_ilm_default->id));
$iassign_ilm_default->id = $iassign_ilm->id;
$iassign_ilm_default->parent = 0;
$iassign_ilm->parent = $iassign_ilm_default->id;
$iassign_ilm->id = 0;
$iassign_ilm_default->enable = 1;
if (!$DB->update_record("iassign_ilm", $iassign_ilm_default)) {
print_error('error_edit_ilm', 'iassign');
}
if (!$DB->insert_record("iassign_ilm", $iassign_ilm)) {
$msg_error = get_string('error_add_ilm', 'iassign') . " In default_ilm(" . $ilm_id . ") \n";
print_error($msg_error);
//xx print_error('error_add_ilm', 'iassign');
}
return $iassign_ilm_default->id;
}
/// Function for confirm delete iLM
// @param int $ilm_id Id of iLM
// @param int $ilm_parent Id of parent iLM
// @return string Return with an string for create delete page confirmation
static function confirm_delete_ilm ($ilm_id, $ilm_parent) {
global $OUTPUT, $DB;
$iassign_ilm = $DB->get_record('iassign_ilm', array('id' => $ilm_id));
$optionsno = new moodle_url('/admin/settings.php', array('section' => 'modsettingiassign', 'action' => 'config', 'ilm_id' => $ilm_parent));
$optionsyes = new moodle_url('/mod/iassign/settings_ilm.php', array('action' => 'delete', 'ilm_id' => $ilm_id, 'ilm_parent' => $ilm_parent));
return $OUTPUT->confirm(get_string('confirm_delete_ilm', 'iassign', $iassign_ilm->name . ' ' . $iassign_ilm->version), $optionsyes, $optionsno);
}
/// Function for delete directory where the iLM is allocated.
// @param string $dirPath
// @throws InvalidArgumentException
public static function delete_dir ($dirPath) {
if (substr($dirPath, strlen($dirPath) - 1, 1) != '/') {
$dirPath .= '/';
}
$files = glob($dirPath . '*', GLOB_MARK);
foreach ($files as $file) {
if (is_dir($file)) {
ilm_settings::delete_dir($file);
} else {
unlink($file);
}
}
rmdir($dirPath);
}
/// Function for delete iLM
// @param int $ilm_id Id of iLM
// @return int Return Id of parent iLM
static function delete_ilm ($ilm_id) {
global $DB;
$iassign_ilm = $DB->get_record('iassign_ilm', array('id' => $ilm_id));
// Faz a leitura do tipo de iLM e realiza a chamada à classe adequada
$typec = strtolower($iassign_ilm->type);
require_once 'ilm_handlers/' . $typec . '.php';
$retorno = $typec::delete_ilm($ilm_id);
return $retorno;
}
/// Function to export iLM package (ZIP file), eventually to install in other Moodle
// @param int $ilm_id Id of iLM
static function export_ilm ($ilm_id) {
global $DB;
$iassign_ilm = $DB->get_record('iassign_ilm', array('id' => $ilm_id));
// Faz a leitura do tipo de iLM e realiza a chamada à classe adequada
$typec = strtolower($iassign_ilm->type);
require_once 'ilm_handlers/' . $typec . '.php';
$typec::export_ilm($ilm_id);
} // static function export_ilm($ilm_id)
//TODO iLM_HTML5 :: //MOOC 2016
// Function to export iLM package descriptor for allow online update. //TODO a ser usado onde? como?
// @param int $ilm_id Id of iLM
static function export_update_ilm ($ilm_id) {
global $DB, $CFG;
$iassign_ilm = $DB->get_record('iassign_ilm', array('id' => $ilm_id));
$xml_filename = $CFG->dataroot . '/temp/ilm-upgrade_' . iassign_utils::format_pathname($iassign_ilm->name) . '.xml';
$zip_filename = 'ilm-' . iassign_utils::format_pathname($iassign_ilm->name . '-v' . $iassign_ilm->version) . '.ipz';
$upgrade_descriptor = '' . "\n";
$upgrade_descriptor .= '' . "\n";
$upgrade_descriptor .= ' ' . $iassign_ilm->version . '' . "\n";
$upgrade_descriptor .= ' ' . $zip_filename . '' . "\n";
$upgrade_descriptor .= ' ' . iassign_language::json_to_xml($iassign_ilm->description) . "\n " . '' . "\n";
$upgrade_descriptor .= '' . "\n";
file_put_contents($xml_filename, $upgrade_descriptor);
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private", false);
header('Content-Type: application/xml; charset=utf-8');
header("Content-Disposition: attachment; filename=\"" . basename($xml_filename) . "\";");
header("Content-Length: " . @filesize($xml_filename));
set_time_limit(0);
@readfile("$xml_filename") || die("File not found.");
unlink($xml_filename);
exit;
} // static function export_update_ilm($ilm_id) //MOOC 2016
/// Function for save iLM from XML descriptor
// @param array $application_xml Data of XML descriptor
// @param array $files_extract Filenames of extract files
// @return array Return an array content id of JAR files
static function save_ilm_by_xml ($application_xml, $files_extract) {
global $CFG, $USER;
// Tratamento diferenciado se for do tipo HTML5:
$source = "";
$diretorio = "";
if (strtolower($application_xml->type) == 'html5') {
$i = 0;
foreach ($files_extract as $key => $value) {
$file = $CFG->dataroot . '/temp/' . $key;
// Verifica se já existe a pasta no diretório dos iLM:
if ($i == 0) {
$source = $file;
if (file_exists("ilm/" . basename($file))) {
$j = 1;
while (file_exists('ilm/' . basename($file) . "_" . $j)) {
$j ++;
}
$diretorio = 'ilm/' . basename($file) . "_" . $j;
mkdir($diretorio, 0777, true);
} else {
$diretorio = 'ilm/' . basename($file);
mkdir($diretorio, 0777, true);
}
break;
}
$i ++;
}
foreach ($iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source, RecursiveDirectoryIterator::SKIP_DOTS), RecursiveIteratorIterator::SELF_FIRST) as $item) {
if ($item->isDir()) {
mkdir($diretorio . DIRECTORY_SEPARATOR . $iterator->getSubPathName());
} else {
copy($item, $diretorio . DIRECTORY_SEPARATOR . $iterator->getSubPathName());
}
}
ilm_settings::delete_dir($source);
return "./" . $diretorio;
}
$fs = get_file_storage();
$file_jar = array();
$files_ilm = explode(",", $application_xml->file_jar);
$contextsystem = context_system::instance();
foreach ($files_ilm as $value) {
$file_ilm = array(
'userid' => $USER->id,
'contextid' => $contextsystem->id,
'component' => 'mod_iassign',
'filearea' => 'ilm',
'itemid' => rand(1, 999999999),
'filepath' => '/iassign/ilm/' . iassign_utils::format_pathname($application_xml->name) . '/' . iassign_utils::format_pathname($application_xml->version) . '/',
'filename' => $value);
$file_ilm = $fs->create_file_from_pathname($file_ilm, $CFG->dataroot . '/temp/' . $value);
array_push($file_jar, $file_ilm->get_id());
}
foreach ($files_extract as $key => $value) {
$file = $CFG->dataroot . '/temp/' . $key;
if (file_exists($file))
unlink($file);
}
return $file_jar;
}
/// Function for import the iLM from an package
// @param int $itemid Itemid of zip file
static function import_ilm ($itemid) {
global $CFG, $USER, $OUTPUT;
// Verifica se existe algum XML anterior na pasta temp e o exclui
if (file_exists($CFG->dataroot . '/temp/' . 'ilm-application.xml')) {
unlink($CFG->dataroot . '/temp/' . 'ilm-application.xml');
}
$pathtemp = $CFG->dataroot . '/temp/';
$contextuser = context_user::instance($USER->id);
$fs = get_file_storage();
$zip = new zip_packer();
$files = $fs->get_directory_files($contextuser->id, 'user', 'draft', $itemid, '/');
foreach ($files as $file) {
if (!$file->is_directory())
$files_extract = $zip->extract_to_pathname($file, $pathtemp);
}
$application_xml = @simplexml_load_file($CFG->dataroot . '/temp/' . 'ilm-application.xml', null, LIBXML_NOCDATA);
// Verifica se o pacote possui o XML
if (!$application_xml) {
print($OUTPUT->notification(get_string('error_xml_ilm', 'iassign'), 'notifyproblem'));
return;
} else {
$missing = "";
if (!isset($application_xml->name)) {
$missing .= "name";
}
if (!isset($application_xml->version)) {
$missing .= ", version";
}
if (!isset($application_xml->type)) {
$missing .= ", type";
}
if (!isset($application_xml->extension)) {
$missing .= ", extension";
}
if (!isset($application_xml->file_jar)) {
$missing .= ", file_jar";
}
if (!isset($application_xml->file_class)) {
$missing .= ", file_class";
}
if (!isset($application_xml->width)) {
$missing .= ", width";
}
if (!isset($application_xml->height)) {
$missing .= ", height";
}
if (!isset($application_xml->evaluate)) {
$missing .= ", evaluate";
}
if (strlen($missing) > 2) {
print($OUTPUT->notification(get_string('error_xml_missing', 'iassign') . $missing . ".", 'notifyproblem'));
return;
}
}
// Faz a leitura do tipo de iLM e realiza a chamada à classe adequada
$typec = strtolower($application_xml->type);
require_once 'ilm_handlers/' . $typec . '.php';
$typec::import_ilm($itemid, $files_extract, $application_xml, $contextuser, $fs);
} // static function import_ilm($itemid)
/// Function for list iLM defaults
// @return string Return an string with a table of iLM
static function list_ilm () {
global $DB, $OUTPUT;
$iassign_ilm = $DB->get_records('iassign_ilm', array("enable" => 1));
$str = '';
$str .= '