diff --git a/setup/modelfactory.class.inc.php b/setup/modelfactory.class.inc.php index e342029f9..036d08ca0 100644 --- a/setup/modelfactory.class.inc.php +++ b/setup/modelfactory.class.inc.php @@ -1819,14 +1819,77 @@ class MFElement extends DOMElement { throw new Exception("Attempting to modify a non existing node: $oNode->tagName (id: ".$oNode->getAttribute('id').")"); } - if ($oExisting->getAttribute('_alteration') == 'removed') + $sPrevFlag = $oExisting->getAttribute('_alteration'); + if ($sPrevFlag == 'removed') { throw new Exception("Attempting to modify a deleted node: $oNode->tagName (id: ".$oNode->getAttribute('id').""); } $oExisting->ReplaceWith($oNode); if (!$this->IsInDefinition()) { - $oNode->setAttribute('_alteration', 'replaced'); + if ($sPrevFlag == '') + { + $sPrevFlag = 'replaced'; + } + $oNode->setAttribute('_alteration', $sPrevFlag); + } + } + + /** + * Combination of AddChildNode or RedefineChildNode... it depends + * This should become the preferred way of doing things (instead of implementing a test + the call to one of the APIs! + * @param MFElement $oNode The node (including all subnodes) to set + */ + public function SetChildNode(MFElement $oNode, $sSearchId = null) + { + // First: cleanup any flag behind the new node + $oNode->ApplyChanges(); + + $oExisting = $this->FindExistingChildNode($oNode, $sSearchId); + if ($oExisting) + { + $sPrevFlag = $oExisting->getAttribute('_alteration'); + if ($sPrevFlag == 'removed') + { + $sFlag = 'replaced'; + } + else + { + $sFlag = $sPrevFlag; // added, replaced or '' + } + $oExisting->ReplaceWith($oNode); + } + else + { + $this->appendChild($oNode); + $sFlag = 'added'; + } + if (!$this->IsInDefinition()) + { + if ($sFlag == '') + { + $sFlag = 'replaced'; + } + $oNode->setAttribute('_alteration', $sFlag); + } + } + + /** + * Check that the current node is actually a class node, under classes + */ + protected function IsClassNode() + { + if ($this->tagName == 'class') + { + return $this->parentNode->IsClassNode(); + } + elseif ($this->tagName == 'classes') + { + return true; + } + else + { + return false; } } @@ -1837,11 +1900,13 @@ class MFElement extends DOMElement protected function ReplaceWith($oNewNode) { // Move the classes from the old node into the new one - foreach($this->GetNodes('class') as $oChild) + if ($this->IsClassNode()) { - $oNewNode->appendChild($oChild); + foreach($this->GetNodes('class') as $oChild) + { + $oNewNode->appendChild($oChild); + } } - $oParentNode = $this->parentNode; $oParentNode->replaceChild($oNewNode, $this);