MDL-21432 backup - detect array/object on xml_transformer + add contextid to blocks...
authorEloy Lafuente <stronk7@moodle.org>
Sat, 10 Jul 2010 18:18:39 +0000 (18:18 +0000)
committerEloy Lafuente <stronk7@moodle.org>
Sat, 10 Jul 2010 18:18:39 +0000 (18:18 +0000)
backup/moodle2/backup_stepslib.php
backup/moodle2/backup_xml_transformer.class.php

index 79e9e4d..c353699 100644 (file)
@@ -904,7 +904,7 @@ class backup_block_instance_structure_step extends backup_structure_step {
 
         // Define each element separated
 
-        $block = new backup_nested_element('block', array('id', 'version'), array(
+        $block = new backup_nested_element('block', array('id', 'contextid', 'version'), array(
             'blockname', 'showinsubcontexts', 'pagetypepattern', 'subpagepattern',
             'defaultregion', 'defaultweight', 'configdata'));
 
@@ -927,6 +927,7 @@ class backup_block_instance_structure_step extends backup_structure_step {
             }
             $blockrec->configdata = base64_encode(serialize((object)$configdata));
         }
+        $blockrec->contextid = $this->task->get_contextid();
         // Get the version of the block
         $blockrec->version = $DB->get_field('block', 'version', array('name' => $this->task->get_blockname()));
 
index c847b1f..026d003 100644 (file)
@@ -47,6 +47,21 @@ class backup_xml_transformer extends xml_contenttransformer {
 
     public function process($content) {
 
+        // Array or object, debug and try our best recursively, shouldn't happen but...
+        if (is_array($content)) {
+            debugging('Backup XML transformer should process arrays but plain content always', DEBUG_DEVELOPER);
+            foreach($content as $key => $plaincontent) {
+                $content[$key] = $this->process($plaincontent);
+            }
+            return $content;
+        } else if (is_object($content)) {
+            debugging('Backup XML transformer should not process objects but plain content always', DEBUG_DEVELOPER);
+            foreach((array)$content as $key => $plaincontent) {
+                $content[$key] = $this->process($plaincontent);
+            }
+            return (object)$content;
+        }
+
         if (is_null($content)) {  // Some cases we know we can skip complete processing
             return '$@NULL@$';
         } else if ($content === '') {