protected function appendRecordInplace(DOMDocument $dom, DOMElement $root, BaseModel $record, SchemaInterface $schema = NULL, $recursive = true) { if (!$schema) { $schema = $record->getSchema(); } $columns = $schema->getColumns(); foreach ($columns as $column) { $columnElement = $dom->createElement($column->name); $columnElement->setAttribute('isa', $column->isa); if ($column->type) { $columnElement->setAttribute('type', $column->type); } if ($column->contentType) { $columnElement->setAttribute('content-type', $column->contentType); } $value = $record->getValue($column->name); $columnElement->appendChild(new DOMText($value)); $root->appendChild($columnElement); } if (!$recursive) { return; } foreach ($schema->getRelations() as $rId => $r) { if ($r['type'] === Relationship::HAS_MANY) { $foreignRecords = $record->get($rId); if (!$foreignRecords || $foreignRecords->size() === 0) { continue; } $relationElement = $dom->createElement($rId); $root->appendChild($relationElement); $relationElement->setAttribute('type', 'has-many'); $collectionElement = $dom->createElement('collection'); $relationElement->appendChild($collectionElement); foreach ($foreignRecords as $foreignRecord) { $this->appendRecord($dom, $collectionElement, $foreignRecord, NULL, false); } } elseif ($r['type'] === Relationship::HAS_ONE) { $foreignRecord = $record->get($rId); if (!$foreignRecord) { continue; } $relationElement = $dom->createElement($rId); $root->appendChild($relationElement); $relationElement->setAttribute('type', 'has-one'); $this->appendRecord($dom, $relationElement, $foreignRecord, NULL, false); } elseif ($r['type'] === Relationship::MANY_TO_MANY) { $foreignRecords = $record->get($rId); if (!$foreignRecords || $foreignRecords->size() === 0) { continue; } // $relationElement = $dom->createElement($rId); // $relationElement->setAttribute('type', 'many-to-many'); // $root->ownerDocument->firstChild->appendChild($relationElement); // $relationElement->appendChild($collectionElement); $collectionElement = $dom->createElement('collection'); $refNode = $root->ownerDocument->firstChild->insertBefore($collectionElement, $root->ownerDocument->firstChild->firstChild); foreach ($foreignRecords as $foreignRecord) { $this->appendRecord($dom, $collectionElement, $foreignRecord, NULL, false); } } } }