iMath) - Computer Science Dep. of IME-USP (Brazil)
*
* License
* - http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
global $CFG;
require_once $CFG->dirroot . '/mod/iassign/ilm_handle.php';
class html5 implements ilm_handle {
/// Produce HTML code to load iLM
public static function build_ilm_tags ($ilm_id, $options = array()) {
global $DB, $OUTPUT;
global $CONF_WWW; //TODO 1 => use iLM under WWW; otherwise use under MoodleData
$html = "";
if (empty($options['Proposition']))
$options['Proposition'] = "";
if (empty($options['addresPOST']))
$options['addresPOST'] = "";
if (empty($options['student_answer']))
$options['student_answer'] = "";
if (empty($options['notSEND']))
$options['notSEND'] = "";
else // Case it is authoring put 'notSEND' (important to iVProgH5 to present authoring tool)
if ($options['type'] == "editor_update")
$options['notSEND'] = "true";
if (empty($options['id_iLM_security'])) // if defined, it is from 'iassign_security'
$options['id_iLM_security'] = "";
$id_iLM_security = $options['id_iLM_security'];
$iassign_ilm = $DB->get_record('iassign_ilm', array('id' => $ilm_id));
if ($iassign_ilm) {
// md_files : filename
$ilm_extension = $iassign_ilm->extension; // use local variavel to efficiency (several use)
if ($ilm_extension) { // avoid problems
$ilm_extension = strtolower($ilm_extension);
}
// Attention: in iAssign 2014 on, all the iLM is located on the Moodle filesystem (usually /var/moodledata/filedir/).
// This means that '$iassign_ilm->file_jar' = '*_files.id'
$file_url = array();
$fs = get_file_storage();
$files_jar = explode(",", $iassign_ilm->file_jar);
$url = $iassign_ilm->file_class; // to HTML5 package, this 'file_class' must have the main HTML file
array_push($file_url, $url);
$lang = substr(current_language(), 0, 2);
if ($options['type'] == "filter") { //leo
$iassign_ilm_width = $options['width']; // or use? $iassign_ilm->width
$iassign_ilm_height = $options['height']; // or use? $iassign_ilm->height
} else { //leo
$iassign_ilm_width = $iassign_ilm->width;
$iassign_ilm_height = $iassign_ilm->height; // or use? $iassign_ilm->height
}
if (!empty($file_url)) { // There is an iLM file
//TODO iLM_HTML5 :: Change to 'object', tag 'applet' was deprecated.
$paramsStr = "?1=1";
switch ($options['type']) {
case "view":
$paramsStr .= "&iLM_PARAM_Assignment=" . urlencode($options['Proposition']); //leo
$paramsStr .= "&iLM_PARAM_SendAnswer=true";
//TODO: REVIEW: this code is to insert iLM as HTML5 and to allow general parameter to any iLM
//TODO: For now, 'iassign_ilm_config' is empty... let comment these lines
//n $iassign_ilm_config = $DB->get_records('iassign_ilm_config', array('iassign_ilmid' => $ilm_id));
//n foreach ($iassign_ilm_config as $ilm_config) {
//n if (array_key_exists($ilm_config->param_name, $options)) {
//n $ilm_config->param_value = $options[$ilm_config->param_name];
//n $paramsStr .= "&" . $ilm_config->param_name . "=" . urlencode($ilm_config->param_value);
//n }
//n }
break;
case "filter":
if ($options['toolbar'] == "disable")
$paramsStr .= "&SOH_ADD=ADD";
$paramsStr .= "&iLM_PARAM_AssignmentURL=true";
$paramsStr .= "&iLM_PARAM_Assignment=" . urlencode($options['Proposition']);
$paramsStr .= "&iLM_PARAM_SendAnswer=" . urlencode($options['notSEND']);
$paramsStr .= "&iLM_PARAM_ServerToGetAnswerURL=" . urlencode($ilm_config->param_value);
break; // static function build_ilm_tags($ilm_id, $options=array())
case "activity": // build_ilm_tags
//TODO To generalize to any HTML5 iLM, it is necessary to use 'iLM_PARAM_Assignment' and 'iLM_PARAM_SendAnswer'
//TODO iLM_PARAM_Assignment=Proposition ; iLM_PARAM_SendAnswer=notSEND
$paramsStr .= "&iLM_PARAM_AssignmentURL=true";
// if ($options['special_param'] == 1) { }
$paramsStr .= "&iLM_PARAM_Assignment=" . urlencode($options['Proposition']);
$paramsStr .= "&iLM_PARAM_SendAnswer=" . urlencode($options['notSEND']);
$paramsStr .= "&iLM_PARAM_ServerToGetAnswerURL=" . urlencode($options['addresPOST']);
//TODO iLM_HTML5 :: To extend to any iLM in HTML5
//TODO iLM_HTML5 :: it will allow to load dynamic parameters
//T $iassign_activity_item_configs = $DB->get_records('iassign_statement_config', array('iassign_statementid' => $options['iassign_statement'] ));
//T if ($iassign_activity_item_configs) {
//T foreach ($iassign_activity_item_configs as $iassign_activity_item_config)
//T $paramsStr .= "&" . $iassign_activity_item_config->param_name . "=" . urlencode($iassign_activity_item_config->param_value);
//T }
break;
case "editor_new":
$paramsStr .= "&iLM_PARAM_AssignmentURL=true";
$paramsStr .= "&iLM_PARAM_SendAnswer=" . urlencode($options['notSEND']);
$paramsStr .= "&iLM_PARAM_Authoring=true";
break;
case "editor_update":
$paramsStr .= "&iLM_PARAM_AssignmentURL=true";
$paramsStr .= "&iLM_PARAM_Assignment=" . urlencode($options['Proposition']);
$paramsStr .= "&iLM_PARAM_SendAnswer=" . urlencode($options['notSEND']);
$paramsStr .= "&iLM_PARAM_Authoring=true";
break;
default:
$html .= iassign::warning_message_iassign('error_view_without_actiontype'); // $OUTPUT->notification(get_string('error_view_without_actiontype', 'iassign'), 'notifyproblem'); // The API allows for creation of four types of notification: error, warning, info, and success.
} // switch($options['type'])
$paramsStr .= "&lang=" . $lang; // get the language defined in Moodle
$parameters = ' style="width: ' . $iassign_ilm_width . 'px; height: ' . $iassign_ilm_height . 'px;" ';
$html .= '' . "\n";
} // if (!empty($file_url))
} // if ($iassign_ilm)
return $html;
} // public static function build_ilm_tags($ilm_id, $options = array())
/// Exibe a atividade no iLM
// @calledby locallib.php : view_iLM(...)
public static function show_activity_in_ilm ($iassign_statement_activity_item, $student_answer, $enderecoPOST, $view_teacherfileversion) {
global $USER, $CFG, $COURSE, $DB, $OUTPUT;
$special_param1 = $iassign_statement_activity_item->special_param1;
$ilm = $DB->get_record('iassign_ilm', array('id' => $iassign_statement_activity_item->iassign_ilmid));
$context = context_module::instance($USER->cm);
//TODO Given an activity => find its correspondent file in Moodle data. Bad solution!
//TODO Change the meaning of 'iassign_statement.file' from insertion order to the ID in table 'files'.
//TODO This demands update to each 'iassign_statement', find its corresponding on in 'files', and update 'iassign_statement.file = files.id'
if ($view_teacherfileversion) { // get the exercise in Moodle data (teacher file)
$fileid = "";
$fs = get_file_storage();
$files = $fs->get_area_files($context->id, 'mod_iassign', 'exercise', $iassign_statement_activity_item->file); // iassign_statement_activity_item = table 'iassign_statement'
if ($files) {
foreach ($files as $value) {
if ($value->get_filename() != '.')
$fileid = $value->get_id();
}
}
if (!$fileid) { // 'Something is wrong. Maybe your teacher withdrew this exercise file. Please, inform your teacher.';
print iassign::warning_message_iassign('error_exercise_removed') . "
\n"; // I couldn't find the file in table 'files'!
}
}
$ilm_name = strtolower($ilm->name);
$extension = iassign_utils::filename_extension($ilm_name);
if ($view_teacherfileversion) { // $view_teacherfileversion==1 => load the exercise ('activity') from the 'moodledata' (id in 'files')
// $content_or_id_from_ilm_security = $this->context->id;
$content_or_id_from_ilm_security = $fileid; // $iassign_statement_activity_item->file;
} else { // $view_teacherfileversion==null => load the learner answer from the data base (iassign_submission)
$content_or_id_from_ilm_security = $student_answer;
}
$allow_submission = false; // There is permission to 'submission' button?
//VERIFICAR ESTE IF
if ($USER->iassignEdit == 1 && $student_answer) { // for now, only iVProg2 and iVProgH5 allows editions of exercise already sent
$allow_submission = true; // yes!
$write_solution = 1;
$enderecoPOST .= "&write_solution=1"; // complement POST address indicating that the learner could send edited solution
}
// Security: this avoid the student get a second access to the file content (usually an exercise)
// Data are registered in the table '*_iassign_security' bellow and is erased by function 'view()' above.
// IMPORTANT: the '$end_file' will receive the iLM content URL using the security filter './mod/iassign/ilm_security.php'
// the iLM must request the content using this URL. Data are registered in the table '*_iassign_security'.
// Attention : using iVProgH5 there are lot of " and the use of slashes (as '\"') will imply in iVProgH5 do not read the file!
// do not use: $id_iLM_security = $this->write_iLM_security($iassign_statement_activity_item->id, addslashes($content_or_id_from_ilm_security));
//2017 $id_iLM_security = $this->write_iLM_security($iassign_statement_activity_item->id, $content_or_id_from_ilm_security); // insert in 'iassign_security'
//2017 $this->remove_old_iLM_security_entries($USER->id, $iassign_statement_activity_item->id); // additional security: erase eventually old entries
require_once ($CFG->dirroot . '/mod/iassign/ilm_security.php');
$timecreated = time();
$token = md5($timecreated); // iassign_iLM_security->timecreated);
$id_iLM_security = ilm_security::write_iLM_security($USER->id, $timecreated, $iassign_statement_activity_item->id, $content_or_id_from_ilm_security); // insert in 'iassign_security'
// $iassign_iLM_security = $DB->get_record("iassign_security", array("id" => $id_iLM_security));
$end_file = $CFG->wwwroot . '/mod/iassign/ilm_security.php?id=' . $id_iLM_security . '&token=' . $token . '&view=' . $view_teacherfileversion; // need full path...
//
//
$iassign = "
\n";
$iassign .= "\n