AutorÃa | Ultima modificación | Ver Log |
<?php
// This file is part of Moodle - https://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 <https://www.gnu.org/licenses/>.
/**
* List all the files needing reconcile because the definitions don't match the XML contents.
*
* @package tool_xmldb
* @copyright 2022 onwards Eloy Lafuente (stronk7) {@link https://stronk7.com}
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class reconcile_files extends XMLDBAction {
/**
* Init method, every subclass will have its own
*/
public function init() {
parent::init();
// Set own custom attributes.
$this->sesskey_protected = false; // This action doesn't need sesskey protection.
// Get needed strings.
$this->loadStrings([
'backtomainview' => 'tool_xmldb',
'reconcile_files_intro' => 'tool_xmldb',
'reconcile_files_no' => 'tool_xmldb',
'reconcile_files_yes' => 'tool_xmldb',
'searchresults' => 'tool_xmldb',
]);
}
/**
* Invoke method, every class will have its own
* returns true/false on completion, setting both
* errormsg and output as necessary
*/
public function invoke() {
parent::invoke();
$result = true;
// Set own core attributes.
$this->does_generate = ACTION_GENERATE_HTML;
// These are always here.
global $CFG, $XMLDB;
// Do the job, setting $result as needed.
// Add link back to home.
$b = ' <p class="centerpara">';
$b .= ' <a href="index.php?action=main_view#lastused">[' . $this->str['backtomainview'] . ']</a>';
$b .= '</p>';
$this->output .= $b;
$c = '<p class="centerpara">';
$c .= $this->str['reconcile_files_intro'];
$c .= '</p>';
$this->output .= $c;
// Get the list of DB directories.
$result = $this->launch('get_db_directories');
if ($result && !empty($XMLDB->dbdirs)) {
$needfix = [];
foreach ($XMLDB->dbdirs as $key => $dbdir) {
// Verify it exists.
if (!file_exists($key . '/install.xml') && !is_readable($key . '/install.xml')) {
continue;
}
// Read the raw contents of the file.
$rawcontents = file_get_contents($key . '/install.xml');
// Load the XMLDB file and its structure.
$xmldb = new xmldb_file($key . '/install.xml');
$xmldb->loadXMLStructure();
// Generate the XML contents from the loaded structure.
$xmlcontents = $xmldb->getStructure()->xmlOutput();
if ($rawcontents != $xmlcontents) {
$relpath = str_replace($CFG->dirroot . '/', '', $key) . '/install.xml';
$needfix[] = $relpath;
// Left here on purpose, as a quick way to fix problems. To be
// enabled and run by developers only, uncomment the next line:
// file_put_contents($key . '/install.xml', $xmlcontents);
// (this script won't ever do that officially).
}
}
}
$r = '<h3 class="main">' . $this->str['searchresults'] . '</h3>';
if ($needfix) {
$r .= '<h4 class="main">' . $this->str['reconcile_files_yes'] . count($needfix) . '</h4>';
$r .= '<ul><li>' . implode('</li><li>', $needfix) . '</li></ul>';
} else {
$r .= '<h4 class="main">' . $this->str['reconcile_files_no'] . '</h4>';
}
// Set the output.
$this->output .= $r;
// Launch postaction if exists (leave this unmodified).
if ($this->getPostAction() && $result) {
return $this->launch($this->getPostAction());
}
return $result;
}
}