Mercurial > defr > templates
comparison class.template.php @ 6:f80e9010e64d
Fix du clonage (removeAttributeNS et pas removeAttribute), refactoring
| author | Franck Deroche <webmaster@defr.org> |
|---|---|
| date | Sun, 21 Oct 2007 13:21:57 +0200 |
| parents | a76a46cbb401 |
| children | 61dee7e34a9d |
comparison
equal
deleted
inserted
replaced
| 5:888b9807b2b3 | 6:f80e9010e64d |
|---|---|
| 3 private $xmlDocument; | 3 private $xmlDocument; |
| 4 private $xmlXPath; | 4 private $xmlXPath; |
| 5 | 5 |
| 6 const NS = 'http://defr.net/2007/template'; | 6 const NS = 'http://defr.net/2007/template'; |
| 7 | 7 |
| 8 function __construct($fileName) { | 8 function __construct($fileName, $shouldValidate = false) { |
| 9 $this->xmlDocument = new DOMDocument(); | 9 $this->xmlDocument = new DOMDocument(); |
| 10 $this->xmlDocument->validateOnParse = true; | 10 $this->xmlDocument->validateOnParse = $shouldValidate; |
| 11 $this->xmlDocument->loadXML(file_get_contents($fileName)); | 11 $this->xmlDocument->loadXML(file_get_contents($fileName)); |
| 12 $this->xmlXPath = new DOMXPath($this->xmlDocument); | 12 $this->xmlXPath = new DOMXPath($this->xmlDocument); |
| 13 } | 13 } |
| 14 | 14 |
| 15 function apply($selector, $obj, DOMElement $root = null) { | 15 function apply($selector, $obj, DOMElement $root = null) { |
| 16 if(!($root instanceof DOMElement)) { | 16 if(!($root instanceof DOMElement)) |
| 17 $root = $this->xmlDocument->documentElement; | 17 $root = $this->xmlDocument->documentElement; |
| 18 } | |
| 19 $rootSelector = $this->parseSelector($selector, $root); | 18 $rootSelector = $this->parseSelector($selector, $root); |
| 20 // Cloning test | 19 if(is_array($obj)) |
| 21 if(is_array($obj)) { | 20 $this->applyClone($rootSelector, $obj, $root); |
| 22 foreach($obj as $array) { | |
| 23 foreach($rootSelector->nodes as $node) { | |
| 24 $nodeName = key($array); | |
| 25 $tmp = $this->getClonedNode($node, $nodeName); | |
| 26 $futureNode = $tmp->clone; | |
| 27 $node->insertBefore($futureNode, $tmp->orig); | |
| 28 foreach($array as $sel => $test) { | |
| 29 $content = $this->parseReplacement($test); | |
| 30 $localSelector = $this->parseSelector($sel, $node); | |
| 31 if(isset($localSelector->attribute)) | |
| 32 $futureNode->setAttribute($localSelector->attribute, $test); | |
| 33 else { | |
| 34 if($futureNode->namespaceURI == Template::NS) | |
| 35 $this->replaceNode($futureNode, $content); | |
| 36 else | |
| 37 $this->setNodeContent($futureNode, $content); | |
| 38 } | |
| 39 } | |
| 40 } | |
| 41 } | |
| 42 } | |
| 43 else { | 21 else { |
| 44 foreach($rootSelector->nodes as $node) { | 22 foreach($rootSelector->nodes as $node) { |
| 45 $content = $this->parseReplacement($obj); | 23 $content = $this->parseReplacement($obj); |
| 46 if(isset($rootSelector->attribute)) { | 24 if(isset($rootSelector->attribute)) { |
| 47 $node->setAttribute($rootSelector->attribute, $obj); | 25 $node->setAttribute($rootSelector->attribute, $obj); |
| 52 $this->setNodeContent($node, $content); | 30 $this->setNodeContent($node, $content); |
| 53 } | 31 } |
| 54 } | 32 } |
| 55 } | 33 } |
| 56 } | 34 } |
| 35 | |
| 36 function applyClone($rootSelector, $obj, $root) { | |
| 37 foreach($obj as $array) { | |
| 38 $nodeName = key($array); | |
| 39 foreach($rootSelector->nodes as $node) { | |
| 40 $tmp = $this->getClonedNode($node, $nodeName); | |
| 41 $futureNode = $tmp->clone; | |
| 42 $futureNode = $node->insertBefore($futureNode, $tmp->orig); | |
| 43 foreach($array as $sel => $test) { | |
| 44 $locSelector = $this->parseSelector($sel, $node); | |
| 45 if(isset($localSelector->attribute)) | |
| 46 $futureNode->setAttribute($locSelector->attribute, $test); | |
| 47 else { | |
| 48 $content = $this->parseReplacement($test); | |
| 49 $node->insertBefore($content, $tmp->orig); | |
| 50 if($futureNode->namespaceURI == Template::NS) | |
| 51 $this->replaceNode($futureNode, $content); | |
| 52 else | |
| 53 $this->setNodeContent($futureNode, $content); | |
| 54 } | |
| 55 } | |
| 56 } | |
| 57 } | |
| 58 } | |
| 57 | 59 |
| 58 function getClonedNode($node, $childNodeName) { | 60 function getClonedNode($node, $childNodeName) { |
| 59 $candidates = $this->parseSelector($childNodeName, $node)->nodes; | 61 $candidates = $this->parseSelector($childNodeName, $node)->nodes; |
| 60 foreach($candidates as $candidate) { | 62 foreach($candidates as $candidate) { |
| 61 if($candidate->getAttributeNS(Template::NS, 'toClone') == 'true') { | 63 if($candidate->getAttributeNS(Template::NS, 'toClone') == 'true') { |
| 62 $tmp = array(); | 64 $tmp = array(); |
| 63 $tmp['orig'] = $candidate; | 65 $tmp['orig'] = $candidate; |
| 64 $cnode = $candidate->cloneNode(true); | 66 $cnode = $candidate->cloneNode(true); |
| 65 $cnode->removeAttribute('toClone'); | 67 $cnode->removeAttributeNS(Template::NS, 'toClone'); |
| 66 $tmp['clone'] = $cnode; | 68 $tmp['clone'] = $cnode; |
| 67 return (object)$tmp; | 69 return (object)$tmp; |
| 68 } | 70 } |
| 69 } | 71 } |
| 70 } | 72 } |
