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/>./*** @package tool_xmldb* @copyright 2008 onwards Tim Hunt* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later*//*** This is a base class for the various actions that interate over all the* tables and check some aspect of their definition.** @package tool_xmldb* @copyright 2008 onwards Tim Hunt* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later*/abstract class XMLDBCheckAction extends XMLDBAction {/*** @var string This string is displayed with a yes/no choice before the report is run.* You must set this to the name of a lang string in xmldb.php before calling init.*/protected $introstr = '';/*** Init method, every subclass will have its own*/function init() {parent::init();// Set own core attributes// Set own custom attributes// Get needed strings$this->loadStrings(array($this->introstr => 'tool_xmldb','ok' => '','wrong' => 'tool_xmldb','table' => 'tool_xmldb','field' => 'tool_xmldb','searchresults' => 'tool_xmldb','completelogbelow' => 'tool_xmldb','yes' => '','no' => '','error' => '','back' => 'tool_xmldb'));}/*** Invoke method, every class will have its own* returns true/false on completion, setting both* errormsg and output as necessary*/function invoke() {parent::invoke();$result = true;// Set own core attributes$this->does_generate = ACTION_GENERATE_HTML;// These are always hereglobal $CFG, $XMLDB, $DB, $OUTPUT;// And we nedd some ddl suff$dbman = $DB->get_manager();// Here we'll acummulate all the wrong fields found$problemsfound = array();// Do the job, setting $result as needed// Get the confirmed to decide what to do$confirmed = optional_param('confirmed', false, PARAM_BOOL);// If not confirmed, show confirmation boxif (!$confirmed) {$o = '<table class="generaltable" border="0" cellpadding="5" cellspacing="0" id="notice">';$o.= ' <tr><td class="generalboxcontent">';$o.= ' <p class="centerpara">' . $this->str[$this->introstr] . '</p>';$o.= ' <table class="boxaligncenter" cellpadding="20"><tr><td>';$o.= ' <div class="singlebutton">';$o.= ' <form action="index.php?action=' . $this->title . '&confirmed=yes&sesskey=' . sesskey() . '" method="post"><fieldset class="invisiblefieldset">';$o.= ' <input type="submit" value="'. $this->str['yes'] .'" /></fieldset></form></div>';$o.= ' </td><td>';$o.= ' <div class="singlebutton">';$o.= ' <form action="index.php?action=main_view" method="post"><fieldset class="invisiblefieldset">';$o.= ' <input type="submit" value="'. $this->str['no'] .'" /></fieldset></form></div>';$o.= ' </td></tr>';$o.= ' </table>';$o.= ' </td></tr>';$o.= '</table>';$this->output = $o;} else {// The back to edit table button$b = ' <p class="centerpara buttons">';$b .= '<a href="index.php">[' . $this->str['back'] . ']</a>';$b .= '</p>';// Iterate over $XMLDB->dbdirs, loading their XML data to memoryif ($XMLDB->dbdirs) {$dbdirs = $XMLDB->dbdirs;$o='<ul>';foreach ($dbdirs as $dbdir) {// Only if the directory existsif (!$dbdir->path_exists) {continue;}// Load the XML file$xmldb_file = new xmldb_file($dbdir->path . '/install.xml');// Only if the file existsif (!$xmldb_file->fileExists()) {continue;}// Load the XML contents to structure$loaded = $xmldb_file->loadXMLStructure();if (!$loaded || !$xmldb_file->isLoaded()) {echo $OUTPUT->notification('Errors found in XMLDB file: '. $dbdir->path . '/install.xml');continue;}// Arriving here, everything is ok, get the XMLDB structure$structure = $xmldb_file->getStructure();$o.=' <li>' . str_replace($CFG->dirroot . '/', '', $dbdir->path . '/install.xml');// Getting tablesif ($xmldb_tables = $structure->getTables()) {$o.=' <ul>';// Foreach table, process its fieldsforeach ($xmldb_tables as $xmldb_table) {// Skip table if not existsif (!$dbman->table_exists($xmldb_table)) {continue;}// Fetch metadata from physical DB. All the columns info.if (!$metacolumns = $DB->get_columns($xmldb_table->getName(), false)) {// / Skip table if no metacolumns is available for itcontinue;}// Table processing starts here$o.=' <li>' . $xmldb_table->getName();// Do the specific check.list($output, $newproblems) = $this->check_table($xmldb_table, $metacolumns);$o.=$output;$problemsfound = array_merge($problemsfound, $newproblems);$o.=' </li>';// Give the script some more time (resetting to current if exists)if ($currenttl = @ini_get('max_execution_time')) {@ini_set('max_execution_time',$currenttl);}}$o.=' </ul>';}$o.=' </li>';}$o.='</ul>';}// Create a report of the problems found.$r = $this->display_results($problemsfound);// Combine the various bits of output.$this->output = $b . $r . $o;}// Launch postaction if exists (leave this here!)if ($this->getPostAction() && $result) {return $this->launch($this->getPostAction());}// Return ok if arrived herereturn $result;}/*** Do the checks necessary on one particular table.** @param xmldb_table $xmldb_table the table definition from the install.xml file.* @param array $metacolumns the column information read from the database.* @return array an array with two elements: First, some additional progress output,* for example a list (<ul>) of the things check each with an one work ok/not ok summary.* Second, an array giving the details of any problems found. These arrays* for all tables will be aggregated, and then passed to*/abstract protected function check_table(xmldb_table $xmldb_table, array $metacolumns);/*** Display a list of the problems found.** @param array $problems_found an aggregation of all the problems found by* all the check_table calls.* @return string a display of all the problems found as HTML.*/abstract protected function display_results(array $problems_found);}