diff --git a/setup/modelfactory.class.inc.php b/setup/modelfactory.class.inc.php index 567af4752..b3d798fbc 100644 --- a/setup/modelfactory.class.inc.php +++ b/setup/modelfactory.class.inc.php @@ -1233,6 +1233,43 @@ class MFElement extends DOMElement return $res; } + public function SetNodeAsArrayOfItems($aList) + { + $oNewNode = $this->ownerDocument->CreateElement($this->tagName); + if ($this->getAttribute('id') != '') + { + $oNewNode->setAttribute('id', $this->getAttribute('id')); + } + self::AddItemToNode($this->ownerDocument, $oNewNode, $aList); + $this->parentNode->RedefineChildNode($oNewNode); + } + + protected static function AddItemToNode($oXmlDoc, $oXMLNode, $itemValue) + { + if (is_array($itemValue)) + { + $oXmlItems = $oXmlDoc->CreateElement('items'); + $oXMLNode->AppendChild($oXmlItems); + + foreach($itemValue as $key => $item) + { + $oXmlItem = $oXmlDoc->CreateElement('item'); + $oXmlItems->AppendChild($oXmlItem); + + if (is_string($key)) + { + $oXmlItem->SetAttribute('key', $key); + } + self::AddItemToNode($oXmlDoc, $oXmlItem, $item); + } + } + else + { + $oXmlText = $oXmlDoc->CreateTextNode((string) $itemValue); + $oXMLNode->AppendChild($oXmlText); + } + } + /** * Helper to remove child nodes */ @@ -1263,7 +1300,7 @@ class MFElement extends DOMElement * @param MFElement $oRefNode The node to search for * @param bool $sSearchId substitutes to the value of the 'id' attribute */ - public static function FindNode(DOMNode $oParent, MFElement $oRefNode, $sSearchId = null) + public static function FindNodeSlow(DOMNode $oParent, MFElement $oRefNode, $sSearchId = null) { $oRes = null; if ($oRefNode->hasAttribute('id')) @@ -1300,6 +1337,49 @@ class MFElement extends DOMElement return $oRes; } + /** + * Seems to work fine (and is about 10 times faster than above) EXCEPT for menus !!!! + * @param unknown_type $oParent + * @param unknown_type $oRefNode + * @param unknown_type $sSearchId + * @throws Exception + */ + public static function FindNode(DOMNode $oParent, MFElement $oRefNode, $sSearchId = null) + { + $oRes = null; + if ($oParent instanceof DOMDocument) + { + $oDoc = $oParent->firstChild->ownerDocument; + $oRoot = $oParent; + } + else + { + $oDoc = $oParent->ownerDocument; + $oRoot = $oParent; + } + + $oXPath = new DOMXPath($oDoc); + if ($oRefNode->hasAttribute('id')) + { + // Find the first element having the same tag name and id + if (!$sSearchId) + { + $sSearchId = $oRefNode->getAttribute('id'); + } + $sXPath = './'.$oRefNode->tagName."[@id='$sSearchId']"; + + $oRes = $oXPath->query($sXPath, $oRoot)->item(0); + } + else + { + // Get the first one having the same tag name (ignore others) + $sXPath = './'.$oRefNode->tagName; + + $oRes = $oXPath->query($sXPath, $oRoot)->item(0); + } + return $oRes; + } + public function ListActiveChildNodes($sTagName) { $sXPath = $sTagName."[not(@_alteration) or @_alteration!='removed']";