AutorÃa | Ultima modificación | Ver Log |
<?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/>.
/**
* Configurable Reports
* A Moodle block for creating Configurable Reports
* @package blocks
* @author: Juan leyva <http://www.twitter.com/jleyvadelgado>
* @date: 2009
*/
function cr_print_js_function() {
?>
<script type="text/javascript">
function printDiv(id){
var cdiv, tmpw;
cdiv = document.getElementById(id);
tmpw = window.open(" ","Print");
tmpw.document.open();
tmpw.document.write('<html><body>');
tmpw.document.write(cdiv.innerHTML);
tmpw.document.write('</'+'body></html>');
tmpw.document.close();
setTimeout(function() {
tmpw.print();
tmpw.close();
}, 1000);
}
</script>
<?php
}
function cr_add_jsdatatables($cssid, \moodle_page $page) {
global $OUTPUT;
$data = array();
$data['selector'] = $cssid;
$page->requires->string_for_js('thousandssep', 'langconfig');
$page->requires->strings_for_js(
array(
'datatables_sortascending',
'datatables_sortdescending',
'datatables_first',
'datatables_last',
'datatables_next',
'datatables_previous',
'datatables_emptytable',
'datatables_info',
'datatables_infoempty',
'datatables_infofiltered',
'datatables_lengthmenu',
'datatables_loadingrecords',
'datatables_processing',
'datatables_search',
'datatables_zerorecords',
),
'block_configurable_reports');
$page->requires->js_call_amd('block_configurable_reports/main', 'add_jsdatatables', array($data));
}
/**
* @param $cssid
* @param \moodle_page $page
*/
function cr_add_jsordering($cssid, \moodle_page $page = null) {
global $OUTPUT;
if(!empty($page)) {
$data = array();
$data['selector'] = $cssid;
if (method_exists($OUTPUT, 'image_url')) {
$data['background'] = $OUTPUT->image_url('normal', 'block_configurable_reports')->out();
$data['backgroundasc'] = $OUTPUT->image_url('asc', 'block_configurable_reports')->out();
$data['backgrounddesc'] = $OUTPUT->image_url('desc', 'block_configurable_reports')->out();
}
$page->requires->js_call_amd('block_configurable_reports/main', 'js_order', array($data));
}
}
function urlencode_recursive($var) {
if (is_object($var)) {
$newvar = new \stdClass();
$properties = get_object_vars($var);
foreach ($properties as $property => $value) {
$newvar->$property = urlencode_recursive($value);
}
} else if (is_array($var)) {
$newvar = array();
foreach ($var as $property => $value) {
$newvar[$property] = urlencode_recursive($value);
}
} else if (is_string($var)) {
$newvar = urlencode($var);
} else {
// Nulls, integers, etc.
$newvar = $var;
}
return $newvar;
}
function urldecode_recursive($var) {
if (is_object($var)) {
$newvar = new \stdClass();
$properties = get_object_vars($var);
foreach ($properties as $property => $value) {
$newvar->$property = urldecode_recursive($value);
}
} else if (is_array($var)) {
$newvar = array();
foreach ($var as $property => $value) {
$newvar[$property] = urldecode_recursive($value);
}
} else if (is_string($var)) {
$newvar = urldecode($var);
} else {
$newvar = $var;
}
return $newvar;
}
function cr_get_my_reports($courseid, $userid, $allcourses = true) {
global $DB;
$reports = [];
if ($courseid == SITEID) {
$context = \context_system::instance();
} else {
$context = \context_course::instance($courseid);
}
if (has_capability('block/configurable_reports:managereports', $context, $userid)) {
if ($courseid == SITEID && $allcourses) {
$reports = $DB->get_records('block_configurable_reports', null, 'name ASC');
} else {
$reports = $DB->get_records('block_configurable_reports', array('courseid' => $courseid), 'name ASC');
}
} else {
$reports = $DB->get_records_select('block_configurable_reports', 'ownerid = ? AND courseid = ? ORDER BY name ASC', array($userid, $courseid));
}
return $reports;
}
function cr_serialize($var) {
return serialize(urlencode_recursive($var));
}
function cr_unserialize($var) {
// It's needed to convert the object to stdClass to avoid __PHP_Incomplete_Class error.
$var = preg_replace('/O:6:"object"/', 'O:8:"stdClass"', $var);
// To make SQL queries compatible with PostgreSQL it's needed to replace " to '.
$var = preg_replace('/THEN\+%22(.+?)%22/', 'THEN+%27${1}%27', $var);
$var = preg_replace('/%60/', '+++', $var);
return urldecode_recursive(unserialize($var));
}
function cr_check_report_permissions($report, $userid, $context) {
global $DB, $CFG;
require_once($CFG->dirroot.'/blocks/configurable_reports/report.class.php');
require_once($CFG->dirroot.'/blocks/configurable_reports/reports/'.$report->type.'/report.class.php');
$classn = 'report_'.$report->type;
$classi = new $classn($report->id);
return $classi->check_permissions($userid, $context);
}
function cr_get_report_plugins($courseid) {
$pluginoptions = array();
$context = ($courseid == SITEID) ? \context_system::instance() : \context_course::instance($courseid);
$plugins = get_list_of_plugins('blocks/configurable_reports/reports');
if ($plugins) {
foreach ($plugins as $p) {
if ($p == 'sql' && !has_capability('block/configurable_reports:managesqlreports', $context)) {
continue;
}
$pluginoptions[$p] = get_string('report_'.$p, 'block_configurable_reports');
}
}
return $pluginoptions;
}
function cr_get_export_plugins() {
$exportoptions = array();
$plugins = get_list_of_plugins('blocks/configurable_reports/export');
if ($plugins) {
foreach ($plugins as $p) {
$pluginoptions[$p] = get_string('export_'.$p, 'block_configurable_reports');
}
}
return $pluginoptions;
}
function cr_print_table($table, $return = false) {
global $COURSE;
$output = '';
if (isset($table->align)) {
foreach ($table->align as $key => $aa) {
if ($aa) {
$align[$key] = ' text-align:'. fix_align_rtl($aa) .';'; // Fix for RTL languages.
} else {
$align[$key] = '';
}
}
}
if (isset($table->size)) {
foreach ($table->size as $key => $ss) {
if ($ss) {
$size[$key] = ' width:'. $ss .';';
} else {
$size[$key] = '';
}
}
}
if (isset($table->wrap)) {
foreach ($table->wrap as $key => $ww) {
if ($ww) {
$wrap[$key] = ' white-space:nowrap;';
} else {
$wrap[$key] = '';
}
}
}
if (empty($table->width)) {
$table->width = '80%';
}
if (empty($table->tablealign)) {
$table->tablealign = 'center';
}
if (!isset($table->cellpadding)) {
$table->cellpadding = '5';
}
if (!isset($table->cellspacing)) {
$table->cellspacing = '1';
}
if (empty($table->class)) {
$table->class = 'generaltable';
}
$tableid = empty($table->id) ? '' : 'id="'.$table->id.'"';
$output .= '<form action="send_emails.php" method="post" id="sendemail">';
$output .= '<table width="'.$table->width.'" ';
if (!empty($table->summary)) {
$output .= " summary=\"$table->summary\"";
}
$output .= " cellpadding=\"$table->cellpadding\" cellspacing=\"$table->cellspacing\" class=\"$table->class boxalign$table->tablealign\" $tableid>\n";
$countcols = 0;
$isuserid = -1;
if (!empty($table->head)) {
$countcols = count($table->head);
$output .= '<thead><tr>';
$keys = array_keys($table->head);
$lastkey = end($keys);
foreach ($table->head as $key => $heading) {
if ($heading == 'sendemail') {
$isuserid = $key;
}
if (!isset($size[$key])) {
$size[$key] = '';
}
if (!isset($align[$key])) {
$align[$key] = '';
}
if ($key == $lastkey) {
$extraclass = ' lastcol';
} else {
$extraclass = '';
}
$output .= '<th style="vertical-align:top;'. $align[$key].$size[$key] .';white-space:normal;" class="header c'.$key.$extraclass.'" scope="col">'. $heading .'</th>';
}
$output .= '</tr></thead>'."\n";
}
if (!empty($table->data)) {
$oddeven = 1;
$keys = array_keys($table->data);
$lastrowkey = end($keys);
foreach ($table->data as $key => $row) {
$oddeven = $oddeven ? 0 : 1;
if (!isset($table->rowclass[$key])) {
$table->rowclass[$key] = '';
}
if ($key == $lastrowkey) {
$table->rowclass[$key] .= ' lastrow';
}
$output .= '<tr class="r'.$oddeven.' '.$table->rowclass[$key].'">'."\n";
if ($row == 'hr' and $countcols) {
$output .= '<td colspan="'. $countcols .'"><div class="tabledivider"></div></td>';
} else { // It's a normal row of data.
$keys2 = array_keys($row);
$lastkey = end($keys2);
foreach ($row as $key => $item) {
if (!isset($size[$key])) {
$size[$key] = '';
}
if (!isset($align[$key])) {
$align[$key] = '';
}
if (!isset($wrap[$key])) {
$wrap[$key] = '';
}
if ($key == $lastkey) {
$extraclass = ' lastcol';
} else {
$extraclass = '';
}
if ($key == $isuserid) {
$output .= '<td style="'. $align[$key].$size[$key].$wrap[$key] .'" class="cell c'.$key.$extraclass.'"><input name="userids[]" type="checkbox" value="'.$item.'"></td>';
} else {
$output .= '<td style="'. $align[$key].$size[$key].$wrap[$key] .'" class="cell c'.$key.$extraclass.'">'. $item .'</td>';
}
}
}
$output .= '</tr>'."\n";
}
}
$output .= '</table>'."\n";
$output .= '<input type="hidden" name="courseid" value="'.$COURSE->id.'">';
if ($isuserid != -1) {
$output .= '<input type="submit" value="send emails">';
}
$output .= '</form>';
if ($return) {
return $output;
}
echo $output;
return true;
}
function table_to_excel($filename, $table) {
global $DB, $CFG;
require_once($CFG->dirroot.'/lib/excellib.class.php');
if (!empty($table->head)) {
$countcols = count($table->head);
$keys = array_keys($table->head);
$lastkey = end($keys);
foreach ($table->head as $key => $heading) {
$matrix[0][$key] = str_replace("\n", ' ', htmlspecialchars_decode(strip_tags(nl2br($heading))));
}
}
if (!empty($table->data)) {
foreach ($table->data as $rkey => $row) {
foreach ($row as $key => $item) {
$matrix[$rkey + 1][$key] = str_replace("\n", ' ', htmlspecialchars_decode(strip_tags(nl2br($item))));
}
}
}
$downloadfilename = clean_filename($filename);
// Creating a workbook.
$workbook = new MoodleExcelWorkbook("-");
// Sending HTTP headers.
$workbook->send($downloadfilename);
// Adding the worksheet.
$myxls =& $workbook->add_worksheet($filename);
foreach ($matrix as $ri => $col) {
foreach ($col as $ci => $cv) {
$myxls->write_string($ri, $ci, $cv);
}
}
$workbook->close();
exit;
}
/**
* Returns contexts in deprecated and current modes
*
* @param int $context The context
* @param int $id The context id
* @param int $flags The flags to be used
* @return stdClass An object instance
*/
function cr_get_context($context, $id = null, $flags = null) {
if ($context == CONTEXT_SYSTEM) {
if (class_exists('context_system')) {
return context_system::instance();
} else {
return get_context_instance(CONTEXT_SYSTEM);
}
} else if ($context == CONTEXT_COURSE) {
if (class_exists('context_course')) {
return context_course::instance($id, $flags);
} else {
return get_context_instance($context, $id, $flags);
}
} else if ($context == CONTEXT_COURSECAT) {
if (class_exists('context_coursecat')) {
return context_coursecat::instance($id, $flags);
} else {
return get_context_instance($context, $id, $flags);
}
} else if ($context == CONTEXT_BLOCK) {
if (class_exists('context_block')) {
return context_block::instance($id, $flags);
} else {
return get_context_instance($context, $id, $flags);
}
} else if ($context == CONTEXT_MODULE) {
if (class_exists('context_module')) {
return get_context_instance::instance($id, $flags);
} else {
return get_context_instance($context, $id, $flags);
}
} else if ($context == CONTEXT_USER) {
if (class_exists('context_user')) {
return context_user::instance($id, $flags);
} else {
return get_context_instance($context, $id, $flags);
}
}
return get_context_instance($context, $id, $flags);
}
function cr_make_categories_list(&$list, &$parents, $requiredcapability = '', $excludeid = 0, $category = null, $path = '') {
global $CFG, $DB;
// For categories list use just this one function.
if (empty($list)) {
$list = array();
}
if (class_exists('core_course_category')) {
$list += core_course_category::make_categories_list($requiredcapability, $excludeid);
} else {
require_once($CFG->libdir. '/coursecatlib.php');
$list += coursecat::make_categories_list($requiredcapability, $excludeid);
}
// Building the list of all parents of all categories in the system is highly undesirable and hardly ever needed.
// Usually user needs only parents for one particular category, in which case should be used:
// coursecat::get($categoryid)->get_parents().
if (empty($parents)) {
$parents = array();
}
$all = $DB->get_records_sql('SELECT id, parent FROM {course_categories} ORDER BY sortorder');
foreach ($all as $record) {
if ($record->parent) {
$parents[$record->id] = array_merge($parents[$record->parent], array($record->parent));
} else {
$parents[$record->id] = array();
}
}
}
function cr_import_xml($xml, $course) {
global $CFG, $DB, $USER;
require_once($CFG->dirroot.'/lib/xmlize.php');
$data = xmlize($xml, 1, 'UTF-8');
if (isset($data['report']['@']['version'])) {
$newreport = new stdclass;
foreach ($data['report']['#'] as $key => $val) {
if ($key == 'components') {
$val[0]['#'] = base64_decode(trim($val[0]['#']));
// Fix url_encode " and ' when importing SQL queries.
$tempcomponents = cr_unserialize($val[0]['#']);
if (array_key_exists('customsql', $tempcomponents)) {
$tempcomponents['customsql']['config']->querysql = str_replace("\'", "'", $tempcomponents['customsql']['config']->querysql);
$tempcomponents['customsql']['config']->querysql = str_replace('\"', '"', $tempcomponents['customsql']['config']->querysql);
}
$val[0]['#'] = cr_serialize($tempcomponents);
}
$newreport->{$key} = trim($val[0]['#']);
}
$newreport->courseid = $course->id;
$newreport->ownerid = $USER->id;
$newreport->name .= " (" . userdate(time()) . ")";
if (!$DB->insert_record('block_configurable_reports', $newreport)) {
return false;
}
return true;
}
return false;
}
// For avoid warnings in versions minor than 2.7.
function cr_add_to_log($courseid, $module, $action, $url='', $info='', $cm=0, $user=0) {
global $CFG;
if ($CFG->version < 2014051200) {
add_to_log($courseid, $module, $action, $url, $info, $cm, $user);
}
}
function cr_logging_info() {
global $DB, $CFG;
static $uselegacyreader;
static $useinternalreader;
static $logtable;
if (isset($uselegacyreader) && isset($useinternalreader) && isset($logtable)) {
return array($uselegacyreader, $useinternalreader, $logtable);
}
$uselegacyreader = false; // Flag to determine if we should use the legacy reader.
$useinternalreader = false; // Flag to determine if we should use the internal reader.
$logtable = '';
// Pre 2.7.
if ($CFG->version < 2014051200) {
$uselegacyreader = true;
$logtable = 'log';
} else {
// Get list of readers.
$logmanager = get_log_manager();
$readers = $logmanager->get_readers();
// Get preferred reader.
if (!empty($readers)) {
foreach ($readers as $readerpluginname => $reader) {
// If legacy reader is preferred reader.
if ($readerpluginname == 'logstore_legacy') {
$uselegacyreader = true;
$logtable = 'log';
}
// If sql_internal_table_reader is preferred reader.
if ($reader instanceof \core\log\sql_internal_table_reader or $reader instanceof \core\log\sql_internal_reader) {
$useinternalreader = true;
$logtable = $reader->get_internal_log_table_name();
}
}
}
}
return array($uselegacyreader, $useinternalreader, $logtable);
}