$pages = array();
$pages[] = page_create_object(PAGE_COURSE_VIEW, $preferences->backup_course);
- // Let's see if we have to backup blocks from modules
- $modulerecords = get_records_sql('SELECT name, id FROM '.$CFG->prefix.'modules');
+ if (!empty($CFG->showblocksonmodpages)) {
+ // get course structure
+ $course = get_record('course', 'id', $preferences->backup_course);
+ $modinfo =& get_fast_modinfo($course);
- foreach($preferences->mods as $module) {
- if(!$module->backup) {
- continue;
- }
+ foreach($preferences->mods as $module) {
+ if (!$module->backup) {
+ continue;
+ }
- $cmods = get_records_select('course_modules', 'course = '.$preferences->backup_course.' AND module = '.$modulerecords[$module->name]->id);
- if(empty($cmods)) {
- continue;
- }
+ if (empty($modinfo->instances[$module->name])) {
+ continue;
+ }
- $pagetypes = page_import_types('mod/'.$module->name.'/');
- if(empty($pagetypes)) {
- continue;
- }
+ $pagetypes = page_import_types('mod/'.$module->name.'/');
+ if (empty($pagetypes)) {
+ continue;
+ }
- foreach($pagetypes as $pagetype) {
- foreach($cmods as $cmod) {
- $pages[] = page_create_object($pagetype, $cmod->instance);
+ foreach($pagetypes as $pagetype) {
+ foreach($modinfo->instances[$module->name] as $cm) {
+ if (!empty($module->instances[$cm->instance]->backup)) {
+ $pages[] = page_create_object($pagetype, $cm->instance);
+ }
+ }
}
}
}
//Blocks open tag
fwrite ($bf,start_tag('BLOCKS',2,true));
- while($page = array_pop($pages)) {
+ foreach($pages as $page) {
if ($instances = blocks_get_by_page($page)) {
//Iterate over every block
foreach ($instances as $position) {
if(empty($blocks[$instance->blockid]->name)) {
continue;
}
-
- if (!$blockobj = block_instance($blocks[$instance->blockid]->name, $instance)) {
+ $blockname = $blocks[$instance->blockid]->name;
+
+ if (!$blockobj = block_instance($blockname, $instance)) {
// Invalid block
continue;
- }
-
- //Give the block a chance to process any links in configdata.
- if (!isset($blocks[$instance->blockid]->blockobject)) {
- $blocks[$instance->blockid]->blockobject = block_instance($blocks[$instance->blockid]->name);
}
- $config = unserialize(base64_decode($instance->configdata));
- $blocks[$instance->blockid]->blockobject->backup_encode_absolute_links_in_config($config);
- $instance->configdata = base64_encode(serialize($config));
+
+ // encode absolute links in block config
+ $instance->configdata = $blockobj->get_backup_encoded_config();
//Begin Block
fwrite ($bf,start_tag('BLOCK',3,true));
fwrite ($bf,full_tag('ID', 4, false,$instance->id));
- fwrite ($bf,full_tag('NAME',4,false,$blocks[$instance->blockid]->name));
+ fwrite ($bf,full_tag('NAME',4,false,$blockname));
fwrite ($bf,full_tag('PAGEID',4,false,$instance->pageid));
fwrite ($bf,full_tag('PAGETYPE',4,false,$instance->pagetype));
fwrite ($bf,full_tag('POSITION',4,false,$instance->position));
fwrite ($bf,full_tag('WEIGHT',4,false,$instance->weight));
fwrite ($bf,full_tag('VISIBLE',4,false,$instance->visible));
- fwrite ($bf,full_tag('CONFIGDATA',4,false,$instance->configdata));
- // Write instance data if needed+
- if ($blockobj->backuprestore_enabled()) {
+ fwrite ($bf,full_tag('CONFIGDATA',4,false,$instance->configdata));
+ // Write instance data if needed
+ if ($blockobj->backuprestore_instancedata_used()) {
fwrite ($bf,start_tag('INSTANCEDATA',4,true));
$status = $blockobj->instance_backup($bf, $preferences);
fwrite ($bf,end_tag('INSTANCEDATA',4,true));
JOIN {$CFG->prefix}grade_items gi
ON (gi.iteminstance = gc.id)
WHERE gc.courseid = $preferences->backup_course
- AND (gi.itemtype='course' OR gi.itemtype='category')
+ AND (gi.itemtype='course' OR gi.itemtype='category')
ORDER BY gi.sortorder ASC");
if ($grade_categories) {
}
}
+ // For each block, call its encode_content_links method.
+ // This encodes forexample links to blocks/something/viewphp?id=666
+ // that are stored in other activities.
+ static $blockobjects = null;
+ if (!isset($blockobjects)) {
+ $blockobjects = array();
+ if ($blocks = get_records('block', 'visible', 1)) {
+ foreach ($blocks as $block) {
+ if ($blockobject = block_instance($block->name)) {
+ $blockobjects[] = $blockobject;
+ }
+ }
+ }
+ }
+
+ foreach ($blockobjects as $blockobject) {
+ $result = $blockobject->encode_content_links($result,$mypreferences);
+ }
+
if ($result != $content) {
debugging('<br /><hr />'.s($content).'<br />changed to<br />'.s($result).'<hr /><br />');
}
return $this->content;
}
- function backup_encode_absolute_links_in_config(&$config) {
- $config->text = backup_encode_absolute_links($config->text);
+ /**
+ * Will be called before an instance of this block is backed up, so that any links in
+ * any links in any HTML fields on config can be encoded.
+ * @return string
+ */
+ function get_backup_encoded_config() {
+ $data = clone($this->config);
+ $data->text = backup_encode_absolute_links($data->text);
+ return base64_encode(serialize($data));
}
- function restore_decode_absolute_links_in_config(&$config) {
- $oldtext = $config->text;
- $config->text = restore_decode_absolute_links($oldtext);
- return $config->text != $oldtext;
+ /**
+ * This function makes all the necessary calls to {@link restore_decode_content_links_worker()}
+ * function in order to decode contents of this block from the backup
+ * format to destination site/course in order to mantain inter-activities
+ * working in the backup/restore process.
+ *
+ * This is called from {@link restore_decode_content_links()} function in the restore process.
+ *
+ * NOTE: There is no block instance when this method is called.
+ *
+ * @param object $restore Standard restore object
+ * @return boolean
+ **/
+ function decode_content_links_caller($restore) {
+ global $CFG;
+
+ if ($restored_blocks = get_records_select("backup_ids","table_name = 'block_instance' AND backup_code = $restore->backup_unique_code AND new_id > 0", "", "new_id")) {
+ $restored_blocks = implode(',', array_keys($restored_blocks));
+ $sql = "SELECT bi.*
+ FROM {$CFG->prefix}block_instance bi
+ JOIN {$CFG->prefix}block b ON b.id = bi.blockid
+ WHERE b.name = 'html' AND bi.id IN ($restored_blocks)";
+
+ if ($instances = get_records_sql($sql)) {
+ foreach ($instances as $instance) {
+ $blockobject = block_instance('html', $instance);
+ $blockobject->config->text = restore_decode_absolute_links($blockobject->config->text);
+ $blockobject->config->text = restore_decode_content_links_worker($blockobject->config->text, $restore);
+ $blockobject->instance_config_commit($blockobject->pinned);
+ }
+ }
+ }
+
+ return true;
}
}
?>
}
/**
- * Enable the block for backup and restore.
+ * Enable custom instance data section in backup and restore.
*
* If return true, then {@link instance_backup()} and
* {@link instance_restore()} will be called during
*
* @return boolean
**/
- function backuprestore_enabled() {
+ function backuprestore_instancedata_used() {
return false;
}
/**
* Will be called before an instance of this block is backed up, so that any links in
- * any links in any HTML fields on config can be encoded. For example, for the HTML block
- * we need to do $config->text = backup_encode_absolute_links($config->text);.
- *
- * @param object $config the config field for an insance of this class.
+ * in config can be encoded. For example config->text, for the HTML block
+ * @return string
*/
- function backup_encode_absolute_links_in_config(&$config) {
+ function get_backup_encoded_config() {
+ return base64_encode(serialize($this->config));
}
/**
- * Undo the effect of backup_encode_absolute_links_in_config. For exmaple, in the
- * HTML block we need to do $config->text = restore_decode_absolute_links($config->text);
+ * Return the content encoded to support interactivities linking. This function is
+ * called automatically from the backup procedure by {@link backup_encode_absolute_links()}.
*
- * @param object $config the config field for an insance of this class.
- * @return boolean return true if something has changed, so the database can be updated,
- * false if not, for efficiency reasons.
- */
- function restore_decode_absolute_links_in_config(&$config) {
- return false;
+ * NOTE: There is no block instance when this method is called.
+ *
+ * @param string $content Content to be encoded
+ * @param object $restore Restore preferences object
+ * @return string The encoded content
+ **/
+ function encode_content_links($content, $restore) {
+ return $content;
+ }
+
+ /**
+ * This function makes all the necessary calls to {@link restore_decode_content_links_worker()}
+ * function in order to decode contents of this block from the backup
+ * format to destination site/course in order to mantain inter-activities
+ * working in the backup/restore process.
+ *
+ * This is called from {@link restore_decode_content_links()} function in the restore process.
+ *
+ * NOTE: There is no block instance when this method is called.
+ *
+ * @param object $restore Standard restore object
+ * @return boolean
+ **/
+ function decode_content_links_caller($restore) {
+ return true;
+ }
+
+ /**
+ * Return content decoded to support interactivities linking.
+ * This is called automatically from
+ * {@link restore_decode_content_links_worker()} function
+ * in the restore process.
+ *
+ * NOTE: There is no block instance when this method is called.
+ *
+ * @param string $content Content to be dencoded
+ * @param object $restore Restore preferences object
+ * @return string The dencoded content
+ **/
+ function decode_content_links($content, $restore) {
+ return $content;
}
/**