protected function import($file, $ignore_ids = false) { $reader = new XMLReader(); $reader->open($file, null, 1 << 19); $save_ids = array(); $count = 0; $exec = array('max_execution_time' => 20 * 60, 'memory_limit' => 256 * 1048576); $importer = new I2CE_FormRelationship_Importer(); if (array_key_exists('HTTP_HOST', $_SERVER)) { $importer->setMessageCallback(array($this, 'pushMessage')); } $defaults = array('ignoreids' => $ignore_ids ? '1' : '0', 'nomatching' => '', 'invalid' => ''); $next = false; while ($next || $reader->read()) { $next = false; if ($reader->nodeType != XMLReader::ELEMENT) { continue; } switch ($reader->name) { case 'relationshipCollection': foreach ($defaults as $key => $val) { if (($v = $reader->getAttribute($key)) !== null) { $defaults[$key] = $v; } } while ($reader->read()) { //skip to a relationship sub-element if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'relationship') { break; } } //break; - purposefully do not break as we want to get process any relationship under a relationshipCollection //break; - purposefully do not break as we want to get process any relationship under a relationshipCollection case 'relationship': I2CE::longExecution($exec); $node = $reader->expand(); $doc = new DOMDocument(); $i_node = $doc->importNode($node, true); foreach ($defaults as $k => $v) { $i_node->setAttribute($k, $v); } $new_ids = $importer->loadFromXML($i_node); $save_ids = array_merge($save_ids, $new_ids); if (array_key_exists('HTTP_HOST', $_SERVER) && count($new_ids) > 0) { $this->pushMessage("Imported records with ids:\n" . implode(",", $new_ids)); } $count++; $reader->next(); $next = true; break; default: if (array_key_exists('HTTP_HOST', $_SERVER)) { $this->pushError("Unrecognized data type: " . $reader->name); } break; } } $summary = "Import Summary: (processed {$count} relationships)\n"; foreach ($save_ids as $save_id => $msg) { $summary .= str_replace("\n", "\n - ", $msg) . "\n"; } I2CE::raiseMessage($summary); $this->pushMessage($summary); return true; }