MDL-20068 new Page module, includes migrate from old mod/resource; remaining issues...
[moodle.git] / mod / page / db / upgradelib.php
1 <?php
3 // This file is part of Moodle - http://moodle.org/
4 //
5 // Moodle is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
9 //
10 // Moodle is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
18 /**
19  * Folder module upgrade related helper functions
20  *
21  * @package   mod-page
22  * @copyright 2009 Petr Skoda (http://skodak.org)
23  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24  */
26 /**
27  * Migrate page module data from 1.9 resource_old table to new page table
28  * @return void
29  */
30 function page_20_migrate() {
31     global $CFG, $DB;
32     require_once("$CFG->libdir/filelib.php");
33     require_once("$CFG->libdir/resourcelib.php");
34     require_once("$CFG->dirroot/course/lib.php");
36     if (!file_exists("$CFG->dirroot/mod/resource/db/upgradelib.php")) {
37         // bad luck, somebody deleted resource module
38         return;
39     }
41     require_once("$CFG->dirroot/mod/resource/db/upgradelib.php");
43     // create resource_old table and copy resource table there if needed
44     if (!resource_20_prepare_migration()) {
45         // no modules or fresh install
46         return;
47     }
49     $fs = get_file_storage();
51     if ($candidates = $DB->get_recordset('resource_old', array('type'=>'html', 'migrated'=>0))) {
52         foreach ($candidates as $candidate) {
53             page_20_migrate_candidate($candidate, $fs, FORMAT_HTML);
54         }
55         $candidates->close();
56     }
58     if ($candidates = $DB->get_recordset('resource_old', array('type'=>'text', 'migrated'=>0))) {
59         foreach ($candidates as $candidate) {
60             page_20_migrate_candidate($candidate, $fs, $candidate->reference);
61         }
62         $candidates->close();
63     }
65     // clear all course modinfo caches
66     rebuild_course_cache(0, true);
68 }
70 function page_20_migrate_candidate($candidate, $fs, $format) {
71     global $CFG, $DB;
72     upgrade_set_timeout();
74     $page = new object();
75     $page->course        = $candidate->course;
76     $page->name          = $candidate->name;
77     $page->intro         = $candidate->intro;
78     $page->introformat   = $candidate->introformat;
79     $page->content       = $candidate->alltext;
80     $page->contentformat = $format;
81     $page->revision      = 1;
82     $page->timemodified  = time();
84     // convert links to old course files - let the automigration do the actual job
85     $usedfiles = array("$CFG->wwwroot/file.php/$page->course/", "$CFG->wwwroot/file.php?file=/$page->course/");
86     $page->content = str_ireplace($usedfiles, '@@PLUGINFILE@@/', $page->content);
87     if (strpos($page->content, '@@PLUGINFILE@@/') === false) {
88         $page->legacyfiles = RESOURCELIB_LEGACYFILES_NO;
89     } else {
90         $page->legacyfiles = RESOURCELIB_LEGACYFILES_ACTIVE;
91     }
93     $options = array('printheading'=>0, 'printintro'=>0);
94     if ($candidate->popup) {
95         $page->display = RESOURCELIB_DISPLAY_POPUP;
96         if ($candidate->popup) {
97             $rawoptions = explode(',', $candidate->popup);
98             foreach ($rawoptions as $rawoption) {
99                 list($name, $value) = explode('=', trim($rawoption), 2);
100                 if ($value > 0 and ($name == 'width' or $name == 'height')) {
101                     $options['popup'.$name] = $value;
102                     continue;
103                 }
104             }
105         }
106     } else {
107         $page->display = RESOURCELIB_DISPLAY_OPEN;
108     }
109     $page->displayoptions = serialize($options);
111     $page = resource_migrate_to_module('page', $candidate, $page);
113     // now try to migrate files from site files
114     // noite: this can not work for html pages or files with other relatively linked files :-(
115     $siteid = get_site()->id;
116     if (preg_match_all("|$CFG->wwwroot/file.php(\?file=)?/$siteid(/[^\s'\"&\?#]+)|", $page->content, $matches)) {
117         $context     = get_context_instance(CONTEXT_MODULE, $candidate->cmid);
118         $sitecontext = get_context_instance(CONTEXT_COURSE, $siteid);
119         $file_record = array('contextid'=>$context->id, 'filearea'=>'page_content', 'itemid'=>0);
120         $fs = get_file_storage();
121         foreach ($matches[2] as $i=>$sitefile) {
122             if (!$file = $fs->get_file_by_hash(sha1($sitecontext->id.'course_content0'.$sitefile))) {
123                 continue;
124             }
125             try {
126                 $fs->create_file_from_storedfile($file_record, $file);
127                 $page->content = str_replace($matches[0][$i], '@@PLUGINFILE@@'.$sitefile, $page->content);
128             } catch (Exception $x) {
129             }
130         }
131         $DB->update_record('page', $page);
132     }