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/>.namespace tool_brickfield\local\tool;use tool_brickfield\manager;/*** Class printable.** @package tool_brickfield* @copyright 2020 onward: Brickfield Education Labs, www.brickfield.ie* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later*/class printable extends tool {/*** Provide a name for this tool, suitable for display on pages.* @return mixed|string* @throws \coding_exception*/public static function toolname(): string {return get_string('printable:toolname', 'tool_brickfield');}/*** Provide a short name for this tool, suitable for menus and selectors.* @return mixed|string* @throws \coding_exception*/public static function toolshortname(): string {return get_string('printable:toolshortname', 'tool_brickfield');}/*** Provide a lowercase name identifying this plugin. Should really be the same as the directory name.* @return string*/public function pluginname(): string {return 'printable';}/*** Return the data for renderer / template display.* @return \stdClass* @throws \coding_exception* @throws \dml_exception*/protected function fetch_data(): \stdClass {global $DB;$filter = $this->get_filter();if (!$filter->has_course_filters()) {return (object)['valid' => false,'error' => get_string('error:nocoursespecified', 'tool_brickfield'),];} else if (!$filter->validate_filters()) {return (object)['valid' => false,'error' => $filter->get_errormessage(),];}$data = (object)['valid' => true,'error' => '',];$config = get_config(manager::PLUGINNAME);$perpage = isset($config->perpagefix) ? $config->perpagefix : $config->perpage;list($wheresql, $params) = $filter->get_course_sql();$combo = [];$sqlcombo = 'SELECT distinct '.$DB->sql_concat_join("''", ['area.component', 'area.contextid']).' as tmpid,sum(res.errorcount)FROM {' . manager::DB_AREAS . '} areaINNER JOIN {' . manager::DB_CONTENT . '} ch ON ch.areaid = area.id AND ch.iscurrent = 1INNER JOIN {' . manager::DB_RESULTS . '} res ON res.contentid = ch.idWHERE 1=1 ' . $wheresql . 'group by area.component, area.contextid';$combodata = $DB->get_records_sql_menu($sqlcombo, $params);$combo['total'] = count($combodata);$combo['failed'] = 0;foreach ($combodata as $count) {if ($count != 0) {$combo['failed']++;}}$combo['passed'] = ($combo['total'] - $combo['failed']);$data->combodata = $combo;$sql = 'SELECT che.checkgroup, SUM(res.errorcount) as errorinstancesFROM {' . manager::DB_AREAS . '} areaINNER JOIN {' . manager::DB_CONTENT . '} ch ON ch.areaid = area.id AND ch.iscurrent = 1INNER JOIN {' . manager::DB_RESULTS . '} res ON res.contentid = ch.idINNER JOIN {' . manager::DB_CHECKS . '} che ON che.id = res.checkidWHERE 1=1 ' . $wheresql . ' GROUP BY che.checkgroupORDER BY che.checkgroup';$groupdata = $DB->get_records_sql($sql, $params);$data->groupdata = $groupdata;// Adding check displaynames from language strings.$wheresql = ' and area.courseid = ?';$params = [$filter->courseid];$sql4 = 'SELECT area.component, sum(res.errorcount) as errorsumFROM {' . manager::DB_AREAS . '} areaINNER JOIN {' . manager::DB_CONTENT . '} ch ON ch.areaid = area.id AND ch.iscurrent = 1INNER JOIN {' . manager::DB_RESULTS . '} res ON res.contentid = ch.idWHERE 1=1 ' . $wheresql . ' GROUP BY area.componentORDER BY errorsum DESC';$toptargetdataraw = $DB->get_records_sql($sql4, $params, 0, 5);$toptargetdata = [];foreach ($toptargetdataraw as $top) {$top->component = tool::get_module_label($top->component);if ($top->errorsum != 0) {$toptargetdata[] = $top;}}$data->toptargetdata = $toptargetdata;$sql3 = 'SELECT che.shortname, sum(res.errorcount) as checkcountFROM {' . manager::DB_AREAS . '} areaINNER JOIN {' . manager::DB_CONTENT . '} ch ON ch.areaid = area.id AND ch.iscurrent = 1INNER JOIN {' . manager::DB_RESULTS . '} res ON res.contentid = ch.idINNER JOIN {' . manager::DB_CHECKS . '} che ON che.id = res.checkidWHERE 1=1 ' . $wheresql . ' AND res.errorcount >= ? GROUP BY che.shortnameORDER BY checkcount DESC';$params[] = 1;$checkcountdata = $DB->get_records_sql($sql3, $params, 0, 5);foreach ($checkcountdata as $key => &$cdata) {$cdata->checkname = self::get_check_description($key);}$data->checkcountdata = $checkcountdata;$sqltar = 'SELECT distinct '.$DB->sql_concat_join("''", ['area.component', 'area.contextid']).' as tmpid,component, SUM(errorcount) as errorsumFROM {' . manager::DB_AREAS . '} areaINNER JOIN {' . manager::DB_CONTENT . '} ch ON ch.areaid = area.id AND ch.iscurrent = 1INNER JOIN {' . manager::DB_RESULTS . '} res ON res.contentid = ch.idWHERE 1=1 '.$wheresql.'GROUP BY area.component, area.contextid';$targetdata = $DB->get_records_sql($sqltar, $params);$tarlabels = [];$combotar = [];foreach ($targetdata as $tar) {if (!array_key_exists($tar->component, $combotar)) {$combotar[$tar->component] = [];$combotar[$tar->component]['total'] = 0;$combotar[$tar->component]['failed'] = 0;$tarlabels[$tar->component] = tool::get_module_label($tar->component);}$combotar[$tar->component]['total']++;if ($tar->errorsum > 0) {$combotar[$tar->component]['failed']++;}}ksort($combotar);$data->combotardata = $combotar;$data->tarlabels = $tarlabels;$errorsql = 'SELECT err.id as errid, res.id as resid, area.component, area.itemid, area.cmid,che.shortname, err.linenumber as errline, err.htmlcodeFROM {' . manager::DB_AREAS . '} areaINNER JOIN {' . manager::DB_CONTENT . '} ch ON ch.areaid = area.id AND ch.iscurrent = 1INNER JOIN {' . manager::DB_RESULTS . '} res ON res.contentid = ch.idINNER JOIN {' . manager::DB_CHECKS . '} che ON che.id = res.checkidINNER JOIN {' . manager::DB_ERRORS . '} err ON res.id = err.resultid WHERE 1=1 ' . $wheresql;$errordata = $DB->get_records_sql($errorsql, $params, 0, $perpage);foreach ($errordata as $err) {$err->shortname = self::get_check_description($err->shortname);// Truncating HTML with base64 image data, to avoid page overstretching.$base64detected = parent::base64_img_detected($err->htmlcode);if ($base64detected) {$err->htmlcode = parent::truncate_base64($err->htmlcode);}}$data->errordata = $errordata;$data->errordetailscount = $perpage;if ($filter->categoryid != 0) {$data->countdata = count($filter->courseids);} else {$countsql = 'select count(distinct courseid) from {' . manager::DB_AREAS . '}';$countdata = $DB->count_records_sql($countsql, []);$data->countdata = $countdata;}return $data;}/*** Get the HTML output for display.* @return mixed*/public function get_output() {global $PAGE;$data = $this->get_data();$filter = $this->get_filter();$renderer = $PAGE->get_renderer('tool_brickfield', 'printable');if ($filter->target == 'pdf') {$renderer->pdf_renderer($data, $filter);return '';} else if ($filter->target == 'html') {$output = $renderer->header();return $output . $renderer->display($data, $filter);} else {return $renderer->display($data, $filter);}}}