# HG changeset patch # User Franck Deroche # Date 1174057966 -3600 # Node ID a76a46cbb401a4576a3a756c4b43cc28a6c3b86b # Parent ad12469f4db42f6076413ad7bd0c43522bf77c28 Fix lie a quelques problemes de selections. + Utilisation de parseSelector dans le mode de clonage. + parseReplacement clone maintenant ce qu'on lui passe pour pouvoir l'utiliser plusieurs fois + parseSelector n'affecte plus deux fois $obj['nodes'] diff -r ad12469f4db4 -r a76a46cbb401 class.template.php --- a/class.template.php Fri Mar 16 16:01:10 2007 +0100 +++ b/class.template.php Fri Mar 16 16:12:46 2007 +0100 @@ -12,8 +12,11 @@ $this->xmlXPath = new DOMXPath($this->xmlDocument); } - function apply($selector, $obj) { - $rootSelector = $this->parseSelector($selector); + function apply($selector, $obj, DOMElement $root = null) { + if(!($root instanceof DOMElement)) { + $root = $this->xmlDocument->documentElement; + } + $rootSelector = $this->parseSelector($selector, $root); // Cloning test if(is_array($obj)) { foreach($obj as $array) { @@ -24,7 +27,7 @@ $node->insertBefore($futureNode, $tmp->orig); foreach($array as $sel => $test) { $content = $this->parseReplacement($test); - $localSelector = $this->parseSelector($sel); + $localSelector = $this->parseSelector($sel, $node); if(isset($localSelector->attribute)) $futureNode->setAttribute($localSelector->attribute, $test); else { @@ -36,10 +39,10 @@ } } } - } else - { - $content = $this->parseReplacement($obj); + } + else { foreach($rootSelector->nodes as $node) { + $content = $this->parseReplacement($obj); if(isset($rootSelector->attribute)) { $node->setAttribute($rootSelector->attribute, $obj); } else { @@ -53,9 +56,9 @@ } function getClonedNode($node, $childNodeName) { - $candidates = $node->getElementsByTagName($childNodeName); + $candidates = $this->parseSelector($childNodeName, $node)->nodes; foreach($candidates as $candidate) { - if($candidate->nodeName == $childNodeName && $candidate->getAttributeNS(Template::NS, 'toClone') == 'true') { + if($candidate->getAttributeNS(Template::NS, 'toClone') == 'true') { $tmp = array(); $tmp['orig'] = $candidate; $cnode = $candidate->cloneNode(true); @@ -66,10 +69,7 @@ } } - function parseSelector($selector, DOMElement $root=NULL) { - if(!($root instanceof DOMElement)) { - $root = $this->xmlDocument->documentElement; - } + function parseSelector($selector, DOMElement $root) { $obj = array(); $pos = strpos($selector, '@'); if($pos !== false) { @@ -83,7 +83,6 @@ else { $obj['nodeName'] = $selector; $obj['nodes'] = $root->getElementsByTagName($selector); - $obj['nodes'] = $this->xmlDocument->getElementsByTagName($selector); } return (object)$obj; } @@ -111,9 +110,9 @@ if(is_string($obj)) $retVal = $this->xmlDocument->createTextNode($obj); else if($obj instanceof DOMDocument) - $retVal = $obj->documentElement; + $retVal = $obj->documentElement->clone(true); else if($obj instanceof DOMNode) - $retVal = $obj; + $retVal = $obj->clone(true); return $retVal; }