/** * Renders each declared sum as HTML * */ function dashboard_render_numsums(&$theBlock, &$aggr) { global $OUTPUT; $str = ''; $str .= $OUTPUT->box_start('dashboard-sumative-box', '', true); foreach (array_keys($theBlock->numsumsf) as $numsum) { if (!empty($theBlock->numsumsf[$numsum])) { $formattedsum = dashboard_format_data($theBlock->numsumsf[$numsum], @$aggr->{$numsum}); } else { $formattedsum = 0 + @$aggr->{$numsum}; } $str .= $theBlock->outputnumsums[$numsum] . ' : <b>' . $formattedsum . '</b> '; } $str .= $OUTPUT->box_end(true); return $str; }
/** * provides ability to defer cache update to croned delayed period */ function cron() { global $CFG, $DB; mtrace('Dashboard cron...'); if (!empty($CFG->block_dashboard_cron_enabled)) { $block = $DB->get_record('block', array('name' => 'dashboard')); if ($alldashboards = $DB->get_records('block_instances', array('blockid' => $block->id))) { foreach ($alldashboards as $dsh) { $config = unserialize(base64_decode($dsh->configdata)); if (empty($config->cronmode) or @$config->cronmode == 'norefresh') { continue; } if (!@$config->uselocalcaching) { continue; } $needscron = false; if ($config->cronmode == 'global') { $chour = 0 + @$CFG->block_dashboard_cron_hour; $cmin = 0 + @$CFG->block_dashboard_cron_min; $cfreq = @$CFG->block_dashboard_cron_freq; } else { $chour = 0 + @$config->cronhour; $cmin = 0 + @$config->cronmin; $cfreq = @$config->cronfrequency; } $now = time(); $nowdt = getdate($now); $lastdate = getdate(0 + @$config->lastcron); $crondebug = optional_param('crondebug', false, PARAM_BOOL); // first check we did nt already refreshed it today (or a new year is starting) if ($nowdt['yday'] > $lastdate['yday'] || $nowdt['yday'] == 0 || $crondebug) { // we wait the programmed time is passed, and check we are an allowed day to run and no query is already running if ($cfreq == 'daily' || $nowdt['wday'] == $cfreq) { if ($nowdt['hours'] >= $chour && $nowdt['minutes'] > $cmin && !@$config->isrunning || $crondebug) { $config->isrunning = true; $config->lastcron = $now; $DB->set_field('block_instances', 'configdata', base64_encode(serialize($config)), array('id' => $dsh->id)); // Save config // process data caching $dshobj = new block_dashboard(); $dshobj->config = $config; $limit = ''; $offset = ''; // TODO : compute correct values for $limit and $offset $sql = str_replace('<%%FILTERS%%>', '', $config->query); mtrace(' ... refreshing for instance ' . $dsh->id); $results = $dshobj->fetch_dashboard_data($sql, $limit, $offset, true, true); if (empty($results)) { mtrace('Empty result on query : ' . $sql); } // generate output file if required if (!empty($config->makefile) && !empty($results)) { if (!empty($config->filepathadminoverride)) { // an admin has configured, can be anywhere in moodledata $outputfile = $CFG->dataroot . '/' . $config->filepathadminoverride . '/' . $config->filelocation; } else { // needs being in course files $outputfile = $CFG->dataroot . '/' . $dsh->pageid . '/' . $config->filelocation; } if (!isset($CFG->block_dashboard_output_field_separator)) { $CFG->block_dashboard_output_field_separator = ';'; } if (!isset($CFG->block_dashboard_output_line_separator)) { $CFG->block_dashboard_output_line_separator = 'LF'; } $FIELDSEPARATORS = array(':' => ':', ";" => ";", "TAB" => "\t"); $LINESEPARATORS = array('LF' => "\n", 'CR' => "\r", "CRLF" => "\n\r"); // output from query if (!empty($config->fileoutput)) { $outputfields = explode(';', $config->fileoutput); $outputformats = explode(';', $config->fileoutputformats); } else { $outputfields = explode(';', $config->outputfields); $outputformats = explode(';', $config->outputformats); } dashboard_normalize($outputfields, $outputformats); // normalizes labels to keys $this->outputf = array_combine($outputfields, $outputformats); mtrace(' ... generating file for instance ' . $dsh->id . ' in format ' . $config->fileformat); if (!empty($this->outputf)) { $FILE = fopen($outputfile, 'wb'); if ($config->fileformat == 'CSV') { // print col names $rarr = array(); foreach ($this->outputf as $key => $format) { $rarr[] = $key; } fputs($FILE, implode($FIELDSEPARATORS[$CFG->block_dashboard_output_field_separator], $rarr)); fputs($FILE, $LINESEPARATORS[$CFG->block_dashboard_output_line_separator]); } if ($config->fileformat == 'CSV' || $config->fileformat == 'CSVWH') { // print effective records $reccount = 0; foreach ($results as $result) { $rarr = array(); foreach ($this->outputf as $key => $format) { if (empty($format)) { $rarr[] = @$result->{$key}; } else { $rarr[] = dashboard_format_data($format, @$result->{$key}); } } fputs($FILE, implode($FIELDSEPARATORS[$CFG->block_dashboard_output_field_separator], $rarr)); fputs($FILE, $LINESEPARATORS[$CFG->block_dashboard_output_line_separator]); $reccount++; } mtrace($reccount . ' processed'); } if ($config->fileformat == 'SQL') { if (empty($config->filesqlouttable)) { mtrace('SQL required for output but no SQL table name given'); continue; } $colnames = array(); foreach ($this->outputf as $key => $format) { $colnames[] = $key; } foreach ($results as $result) { $values = array(); foreach ($this->outputf as $key => $format) { if (empty($format)) { $format = 'TEXT'; } $values[] = dashboard_format_data($format, str_replace("'", "''", $result->{$key})); } $valuegroup = implode(",", $values); $colgroup = implode(",", $colnames); $statement = "INSERT INTO {$config->filesqlouttable}({$colgroup}) VALUES ({$valuegroup});\n"; fputs($FILE, $statement); } } fclose($FILE); } } $config->isrunning = false; $DB->set_field('block_instances', 'configdata', base64_encode(serialize($config)), array('id' => $dsh->id)); // Save config } else { mtrace(' waiting for valid time for instance ' . $dsh->id); } } else { mtrace(' waiting for valid day for instance ' . $dsh->id); } } else { mtrace(' waiting for next unprocessed day for instance ' . $dsh->id); } } } else { mtrace('no instances to process...'); } } else { mtrace('dashboard cron disabled.'); } return true; }
if (!in_array($hkeyvalue, $hcols)) { $hcols[] = $hkeyvalue; } // now put the cell value in it $outvalues = array(); foreach ($outputfields as $field) { // did we ask for cumulative results ? $cumulativeix = null; if (preg_match('/S\\((.+?)\\)/', $field, $matches)) { $field = $matches[1]; $cumulativeix = $theBlock->instance->id . '_' . $field; } if (!empty($outputf[$field])) { $datum = dashboard_format_data($outputf[$field], $r->{$field}, $cumulativeix); } else { $datum = dashboard_format_data(null, @$r->{$field}, $cumulativeix); } /* // no colour possible that way in excel if (!empty($theBlock->config->colorfield) && $theBlock->config->colorfield == $field){ $datum = dashboard_colour_code($theBlock, $datum, $colorcoding); } */ $outvalues[] = str_replace('"', '\\"', $datum); } $matrixst .= ' = "' . implode(' ', $outvalues) . '"'; // make the matrix in memory eval($matrixst . ";"); } print_cross_table_csv($theBlock, $m, $hcols, $horizkey, $vertkeys, $hlabel, true); echo $CFG->dashboard_csv_line_separator;