/** * Page formats restore routine * * @param object $restore Restore object * @param array $data This is the xmlized information underneath FORMATDATA in the backup XML file. **/ function learning_restore_format_data($restore, $data) { global $CFG; require_once $CFG->dirroot . '/course/format/page/lib.php'; $status = true; if (isset($restore->preferences['nopages'])) { // request not to proceed with course format restore return $status; } // Get the backup data if (!empty($data['FORMATDATA']['#']['PAGES']['0']['#']['PAGE'])) { $newpageids = array(); // Get all the pages and restore them, restoring page items along the way. $pages = $data['FORMATDATA']['#']['PAGES']['0']['#']['PAGE']; for ($i = 0; $i < count($pages); $i++) { $pageinfo = $pages[$i]; $page = new stdClass(); $page->courseid = $restore->course_id; $page->nameone = backup_todb($pageinfo['#']['NAMEONE']['0']['#']); $page->nametwo = backup_todb($pageinfo['#']['NAMETWO']['0']['#']); $page->display = backup_todb($pageinfo['#']['DISPLAY']['0']['#']); $page->prefleftwidth = backup_todb($pageinfo['#']['PREFLEFTWIDTH']['0']['#']); $page->prefcenterwidth = backup_todb($pageinfo['#']['PREFCENTERWIDTH']['0']['#']); $page->prefrightwidth = backup_todb($pageinfo['#']['PREFRIGHTWIDTH']['0']['#']); $page->parent = backup_todb($pageinfo['#']['PARENT']['0']['#']); // will remap later when we know all ids are present $page->sortorder = backup_todb($pageinfo['#']['SORTORDER']['0']['#']); $page->template = backup_todb($pageinfo['#']['TEMPLATE']['0']['#']); $page->showbuttons = backup_todb($pageinfo['#']['SHOWBUTTONS']['0']['#']); $oldid = backup_todb($pageinfo['#']['ID']['0']['#']); if ($newid = insert_record('format_page', $page)) { $newpageids[$oldid] = $newid; backup_putid($restore->backup_unique_code, 'format_page', $oldid, $newid); // Now restore the page_items if (isset($pageinfo['#']['ITEMS'])) { $items = $pageinfo['#']['ITEMS']['0']['#']['ITEM']; for ($j = 0; $j < count($items); $j++) { $iteminfo = $items[$j]; $item = new stdClass(); $item->pageid = $newid; $item->cmid = backup_todb($iteminfo['#']['CMID']['0']['#']); if (!empty($item->cmid)) { // Try to remap the cm ID $cmid = backup_getid($restore->backup_unique_code, 'course_modules', $item->cmid); if ($cmid) { $item->cmid = $cmid->new_id; } else { // Failed to remap - could be for various valid reasons - skip this item continue; } } $item->blockinstance = $iteminfo['#']['BLOCKINSTANCE']['0']['#']; // we'll remap blockids when we decode contentlinks $item->position = backup_todb($iteminfo['#']['POSITION']['0']['#']); $item->sortorder = backup_todb($iteminfo['#']['SORTORDER']['0']['#']); $item->visible = backup_todb($iteminfo['#']['VISIBLE']['0']['#']); $itemoldid = backup_todb($pageinfo['#']['ID']['0']['#']); if ($itemnewid = insert_record('format_page_items', $item)) { backup_putid($restore->backup_unique_code, 'format_page_items', $itemoldid, $itemnewid); } else { $status = false; break; } } } } else { $status = false; break; } } // Need to remap parentids foreach ($newpageids as $oldid => $newid) { $parent = get_field('format_page', 'parent', 'id', $newid); if (!empty($parent)) { set_field('format_page', 'parent', $newpageids[$parent], 'id', $newid); } } // Need to fix sortorder for old courses - doesn't do much of anything if sortorder is already OK $status = $status and page_fix_page_sortorder($restore->course_id); $status = $status and page_fix_pageitem_sortorder($restore->course_id); // Helps to repair sortorder if an item fails } return $status; }
/** * Format Upgrade Path * * @version $Id: upgrade.php,v 1.1 2009/12/21 01:00:29 michaelpenne Exp $ * @package format_page **/ function xmldb_format_page_upgrade($oldversion = 0) { global $CFG, $db; include_once $CFG->dirroot . '/course/format/page/lib.php'; $result = true; if ($result && $oldversion < 2007041202) { /// Define field id to be added to block_course_menu $table = new XMLDBTable('format_page'); /// Add field showbuttons $field = new XMLDBField('showbuttons'); $field->setAttributes(XMLDB_TYPE_INTEGER, '4', XMLDB_UNSIGNED, null, null, null, null, 0, 'template'); $result = $result && add_field($table, $field); } if ($result && $oldversion < 2007042500) { // update showbuttons settings to allow for indedependent bitwise previous & next if (defined('BUTTON_BOTH')) { $result = set_field('format_page', 'showbuttons', BUTTON_BOTH, 'showbuttons', 1); } else { $result = false; notify('BUTTON_BOTH constant not set', 'notifyfailure'); } } if ($result && $oldversion < 2007042503) { /// Define index index (not unique) to be added to format_page $table = new XMLDBTable('format_page'); $index = new XMLDBIndex('parentpageindex'); $index->setAttributes(XMLDB_INDEX_NOTUNIQUE, array('parent')); if (!index_exists($table, $index)) { $result = $result && add_index($table, $index); } $index = new XMLDBIndex('sortorderpageindex'); $index->setAttributes(XMLDB_INDEX_NOTUNIQUE, array('sortorder')); if (!index_exists($table, $index)) { $result = $result && add_index($table, $index); } // now add indexes for format_page_items tables $table = new XMLDBTable('format_page_items'); $index = new XMLDBIndex('format_page_items_sortorder_index'); $index->setAttributes(XMLDB_INDEX_NOTUNIQUE, array('sortorder')); if (!index_exists($table, $index)) { $result = $result && add_index($table, $index); } $index = new XMLDBIndex('format_page_items_pageid_index'); $index->setAttributes(XMLDB_INDEX_NOTUNIQUE, array('pageid')); if (!index_exists($table, $index)) { $result = $result && add_index($table, $index); } } if ($result && $oldversion < 2007071800) { $validcourses = get_records_menu('course', '', '', '', 'id, shortname'); if (!empty($validcourses)) { $keys = array_keys($validcourses); $invalidpages = get_records_select_menu('format_page', 'courseid NOT IN(' . implode(', ', $keys) . ')', '', 'id, nameone'); if (!empty($invalidpages)) { $pagekeys = array_keys($invalidpages); delete_records_select('format_page_items', 'pageid IN (' . implode(', ', $pagekeys) . ')'); delete_records_select('format_page', 'id IN (' . implode(', ', $pagekeys) . ')'); } } else { delete_records('format_page'); delete_records('format_page_items'); } } if ($result && $oldversion < 2007071801) { /// Define field width to be dropped from format_page_items $table = new XMLDBTable('format_page_items'); $field = new XMLDBField('width'); /// Launch drop field width $result = $result && drop_field($table, $field); } if ($result && $oldversion < 2007071802) { /// Changing logic for sortorder field to more closely resemble block weight // This could be huge, do not output everything $olddebug = $db->debug; $db->debug = false; // Setup some values $result = true; $i = 0; if ($rs = get_recordset('format_page', '1', '1', '', 'id')) { if ($rs->RecordCount() > 0) { echo 'Processing page item sortorder field....'; while ($page = rs_fetch_next_record($rs)) { if ($pageitems = get_records('format_page_items', 'pageid', $page->id, 'sortorder', 'id, position')) { // Organize by position $organized = array('l' => array(), 'c' => array(), 'r' => array()); foreach ($pageitems as $pageitem) { $organized[$pageitem->position][] = $pageitem->id; } // Now - reset sortorder value foreach ($organized as $position => $pageitemids) { $sortorder = 0; foreach ($pageitemids as $pageitemid) { $result = $result and set_field('format_page_items', 'sortorder', $sortorder, 'id', $pageitemid); $sortorder++; } } } if ($i % 50 == 0) { echo '.'; flush(); } $i++; } if ($result) { notify('SUCCESSFULLY fixed page item sort order field', 'notifysuccess'); } else { notify('FAILED! An error occured during upgrade'); } } rs_close($rs); } // Restore $db->debug = $olddebug; } if ($result && $oldversion < 2007071803) { // This could be huge, do not output everything $olddebug = $db->debug; $db->debug = false; $result = true; // Make sure all block weights are set properly (before this was never really managed properly) if ($courses = get_records('course', 'format', 'page', '', 'id')) { echo 'Fixing block weights in courses with format = \'page\'....'; $i = 0; foreach ($courses as $course) { page_fix_block_weights($course->id); if ($i % 5 == 0) { echo '.'; flush(); } $i++; } } // Restore $db->debug = $olddebug; } if ($result && $oldversion < 2007071804) { /// Changing the default of field sortorder on table format_page_items to 0 $table = new XMLDBTable('format_page_items'); $field = new XMLDBField('sortorder'); $field->setAttributes(XMLDB_TYPE_INTEGER, '4', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null, null, '0', 'position'); /// Launch change of default for field sortorder $result = $result && change_field_default($table, $field); } if ($result && $oldversion < 2007071805) { // This could be huge, do not output everything $olddebug = $db->debug; $db->debug = false; $result = true; // Make sure all page sortorder values are set properly (before this was never really managed properly) if ($courses = get_records('course', 'format', 'page', '', 'id')) { echo 'Fixing page sort orders in courses with format = \'page\'....'; $i = 0; foreach ($courses as $course) { page_fix_page_sortorder($course->id); if ($i % 5 == 0) { echo '.'; flush(); } $i++; } } // Restore $db->debug = $olddebug; } if ($result && $oldversion < 2007071806) { // Remove old setting if (record_exists('config', 'name', 'pageformatusedefault')) { unset_config('pageformatusedefault'); } } if ($result && $oldversion < 2007071807) { $site = get_site(); if ($site->format == 'page') { $result = ($result and set_field('course', 'format', 'site', 'id', $site->id)); $result = ($result and set_config('pageformatonfrontpage', 1)); } } if ($result && $oldversion < 2008082100) { $site = get_site(); if ($CFG->pageformatonfrontpage == 1) { // Turns out having this set is very important - EG: backup/restore $result = set_field('course', 'format', 'page', 'id', $site->id); } } if ($result && $oldversion < 2008121000) { /// Define field locks to be added to format_page $table = new XMLDBTable('format_page'); $field = new XMLDBField('locks'); $field->setAttributes(XMLDB_TYPE_TEXT, 'medium', null, null, null, null, null, null, 'showbuttons'); /// Launch add field locks $result = $result && add_field($table, $field); } if ($result && $oldversion < 2009060200) { //MR-263 column widths to strings to allow for px, % and em etc. $table = new XMLDBTable('format_page'); $field = new XMLDBField('prefleftwidth'); $field->setType(XMLDB_TYPE_CHAR); $result = $result && change_field_type($table, $field); $field = new XMLDBField('prefcenterwidth'); $field->setType(XMLDB_TYPE_CHAR); $result = $result && change_field_type($table, $field); $field = new XMLDBField('prefrightwidth'); $field->setType(XMLDB_TYPE_CHAR); $result = $result && change_field_type($table, $field); // XMLDB_TYPE_CHAR isn't the same as varchar??? //$alter = "ALTER TABLE {$CFG->prefix}format_page CHANGE prefleftwidth prefleftwidth varchar(8)"; } return $result; }