ILIAS  release_5-1 Revision 5.0.0-5477-g43f3e3fab5f
class.ilNestedSetXML.php
Go to the documentation of this file.
1<?php
2/*
3 +-----------------------------------------------------------------------------+
4 | ILIAS open source |
5 +-----------------------------------------------------------------------------+
6 | Copyright (c) 1998-2001 ILIAS open source, University of Cologne |
7 | |
8 | This program is free software; you can redistribute it and/or |
9 | modify it under the terms of the GNU General Public License |
10 | as published by the Free Software Foundation; either version 2 |
11 | of the License, or (at your option) any later version. |
12 | |
13 | This program is distributed in the hope that it will be useful, |
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16 | GNU General Public License for more details. |
17 | |
18 | You should have received a copy of the GNU General Public License |
19 | along with this program; if not, write to the Free Software |
20 | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
21 +-----------------------------------------------------------------------------+
22*/
23
24
37{
38 // {{{ Vars
39
43 var $db;
44
48 var $LEFT = 0;
49 var $RIGHT = 0;
50
55 var $DEPTH = 0;
56
61
66
71
75 var $lastTag = "";
76
82 var $ilias;
83
89 var $dom;
90
91 // }}}
92
98 function ilNestedSetXML()
99 {
100 global $ilias,$ilDB;
101
102 $this->ilias =& $ilias;
103
104 $this->db =& $ilDB;
105 $this->LEFT = 0;
106 $this->RIGHT = 0;
107 $this->DEPTH = 0;
108
109 $this->param_modifier = "";
110 }
111
112
123 function startElement($parser, $name, $attrs)
124 {
125 // {{{
126 global $ilDB;
127
128 $this->lastTag = $name;
129 $this->LEFT += 1;
130 $this->RIGHT = $this->LEFT + 1;
131 $this->DEPTH++;
132
136 $this->db->query("INSERT INTO xmltags ( tag_name,tag_depth ) VALUES (".$ilDB->quote($name).",".$ilDB->quote($this->DEPTH).") ");
137 // $pk = mysql_insert_id();
138 $r = $this->db->query("SELECT LAST_INSERT_ID()");
139 $row = $r->fetchRow();
140
141 $pk = $row[0];
142
143 $Q = "UPDATE NestedSetTemp SET ns_r=ns_r+2 WHERE ns_r >= ".$ilDB->quote($this->LEFT)." AND ns_book_fk = ".$ilDB->quote($this->obj_id)." ";
144 $this->db->query($Q);
145
146 $Q = "INSERT INTO NestedSetTemp (ns_book_fk,ns_type,ns_tag_fk,ns_l,ns_r) VALUES (".$ilDB->quote($this->obj_id).",".$ilDB->quote($this->obj_type).",".$ilDB->quote($pk).",".$ilDB->quote($this->LEFT).",".$ilDB->quote($this->RIGHT).") ";
147 $this->db->query($Q);
148
149 $this->clean($attrs);
150 if (is_array($attrs) && count($attrs)>0)
151 {
152 reset ($attrs);
153 while (list ($key, $val) = each ($attrs))
154 {
155 $this->db->query("INSERT INTO xmlparam ( tag_fk,param_name,param_value ) VALUES (".$ilDB->quote($pk).",".$ilDB->quote($key).",".$ilDB->quote($val).") ");
156 }
157 }
158
159 return($pk);
160 // }}}
161 }
162
171 function characterData($parser, $data)
172 {
173 // {{{
174 global $ilDB;
175
181 static $value_pk;
182
183 // we don't need this trim since expression like ' ABC < > ' will be parsed to ' ABC <>'
184 if(1 or trim($data)!="") {
185
186
187 if ($this->lastTag == "TAGVALUE")
188 {
189 $Q = "UPDATE xmlvalue SET tag_value = concat(tag_value,".$ilDB->quote($data).") WHERE tag_value_pk = ".$ilDB->quote($value_pk)." ";
190 $this->db->query($Q);
191 }
192 else
193 {
194 $tag_pk = $this->startElement($this->xml_parser,"TAGVALUE",array());
195 $this->endElement($this->xml_parser,"TAGVALUE");
196
197 $Q = "INSERT INTO xmlvalue (tag_fk,tag_value) VALUES (".$ilDB->quote($tag_pk).",".$ilDB->quote($data).") ";
198 $this->db->query($Q);
199
200 $Q = "SELECT LAST_INSERT_ID()";
201 $r = $this->db->query($Q);
202 $row = $r->fetchRow();
203 $value_pk = $row[0];
204
205 $this->lastTag = "TAGVALUE";
206 }
207
208 }
209 // }}}
210 }
211
219 function endElement($parser, $name)
220 {
221 // {{{
222 $this->DEPTH--;
223 $this->LEFT += 1;
224 $this->lastTag = "";
225 // }}}
226 }
227
236 function import($xmldata, $obj_id, $obj_type)
237 {
238 // {{{
242 $this->db->query("DROP TABLE IF EXISTS NestedSetTemp");
243
247 $Q = "CREATE TEMPORARY TABLE NestedSetTemp (
248 ns_book_fk int(11) NOT NULL,
249 ns_type char(50) NOT NULL,
250 ns_tag_fk int(11) NOT NULL,
251 ns_l int(11) NOT NULL,
252 ns_r int(11) NOT NULL,
253 KEY ns_tag_fk (ns_tag_fk),
254 KEY ns_l (ns_l),
255 KEY ns_r (ns_r),
256 KEY ns_book_fk (ns_book_fk)
257 ) TYPE=MyISAM ";
258 $this->db->query($Q);
259
260 $this->obj_id = $obj_id;
261 $this->obj_type = $obj_type;
262 $this->DEPTH = 0;
263 $this->LEFT = 0;
264 $this->RIGHT = 0;
265
266 $this->db->query("DELETE FROM NestedSetTemp");
267
272 $this->xml_parser = xml_parser_create("UTF-8");
273 xml_parser_set_option($this->xml_parser, XML_OPTION_CASE_FOLDING, false);
274 xml_set_object($this->xml_parser,$this);
275 xml_set_element_handler($this->xml_parser, "startElement", "endElement");
276 xml_set_character_data_handler($this->xml_parser, "characterData");
277
278 if (!xml_parse($this->xml_parser, $xmldata)) {
279 die(sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($this->xml_parser)),xml_get_current_line_number($this->xml_parser)));
280 }
281 xml_parser_free($this->xml_parser);
282
286 $this->deleteAllDbData();
287
288 $this->db->query("INSERT INTO xmlnestedset SELECT * FROM NestedSetTemp");
289 $this->db->query("DROP TABLE IF EXISTS NestedSetTemp");
290 // }}}
291 }
292
298 function setParameterModifier(&$a_object, $a_method)
299 {
300 $this->param_modifier =& $a_object;
301 $this->param_modifier_method = $a_method;
302 }
303
315 function export($obj_id, $type)
316 {
317 // {{{
318 global $ilDB;
319
320 $query = "SELECT * FROM xmlnestedset,xmltags WHERE ns_tag_fk = tag_pk AND ns_book_fk = ".$ilDB->quote($obj_id)." AND ns_type = ".$ilDB->quote($type)." ORDER BY ns_l";
321 $result = $this->db->query($query);
322 if (DB::isError($result))
323 {
324 die($this->className."::checkTable(): ".$result->getMessage().":<br>".$query);
325 }
326
327 $xml = "";
328 $lastDepth = -1;
329
330 while (is_array($row = $result->fetchRow(DB_FETCHMODE_ASSOC) ) )
331 {
332
333 // {{{ tags
334 $Anfang = "<".$row[tag_name];
335 $query = "SELECT * FROM xmlparam WHERE tag_fk = ".$ilDB->quote($row[tag_pk])." ";
336 $result_param = $this->db->query($query);
337 while (is_array($row_param = $result_param->fetchRow(DB_FETCHMODE_ASSOC) ) )
338 {
339 $param_value = $row_param[param_value];
340 if (is_object($this->param_modifier))
341 {
342 $obj =& $this->param_modifier;
343 $method = $this->param_modifier_method;
344 $param_value = $obj->$method($row[tag_name], $row_param[param_name], $param_value);
345 }
346 $Anfang .= " ".$row_param[param_name]."=\"".$param_value."\"";
347 }
348
349 $Anfang .= ">";
350 $Ende = "</".$row[tag_name].">";
351 // }}}
352
353 // {{{ TagValue
354 if ($row[tag_name]=="TAGVALUE")
355 {
356 $query = "SELECT * FROM xmlvalue WHERE tag_fk = ".$ilDB->quote($row[tag_pk])." ";
357 $result_value = $this->db->query($query);
358 $row_value = $result_value->fetchRow(DB_FETCHMODE_ASSOC);
359 $Anfang = $row_value["tag_value"];
360 $Ende = "";
361
362 $Anfang = htmlspecialchars($Anfang);
363 // $Anfang = utf8_encode($Anfang);
364 }
365 // }}}
366
367 $D = $row[tag_depth];
368
369 if ($D==$lastDepth)
370 {
371 $xml .= $xmlE[$D];
372 $xml .= $Anfang;
373 $xmlE[$D] = $Ende;
374 }
375 else if ($D>$lastDepth)
376 {
377 $xml .= $Anfang;
378 $xmlE[$D] = $Ende;
379 }
380 else
381 {
382 for ($i=$lastDepth;$i>=$D;$i--)
383 {
384 $xml .= $xmlE[$i];
385 }
386 $xml .= $Anfang;
387 $xmlE[$D] = $Ende;
388 }
389
390 $lastDepth = $D;
391
392 }
393
394 for ($i=$lastDepth;$i>0;$i--)
395 {
396 $xml .= $xmlE[$i];
397 }
398
399 return($xml);
400 // }}}
401 }
402
411 {
412 global $ilDB;
413
414 // {{{
415 $this->db->setLimit(1);
416 $query = "SELECT * FROM xmlnestedset,xmltags WHERE ns_book_fk = ".$ilDB->quote($obj_id)." AND ns_type =".
417 $ilDB->quote($obj_type)." AND ns_tag_fk=tag_pk ORDER BY ns_l";
418 $result = $this->db->query($query);
419 $row = $result->fetchRow(DB_FETCHMODE_ASSOC);
420
421 $this->LEFT = $row["ns_l"];
422 $this->RIGHT = $row["ns_r"];
423 $this->DEPTH = $row["tag_depth"];
424 $this->obj_id = $obj_id;
425 $this->obj_type = $obj_type;
426 // }}}
427 }
428
436 function getTagName()
437 {
438 global $ilDB;
439
440 $this->db->setLimit(1);
441 $query = "SELECT * FROM xmlnestedset,xmltags WHERE ns_book_fk = ".$ilDB->quote($this->obj_id)." AND ns_type = ".$ilDB->quote($this->obj_type)." AND ns_l = ".$ilDB->quote($this->LEFT)." AND ns_r = ".$ilDB->quote($this->RIGHT)." AND ns_tag_fk = tag_pk";
442 $result = $this->db->query($query);
443 $row = $result->fetchRow(DB_FETCHMODE_ASSOC);
444
445 return($row["tag_name"]);
446
447 }
448
458 function setTagName($tagName)
459 {
460 global $ilDB;
461
462 $this->db->setLimit(1);
463 $query = "SELECT * FROM xmlnestedset WHERE ns_book_fk = ".$ilDB->quote($this->obj_id)." AND ns_type = ".$ilDB->quote($this->obj_type)." AND ns_l = ".$ilDB->quote($this->LEFT)." AND ns_r = ".$ilDB->quote($this->RIGHT);
464 $result = $this->db->query($query);
465 $row = $result->fetchRow(DB_FETCHMODE_ASSOC);
466
467 $query = "UPDATE xmltags SET tag_name= ".$ilDB->quote($tagName)." WHERE tag_pk = ".$ilDB->quote($row["ns_tag_fk"]);
468 $this->db->query($query);
469
470 return($row["tagName"]);
471
472 }
473
474
481 function getTagValue()
482 {
483 global $ilDB;
484
485 $V = array();
486
487 $query = "SELECT * FROM xmlnestedset,xmltags WHERE ns_tag_fk = tag_pk AND ns_book_fk = ".$ilDB->quote($this->obj_id)." AND ns_type = ".$ilDB->quote($this->obj_type)." AND ns_l >= ".$ilDB->quote($this->LEFT)." AND ns_r <= ".$ilDB->quote($this->RIGHT)." AND tag_depth = ".$ilDB->quote(($this->DEPTH+1))." ORDER BY ns_l";
488 $result = $this->db->query($query);
489 while (is_array($row = $result->fetchRow(DB_FETCHMODE_ASSOC) ) )
490 {
491 if ($row[tag_name]=="TAGVALUE")
492 {
493 $query = "SELECT * FROM xmlvalue WHERE tag_fk = ".$ilDB->quote($row[tag_pk])." ";
494 $result2 = $this->db->query($query);
495 $row2 = $result2->fetchRow(DB_FETCHMODE_ASSOC);
496 $V[] = $row2[tag_value];
497 }
498 else
499 {
500 $xml = new ilNestedSetXml();
501
502 $xml->LEFT = $row["ns_l"];
503 $xml->RIGHT = $row["ns_r"];
504 $xml->DEPTH = $row["tag_depth"];
505 $xml->obj_id = $obj_id;
506 $xml->obj_type = $obj_type;
507
508 $V[] = $xml;
509
510 }
511 }
512
513 return($V);
514 }
515
522 function setTagValue($value)
523 {
524 global $ilDB;
525
526 $V = array();
527
528 $query = "SELECT * FROM xmlnestedset,xmltags
529 LEFT JOIN xmlvalue ON xmltags.tag_pk=xmlvalue.tag_fk
530 WHERE ns_tag_fk = tag_pk AND
531 ns_book_fk = ".$ilDB->quote($this->obj_id)." AND
532 ns_type = ".$ilDB->quote($this->obj_type)." AND
533 ns_l >= ".$ilDB->quote($this->LEFT)." AND
534 ns_r <= ".$ilDB->quote($this->RIGHT)." AND
535 tag_depth = ".$ilDB->quote(($this->DEPTH+1))." AND
536 tag_name = 'TAGVALUE'
537 ORDER BY ns_l";
538 $result = $this->db->query($query);
539
540 if (is_array($row = $result->fetchRow(DB_FETCHMODE_ASSOC) ) )
541 {
542
543 $query = "UPDATE xmlvalue SET tag_value = ".$ilDB->quote($value)." WHERE tag_value_pk = ".$ilDB->quote($row["tag_value_pk"])." ";
544 $this->db->query($query);
545
546 }
547 else
548 {
549
554 }
555 }
556
566 function getXpathNodes(&$doc, $qry)
567 {
568 if (is_object($doc))
569 {
570 $xpath = $doc->xpath_init();
571 $ctx = $doc->xpath_new_context();
572//echo "<br><b>ilNestedSetXML::getXpathNodes</b>";
573 $result = $ctx->xpath_eval($qry);
574 if (is_array($result->nodeset))
575 {
576 return($result->nodeset);
577 }
578 }
579 return Null;
580 }
581
588 function initDom()
589 {
590 $xml = $this->export($this->obj_id, $this->obj_type);
591
592/*
593 for testing
594 $xml_test = '
595 <MetaData>
596 <General Structure="Atomic">
597 <Identifier Catalog="ILIAS" Entry="34">Identifier 34 in ILIAS</Identifier>
598 <Identifier Catalog="ILIAS" Entry="45">Identifier 45 in ILIAS</Identifier>
599 <Identifier Catalog="ILIAS" Entry="67">Identifier 67 in ILIAS</Identifier>
600 </General>
601 </MetaData>
602 ';
603
604 $xml = $xml_test;
605*/
606
607 if ($xml=="")
608 {
609 return(false);
610 }
611 else
612 {
613 $this->dom = domxml_open_mem($xml);
614 return(true);
615 }
616 }
617
628 function addXMLNode($xPath, $xml, $index = 0)
629 {
630 include_once "./Services/Xml/classes/class.ilXML2DOM.php";
631
632 $newDOM = new XML2DOM($xml);
633//echo "<br>addXMLNode:-".htmlspecialchars($this->dom->dump_mem(0));
634 $nodes = $this->getXpathNodes($this->dom, $xPath);
635
636 if (count($nodes) > 0)
637 {
638 $newDOM->insertNode($this->dom, $nodes[$index]);
639 return true;
640 }
641 else
642 {
643 return false;
644 }
645 }
646
655 function getFirstDomContent($xPath)
656 {
657//echo "<br>ilNestedSetXML::getFirstDomContent-start-$xPath-"; flush();
658 $content = "";
659 if (is_object($this->dom))
660 {
661 $node = $this->getXpathNodes($this->dom,$xPath);
662 if (is_array($node))
663 {
664 $c = $node[0]->children();
665 //$content = $c[0]->content; // ## changed
666 if (is_object($c[0]))
667 {
668 $content = $c[0]->get_content(); // ## changed
669 }
670 }
671 }
672//echo "<br>ilNestedSetXML::getFirstDomContent-stop-$content-"; flush();
673 return($content);
674 }
675
686 function deleteDomNode($xPath, $name, $index = 0)
687 {
688 if ($index == "")
689 {
690 $index = 0;
691 }
692 if (strpos($index, ","))
693 {
694 $indices = explode(",", $index);
695 $nodes = $this->getXpathNodes($this->dom, $xPath);
696 if (count($nodes) > 0)
697 {
698 $children = $nodes[$indices[0]]->child_nodes();
699 if (count($children) > 0)
700 {
701 $j = 0;
702 for ($i = 0; $i < count($children); $i++)
703 {
704 if ($children[$i]->node_name() == $name)
705 {
706 if ($j == $indices[1])
707 {
708 $children[$i]->unlink_node();
709 return true;
710 }
711 $j++;
712 }
713 }
714 }
715 }
716 }
717 else
718 {
719 $nodes = $this->getXpathNodes($this->dom, $xPath . "/" . $name);
720 if (count($nodes) > 0)
721 {
722 $nodes[$index]->unlink_node();
723 return true;
724 }
725 }
726 return false;
727 }
728
741 function addDomNode($xPath, $name, $value = "", $attributes = "", $index = 0)
742 {
743 $nodes = $this->getXpathNodes($this->dom, $xPath);
744 if (count($nodes) > 0)
745 {
746 $node = $this->dom->create_element($name);
747 if ($value != "")
748 {
749 $node->set_content(utf8_encode($value));
750 }
751 if (is_array($attributes))
752 {
753 for ($i = 0; $i < count($attributes); $i++)
754 {
755 $node->set_attribute($attributes[$i]["name"], utf8_encode($attributes[$i]["value"]));
756 }
757 }
758 $nodes[$index]->append_child($node);
759 return true;
760 }
761 else
762 {
763 return false;
764 }
765 }
766
767 function clean(&$meta)
768 {
769 if(is_array($meta))
770 {
771 foreach($meta as $key => $value)
772 {
773 if(is_array($meta[$key]))
774 {
775 $this->clean($meta[$key]);
776 }
777 else
778 {
779 $meta[$key] = preg_replace("/&(?!amp;|lt;|gt;|quot;)/","&amp;",$meta[$key]);
780 $meta[$key] = preg_replace("/\"/","&quot;",$meta[$key]);
781 $meta[$key] = preg_replace("/</","&lt;",$meta[$key]);
782 $meta[$key] = preg_replace("/>/","&gt;",$meta[$key]);
783 }
784 }
785 }
786 return true;
787 }
796 function updateDomNode($xPath, $meta, $no = 0)
797 {
798 $this->clean($meta);
799 $update = false;
800 if ($xPath == "//Bibliography")
801 {
802 $nodes = $this->getXpathNodes($this->dom, $xPath . "/BibItem[" . ($no+1) . "]");
803 }
804 else
805 {
806 $nodes = $this->getXpathNodes($this->dom, $xPath);
807 }
808 if (count($nodes) > 0)
809 {
810
811 /* BibItem */
812 if ($nodes[0]->node_name() == "BibItem")
813 {
814 $xml = '<BibItem Type="' . ilUtil::stripSlashes($meta["Type"]) . '" Label="' . ilUtil::stripSlashes($meta["Label"]["Value"]) . '">';
815 $xml .= '<Identifier Catalog="' . ilUtil::stripSlashes($meta["Identifier"]["Catalog"]) . '" Entry="' . str_replace("\"", "", ilUtil::stripSlashes($meta["Identifier"]["Entry"])) . '"/>';
816 for ($i = 0; $i < count($meta["Language"]); $i++)
817 {
818 $xml .= '<Language Language="' . ilUtil::stripSlashes($meta["Language"][$i]["Language"]) . '"/>';
819 }
820 for ($i = 0; $i < count($meta["Author"]); $i++)
821 {
822 $xml .= '<Author>';
823# for ($j = 0; $j < count($meta["Author"][$i]["FirstName"]); $j++)
824# {
825 $xml .= '<FirstName>' . ilUtil::stripSlashes($meta["Author"][$i]["FirstName"]) . '</FirstName>';
826# }
827# for ($j = 0; $j < count($meta["Author"][$i]["MiddleName"]); $j++)
828# {
829 $xml .= '<MiddleName>' . ilUtil::stripSlashes($meta["Author"][$i]["MiddleName"]) . '</MiddleName>';
830# }
831# for ($j = 0; $j < count($meta["Author"][$i]["LastName"]); $j++)
832# {
833 $xml .= '<LastName>' . ilUtil::stripSlashes($meta["Author"][$i]["LastName"]) . '</LastName>';
834# }
835 $xml .= '</Author>';
836 }
837 $xml .= '<Booktitle Language="' . ilUtil::stripSlashes($meta["Booktitle"]["Language"]) . '">' . ilUtil::stripSlashes($meta["Booktitle"]["Value"]) . '</Booktitle>';
838 for ($i = 0; $i < count($meta["CrossRef"]); $i++)
839 {
840 $xml .= '<CrossRef>' . ilUtil::stripSlashes($meta["CrossRef"][$i]["Value"]) . '</CrossRef>';
841 }
842 $xml .= '<Edition>' . ilUtil::stripSlashes($meta["Edition"]["Value"]) . '</Edition>';
843 for ($i = 0; $i < count($meta["Editor"]); $i++)
844 {
845 $xml .= '<Editor>' . ilUtil::stripSlashes($meta["Editor"][$i]["Value"]) . '</Editor>';
846 }
847 $xml .= '<HowPublished Type="' . ilUtil::stripSlashes($meta["HowPublished"]["Type"]) . '"/>';
848 for ($i = 0; $i < count($meta["WherePublished"]); $i++)
849 {
850 $xml .= '<WherePublished>' . ilUtil::stripSlashes($meta["WherePublished"][$i]["Value"]) . '</WherePublished>';
851 }
852 for ($i = 0; $i < count($meta["Institution"]); $i++)
853 {
854 $xml .= '<Institution>' . ilUtil::stripSlashes($meta["Institution"][$i]["Value"]) . '</Institution>';
855 }
856 if (is_array($meta["Journal"]))
857 {
858 $xml .= '<Journal Note="' . ilUtil::stripSlashes($meta["Journal"]["Note"]) . '" Number="' . ilUtil::stripSlashes($meta["Journal"]["Number"]) . '" Organization="' . ilUtil::stripSlashes($meta["Journal"]["Organization"]) . '"/>';
859 }
860 for ($i = 0; $i < count($meta["Keyword"]); $i++)
861 {
862 $xml .= '<Keyword Language="' . ilUtil::stripSlashes($meta["Keyword"][$i]["Language"]) . '">' . ilUtil::stripSlashes($meta["Keyword"][$i]["Value"]) . '</Keyword>';
863 }
864 if (is_array($meta["Month"]))
865 {
866 $xml .= '<Month>' . ilUtil::stripSlashes($meta["Month"]["Value"]) . '</Month>';
867 }
868 if (is_array($meta["Pages"]))
869 {
870 $xml .= '<Pages>' . ilUtil::stripSlashes($meta["Pages"]["Value"]) . '</Pages>';
871 }
872 $xml .= '<Publisher>' . ilUtil::stripSlashes($meta["Publisher"]["Value"]) . '</Publisher>';
873 for ($i = 0; $i < count($meta["School"]); $i++)
874 {
875 $xml .= '<School>' . ilUtil::stripSlashes($meta["School"][$i]["Value"]) . '</School>';
876 }
877 if (is_array($meta["Series"]))
878 {
879 $xml .= '<Series>';
880 $xml .= '<SeriesTitle>' . ilUtil::stripSlashes($meta["Series"]["SeriesTitle"]) . '</SeriesTitle>';
881# for ($i = 0; $i < count($meta["Series"]["SeriesEditor"]); $i++)
882 if (isset($meta["Series"]["SeriesEditor"]))
883 {
884# $xml .= '<SeriesEditor>' . ilUtil::stripSlashes($meta["Series"]["SeriesEditor"][$i]) . '</SeriesEditor>';
885 $xml .= '<SeriesEditor>' . ilUtil::stripSlashes($meta["Series"]["SeriesEditor"]) . '</SeriesEditor>';
886 }
887 if (isset($meta["Series"]["SeriesVolume"]))
888 {
889 $xml .= '<SeriesVolume>' . ilUtil::stripSlashes($meta["Series"]["SeriesVolume"]) . '</SeriesVolume>';
890 }
891 $xml .= '</Series>';
892 }
893 $xml .= '<Year>' . ilUtil::stripSlashes($meta["Year"]["Value"]) . '</Year>';
894 if ($meta["URL_ISBN_ISSN"]["Type"] == "URL")
895 {
896 $xml .= '<URL>' . ilUtil::stripSlashes($meta["URL_ISBN_ISSN"]["Value"]) . '</URL>';
897 }
898 else if ($meta["URL_ISBN_ISSN"]["Type"] == "ISBN")
899 {
900 $xml .= '<ISBN>' . ilUtil::stripSlashes($meta["URL_ISBN_ISSN"]["Value"]) . '</ISBN>';
901 }
902 else if ($meta["URL_ISBN_ISSN"]["Type"] == "ISSN")
903 {
904 $xml .= '<ISSN>' . ilUtil::stripSlashes($meta["URL_ISBN_ISSN"]["Value"]) . '</ISSN>';
905 }
906 $xml .= '</BibItem>';
907# echo htmlspecialchars($xml);
908
909 $update = true;
910 }
911
912 /* General */
913 else if ($nodes[0]->node_name() == "General")
914 {
915
916 $xml = '<General Structure="' . ilUtil::stripSlashes($meta["Structure"]) . '">';
917 for ($i = 0; $i < count($meta["Identifier"]); $i++)
918 {
919 $xml .= '<Identifier Catalog="' . ilUtil::stripSlashes($meta["Identifier"][$i]["Catalog"]) . '" Entry="' .
920 str_replace("\"", "", ilUtil::stripSlashes($meta["Identifier"][$i]["Entry"])) . '"/>';
921 }
922
923 $xml .= '<Title Language="' .
924 ilUtil::stripSlashes($meta["Title"]["Language"]) . '">' .
925 ilUtil::stripSlashes($meta["Title"]["Value"]) . '</Title>';
926 for ($i = 0; $i < count($meta["Language"]); $i++)
927 {
928 $xml .= '<Language Language="' . ilUtil::stripSlashes($meta["Language"][$i]["Language"]) . '"/>';
929 }
930 for ($i = 0; $i < count($meta["Description"]); $i++)
931 {
932 $xml .= '<Description Language="' . ilUtil::stripSlashes($meta["Description"][$i]["Language"]) . '">' . ilUtil::stripSlashes($meta["Description"][$i]["Value"]) . '</Description>';
933 }
934 for ($i = 0; $i < count($meta["Keyword"]); $i++)
935 {
936 $xml .= '<Keyword Language="' . ilUtil::stripSlashes($meta["Keyword"][$i]["Language"]) . '">' . ilUtil::stripSlashes($meta["Keyword"][$i]["Value"]) . '</Keyword>';
937 }
938 if ($meta["Coverage"] != "")
939 {
940 $xml .= '<Coverage Language="' . ilUtil::stripSlashes($meta["Coverage"]["Language"]) . '">' . ilUtil::stripSlashes($meta["Coverage"]["Value"]) . '</Coverage>';
941 }
942 $xml .= '</General>';
943//echo "<br><br>".htmlspecialchars($xml);
944
945 $update = true;
946 }
947
948 /* Lifecycle */
949 else if ($nodes[0]->node_name() == "Lifecycle")
950 {
951 $xml = '<Lifecycle Status="' . $meta["Status"] . '">';
952 $xml .= '<Version Language="' . ilUtil::stripSlashes($meta["Version"]["Language"]) . '">' . ilUtil::stripSlashes($meta["Version"]["Value"]) . '</Version>';
953 for ($i = 0; $i < count($meta["Contribute"]); $i++)
954 {
955 $xml .= '<Contribute Role="' . ilUtil::stripSlashes($meta["Contribute"][$i]["Role"]) . '">';
956 $xml .= '<Date>' . ilUtil::stripSlashes($meta["Contribute"][$i]["Date"]) . '</Date>';
957 for ($j = 0; $j < count($meta["Contribute"][$i]["Entity"]); $j++)
958 {
959 $xml .= '<Entity>' . ilUtil::stripSlashes($meta["Contribute"][$i]["Entity"][$j]) . '</Entity>';
960 }
961 $xml .= '</Contribute>';
962 }
963 $xml .= '</Lifecycle>';
964# echo htmlspecialchars($xml);
965
966 $update = true;
967 }
968
969 /* Meta-Metadata */
970 else if ($nodes[0]->node_name() == "Meta-Metadata")
971 {
972
973 $xml = '<Meta-Metadata MetadataScheme="LOM v 1.0" Language="' . ilUtil::stripSlashes($meta["Language"]) . '">';
974 for ($i = 0; $i < count($meta["Identifier"]); $i++)
975 {
976 $xml .= '<Identifier Catalog="' . ilUtil::stripSlashes($meta["Identifier"][$i]["Catalog"]) . '" Entry="' . str_replace("\"", "", ilUtil::stripSlashes($meta["Identifier"][$i]["Entry"])) . '"/>';
977 }
978 for ($i = 0; $i < count($meta["Contribute"]); $i++)
979 {
980 $xml .= '<Contribute Role="' . ilUtil::stripSlashes($meta["Contribute"][$i]["Role"]) . '">';
981 $xml .= '<Date>' . ilUtil::stripSlashes($meta["Contribute"][$i]["Date"]) . '</Date>';
982 for ($j = 0; $j < count($meta["Contribute"][$i]["Entity"]); $j++)
983 {
984 $xml .= '<Entity>' . ilUtil::stripSlashes($meta["Contribute"][$i]["Entity"][$j]) . '</Entity>';
985 }
986 $xml .= '</Contribute>';
987 }
988 $xml .= '</Meta-Metadata>';
989# echo htmlspecialchars($xml);
990
991 $update = true;
992 }
993
994 /* Technical */
995 else if ($nodes[0]->node_name() == "Technical")
996 {
997
998 $xml = '<Technical>';
999 for ($i = 0; $i < count($meta["Format"]); $i++)
1000 {
1001 $xml .= '<Format>' . ilUtil::stripSlashes($meta["Format"][$i]) . '</Format>';
1002 }
1003 if ($meta["Size"] != "")
1004 {
1005 $xml .= '<Size>' . ilUtil::stripSlashes($meta["Size"]) . '</Size>';
1006 }
1007 for ($i = 0; $i < count($meta["Location"]); $i++)
1008 {
1009 $xml .= '<Location Type="' . ilUtil::stripSlashes($meta["Location"][$i]["Type"]) . '">' . ilUtil::stripSlashes($meta["Location"][$i]["Value"]) . '</Location>';
1010 }
1011 if (is_array($meta["Requirement"]))
1012 {
1013 for ($i = 0; $i < count($meta["Requirement"]); $i++)
1014 {
1015 $xml .= '<Requirement>';
1016 $xml .= '<Type>';
1017 if (is_array($meta["Requirement"][$i]["Type"]["OperatingSystem"]))
1018 {
1019 $xml .= '<OperatingSystem Name="' . ilUtil::stripSlashes($meta["Requirement"][$i]["Type"]["OperatingSystem"]["Name"]) . '" MinimumVersion="' . str_replace("\"", "", ilUtil::stripSlashes($meta["Requirement"][$i]["Type"]["OperatingSystem"]["MinimumVersion"])) . '" MaximumVersion="' . str_replace("\"", "", ilUtil::stripSlashes($meta["Requirement"][$i]["Type"]["OperatingSystem"]["MaximumVersion"])) . '"/>';
1020 }
1021 if (is_array($meta["Requirement"][$i]["Type"]["Browser"]))
1022 {
1023 $xml .= '<Browser Name="' . ilUtil::stripSlashes($meta["Requirement"][$i]["Type"]["Browser"]["Name"]) . '" MinimumVersion="' . str_replace("\"", "", ilUtil::stripSlashes($meta["Requirement"][$i]["Type"]["Browser"]["MinimumVersion"])) . '" MaximumVersion="' . str_replace("\"", "", ilUtil::stripSlashes($meta["Requirement"][$i]["Type"]["Browser"]["MaximumVersion"])) . '"/>';
1024 }
1025 $xml .= '</Type>';
1026 $xml .= '</Requirement>';
1027 }
1028 }
1029 else if (is_array($meta["OrComposite"]))
1030 {
1031 for ($j = 0; $j < count($meta["OrComposite"]); $j++)
1032 {
1033 $xml .= '<OrComposite>';
1034 for ($i = 0; $i < count($meta["OrComposite"][$j]["Requirement"]); $i++)
1035 {
1036 $xml .= '<Requirement>';
1037 $xml .= '<Type>';
1038 if (is_array($meta["OrComposite"][$j]["Requirement"][$i]["Type"]["OperatingSystem"]))
1039 {
1040 $xml .= '<OperatingSystem Name="' . ilUtil::stripSlashes($meta["OrComposite"][$j]["Requirement"][$i]["Type"]["OperatingSystem"]["Name"]) . '" MinimumVersion="' . str_replace("\"", "", ilUtil::stripSlashes($meta["OrComposite"][$j]["Requirement"][$i]["Type"]["OperatingSystem"]["MinimumVersion"])) . '" MaximumVersion="' . str_replace("\"", "", ilUtil::stripSlashes($meta["OrComposite"][$j]["Requirement"][$i]["Type"]["OperatingSystem"]["MaximumVersion"])) . '"/>';
1041 }
1042 if (is_array($meta["OrComposite"][$j]["Requirement"][$i]["Type"]["Browser"]))
1043 {
1044 $xml .= '<Browser Name="' . ilUtil::stripSlashes($meta["OrComposite"][$j]["Requirement"][$i]["Type"]["Browser"]["Name"]) . '" MinimumVersion="' . str_replace("\"", "", ilUtil::stripSlashes($meta["OrComposite"][$j]["Requirement"][$i]["Type"]["Browser"]["MinimumVersion"])) . '" MaximumVersion="' . str_replace("\"", "", ilUtil::stripSlashes($meta["OrComposite"][$j]["Requirement"][$i]["Type"]["Browser"]["MaximumVersion"])) . '"/>';
1045 }
1046 $xml .= '</Type>';
1047 $xml .= '</Requirement>';
1048 }
1049 $xml .= '</OrComposite>';
1050 }
1051 }
1052 if (is_array($meta["InstallationRemarks"]))
1053 {
1054 $xml .= '<InstallationRemarks Language="' . ilUtil::stripSlashes($meta["InstallationRemarks"]["Language"]) . '">' . ilUtil::stripSlashes($meta["InstallationRemarks"]["Value"]) . '</InstallationRemarks>';
1055 }
1056 if (is_array($meta["OtherPlattformRequirements"]))
1057 {
1058 $xml .= '<OtherPlattformRequirements Language="' . ilUtil::stripSlashes($meta["OtherPlattformRequirements"]["Language"]) . '">' . ilUtil::stripSlashes($meta["OtherPlattformRequirements"]["Value"]) . '</OtherPlattformRequirements>';
1059 }
1060 if ($meta["Duration"] != "")
1061 {
1062 $xml .= '<Duration>' . ilUtil::stripSlashes($meta["Duration"]) . '</Duration>';
1063 }
1064 $xml .= '</Technical>';
1065# echo htmlspecialchars($xml);
1066
1067 $update = true;
1068 }
1069
1070 /* Educational */
1071 else if ($nodes[0]->node_name() == "Educational")
1072 {
1073
1074 $xml = '<Educational InteractivityType="' . ilUtil::stripSlashes($meta["InteractivityType"]) . '" LearningResourceType="' . ilUtil::stripSlashes($meta["LearningResourceType"]) . '" InteractivityLevel="' . ilUtil::stripSlashes($meta["InteractivityLevel"]) . '" SemanticDensity="' . ilUtil::stripSlashes($meta["SemanticDensity"]) . '" IntendedEndUserRole="' . ilUtil::stripSlashes($meta["IntendedEndUserRole"]) . '" Context="' . ilUtil::stripSlashes($meta["Context"]) . '" Difficulty="' . ilUtil::stripSlashes($meta["Difficulty"]) . '">';
1075 $xml .= '<TypicalLearningTime>' . ilUtil::stripSlashes($meta["TypicalLearningTime"]) . '</TypicalLearningTime>';
1076 for ($i = 0; $i < count($meta["TypicalAgeRange"]); $i++)
1077 {
1078 $xml .= '<TypicalAgeRange Language="' . ilUtil::stripSlashes($meta["TypicalAgeRange"][$i]["Language"]) . '">' . ilUtil::stripSlashes($meta["TypicalAgeRange"][$i]["Value"]) . '</TypicalAgeRange>';
1079 }
1080 for ($i = 0; $i < count($meta["Description"]); $i++)
1081 {
1082 $xml .= '<Description Language="' . ilUtil::stripSlashes($meta["Description"][$i]["Language"]) . '">' . ilUtil::stripSlashes($meta["Description"][$i]["Value"]) . '</Description>';
1083 }
1084 for ($i = 0; $i < count($meta["Language"]); $i++)
1085 {
1086 $xml .= '<Language Language="' . ilUtil::stripSlashes($meta["Language"][$i]["Language"]) . '"/>';
1087 }
1088 $xml .= '</Educational>';
1089
1090 $update = true;
1091 }
1092
1093 /* Rights */
1094 else if ($nodes[0]->node_name() == "Rights")
1095 {
1096
1097 $xml = '<Rights Cost="' . ilUtil::stripSlashes($meta["Cost"]) . '" CopyrightAndOtherRestrictions="' . ilUtil::stripSlashes($meta["CopyrightAndOtherRestrictions"]) . '">';
1098 for ($i = 0; $i < count($meta["Description"]); $i++)
1099 {
1100 $xml .= '<Description Language="' . ilUtil::stripSlashes($meta["Description"][$i]["Language"]) . '">' . ilUtil::stripSlashes($meta["Description"][$i]["Value"]) . '</Description>';
1101 }
1102 $xml .= '</Rights>';
1103
1104 $update = true;
1105 }
1106
1107 /* Relation */
1108 else if ($nodes[0]->node_name() == "Relation")
1109 {
1110
1111# for ($j = 0; $j < count($meta["Relation"]); $j++)
1112# {
1113 $meta["Relation"][0] = $meta;
1114 $j = 0;
1115 $xml = '<Relation Kind="' . ilUtil::stripSlashes($meta["Relation"][$j]["Kind"]) . '">';
1116 $xml .= '<Resource>';
1117 for ($i = 0; $i < count($meta["Relation"][$j]["Resource"]["Identifier"]); $i++)
1118 {
1119 $xml .= '<Identifier_ Catalog="' . ilUtil::stripSlashes($meta["Relation"][$j]["Resource"]["Identifier"][$i]["Catalog"]) . '" Entry="' . str_replace("\"", "", ilUtil::stripSlashes($meta["Relation"][$j]["Resource"]["Identifier"][$i]["Entry"])) . '"/>';
1120 }
1121 for ($i = 0; $i < count($meta["Relation"][$j]["Resource"]["Description"]); $i++)
1122 {
1123 $xml .= '<Description Language="' . ilUtil::stripSlashes($meta["Relation"][$j]["Resource"]["Description"][$i]["Language"]) . '">' . ilUtil::stripSlashes($meta["Relation"][$j]["Resource"]["Description"][$i]["Value"]) . '</Description>';
1124 }
1125 $xml .= '</Resource>';
1126 $xml .= '</Relation>';
1127# echo htmlspecialchars($xml);
1128# }
1129
1130 $update = true;
1131 }
1132
1133 /* Annotation */
1134 else if ($nodes[0]->node_name() == "Annotation")
1135 {
1136
1137# for ($i = 0; $i < count($meta["Annotation"]); $i++)
1138# {
1139 $meta["Annotation"][0] = $meta;
1140 $i = 0;
1141 $xml = '<Annotation>';
1142 $xml .= '<Entity>' . ilUtil::stripSlashes($meta["Annotation"][$i]["Entity"]) . '</Entity>';
1143 $xml .= '<Date>' . ilUtil::stripSlashes($meta["Annotation"][$i]["Date"]) . '</Date>';
1144 $xml .= '<Description Language="' . ilUtil::stripSlashes($meta["Annotation"][$i]["Description"]["Language"]) . '">' . ilUtil::stripSlashes($meta["Annotation"][$i]["Description"]["Value"]) . '</Description>';
1145 $xml .= '</Annotation>';
1146# echo htmlspecialchars($xml);
1147# }
1148
1149 $update = true;
1150 }
1151
1152 /* Classification */
1153 else if ($nodes[0]->node_name() == "Classification")
1154 {
1155
1156# for ($j = 0; $j < count($meta["Classification"]); $j++)
1157# {
1158 $meta["Classification"][0] = $meta;
1159 $j = 0;
1160 $xml = '<Classification Purpose="' . ilUtil::stripSlashes($meta["Classification"][$j]["Purpose"]) . '">';
1161 for ($k = 0; $k < count($meta["Classification"][$j]["TaxonPath"]); $k++)
1162 {
1163 $xml .= '<TaxonPath>';
1164 $xml .= '<Source Language="' . ilUtil::stripSlashes($meta["Classification"][$j]["TaxonPath"][$k]["Source"]["Language"]) . '">' . ilUtil::stripSlashes($meta["Classification"][$j]["TaxonPath"][$k]["Source"]["Value"]) . '</Source>';
1165 for ($i = 0; $i < count($meta["Classification"][$j]["TaxonPath"][$k]["Taxon"]); $i++)
1166 {
1167 $xml .= '<Taxon Language="' . ilUtil::stripSlashes($meta["Classification"][$j]["TaxonPath"][$k]["Taxon"][$i]["Language"]) . '" Id="' . str_replace("\"", "", ilUtil::stripSlashes($meta["Classification"][$j]["TaxonPath"][$k]["Taxon"][$i]["Id"])) . '">' . ilUtil::stripSlashes($meta["Classification"][$j]["TaxonPath"][$k]["Taxon"][$i]["Value"]) . '</Taxon>';
1168 }
1169 $xml .= '</TaxonPath>';
1170 }
1171 $xml .= '<Description Language="' . ilUtil::stripSlashes($meta["Classification"][$j]["Description"]["Language"]) . '">' . ilUtil::stripSlashes($meta["Classification"][$j]["Description"]["Value"]) . '</Description>';
1172 for ($i = 0; $i < count($meta["Classification"][$j]["Keyword"]); $i++)
1173 {
1174 $xml .= '<Keyword Language="' . ilUtil::stripSlashes($meta["Classification"][$j]["Keyword"][$i]["Language"]) . '">' . ilUtil::stripSlashes($meta["Classification"][$j]["Keyword"][$i]["Value"]) . '</Keyword>';
1175 }
1176 $xml .= '</Classification>';
1177# echo htmlspecialchars($xml);
1178# }
1179
1180 $update = true;
1181 }
1182
1183 if ($update)
1184 {
1185 $nodes[0]->unlink_node();
1186
1187 if ($xPath != "//Bibliography")
1188 {
1189 $xPath = "//MetaData";
1190 }
1191//echo "<br><br>savedA:".htmlspecialchars($this->dom->dump_mem(0));
1192 $this->addXMLNode($xPath, $xml);
1193//echo "<br><br>savedB:".htmlspecialchars($this->dom->dump_mem(0));
1194 }
1195 return true;
1196 }
1197 else
1198 {
1199 return false;
1200 }
1201 }
1202
1213 function getDomContent($xPath, $name = "", $index = 0)
1214 {
1215 if ($index == "")
1216 {
1217 $index = 0;
1218 }
1219# echo "Index: " . $index . " | Path: " . $xPath . " | Name: " . $name . "<br>\n";
1220 $nodes = $this->getXpathNodes($this->dom, $xPath);
1221 if (count($nodes) > 0)
1222 {
1223 $children = $nodes[$index]->child_nodes();
1224 if (count($children) > 0)
1225 {
1226 $k = 0;
1227 for ($i = 0; $i < count($children); $i++)
1228 {
1229//echo "<br>ilNestedSetXML::getDomContent-".$children[$i]->node_name()."-".$name;
1230 if ($name == "" ||
1231 $children[$i]->node_name() == $name)
1232 {
1233 $content[$k]["value"] = $children[$i]->get_content();
1234 $a = $children[$i]->attributes();
1235 for ($j = 0; $j < count($a); $j++)
1236 {
1237 $content[$k][$a[$j]->name()] = $a[$j]->value();
1238 }
1239 $k++;
1240 }
1241 }
1242# vd($content);
1243 return($content);
1244 }
1245 }
1246 return false;
1247 }
1248
1257 function replaceDomContent($xPath, $name = "", $index = 0, $newNode)
1258 {
1259# echo "Index: " . $index . " | Path: " . $xPath . " | Name: " . $name . "<br>\n";
1260 $nodes = $this->getXpathNodes($this->dom, $xPath);
1261 if (count($nodes) > 0)
1262 {
1263 $children = $nodes[$index]->child_nodes();
1264 if (count($children) > 0)
1265 {
1266 for ($i = 0; $i < count($children); $i++)
1267 {
1268 if ($children[$i]->node_name() == $name &&
1269 is_array($newNode))
1270 {
1271 foreach ($newNode as $key => $val)
1272 {
1273 if ($key == "value")
1274 {
1275 $this->replace_content($children[$i], $val);
1276 }
1277 else
1278 {
1279 $children[$i]->set_attribute($key, $val);
1280 }
1281 }
1282 }
1283 }
1284 }
1285 }
1286 }
1287
1298 function replace_content( &$node, &$new_content )
1299 {
1300 $newnode =& $this->dom->create_element( $node->tagname() );
1301 $newnode->set_content( $new_content );
1302 $atts =& $node->attributes();
1303 foreach ( $atts as $att )
1304 {
1305 $newnode->set_attribute( $att->name(), $att->value() );
1306 }
1307 $kids =& $node->child_nodes();
1308 foreach ( $kids as $kid )
1309 {
1310 if ( $kid->node_type() != XML_TEXT_NODE )
1311 {
1312 $newnode->append_child( $kid );
1313 }
1314 }
1315 $node->replace_node( $newnode );
1316 }
1317
1326 function updateDomContent($xPath, $name = "", $index = 0, $newNode)
1327 {
1328// echo "Index: " . $index . " | Path: " . $xPath . " | Name: " . $name . "<br>\n";
1329 $nodes = $this->getXpathNodes($this->dom, $xPath);
1330 if (count($nodes) > 0)
1331 {
1332 $children = $nodes[$index]->child_nodes();
1333 if (count($children) > 0)
1334 {
1335 for ($i = 0; $i < count($children); $i++)
1336 {
1337 if ($children[$i]->node_name() == $name &&
1338 is_array($newNode))
1339 {
1340 foreach ($newNode as $key => $val)
1341 {
1342 if ($key == "value")
1343 {
1344 $children[$i]->set_content($val);
1345 }
1346 else
1347 {
1348 $children[$i]->set_attribute($key, $val);
1349 }
1350 }
1351 }
1352 }
1353 }
1354 }
1355 }
1356
1364 function getFirstDomNode($xPath)
1365 {
1366 $node = $this->getXpathNodes($this->dom,$xPath);
1367 return($node[0]);
1368 }
1369
1374 function updateFromDom()
1375 {
1376 $this->deleteAllDbData();
1377 $xml = $this->dom->dump_mem(0);
1378 $this->import($xml,$this->obj_id,$this->obj_type);
1379
1380 }
1381
1387 {
1388 global $ilBench, $ilDB;
1389
1390 #$ilBench->start('NestedSet','deleteAllDBData');
1391 $res = $this->db->query("SELECT * FROM xmlnestedset WHERE ns_book_fk = ".$ilDB->quote($this->obj_id)." AND ns_type = ".$ilDB->quote($this->obj_type)." ");
1392 while ($row = $res->fetchRow(DB_FETCHMODE_ASSOC))
1393 {
1394 $this->db->query("DELETE FROM xmlparam WHERE tag_fk = ".$ilDB->quote($row["ns_tag_fk"])." ");
1395 $this->db->query("DELETE FROM xmlvalue WHERE tag_fk = ".$ilDB->quote($row["ns_tag_fk"])." ");
1396 $this->db->query("DELETE FROM xmltags WHERE tag_pk = ".$ilDB->quote($row["ns_tag_fk"])." ");
1397 }
1398 $this->db->query("DELETE FROM xmlnestedset WHERE ns_book_fk = ".$ilDB->quote($this->obj_id)." AND ns_type = ".$ilDB->quote($this->obj_type)." ");
1399 #$ilBench->stop('NestedSet','deleteAllDBData');
1400
1401 }
1402
1411 {
1412 global $ilBench, $ilDB;
1413
1414 #$ilBench->start('NestedSet','deleteAllChildMetaData');
1415
1416 // STEP TWO: DELETE ENTRIES IN xmlnestedset GET ALL tag_fks
1417 $in = " IN (";
1418 $in .= implode(",", ilUtil::quoteArray($a_ids));
1419 $in .= ")";
1420
1421 $query = "SELECT ns_tag_fk FROM xmlnestedset ".
1422 "WHERE ns_book_fk ".$in;
1423 $res = $ilDB->query($query);
1424 while($row = $res->fetchRow(DB_FETCHMODE_OBJECT))
1425 {
1426 $tag_fks[$row->ns_tag_fk] = $row->ns_tag_fk;
1427 }
1428 $ilDB->query("DELETE FROM xmlnestedset WHERE ns_book_fk ".$in);
1429
1430
1431 // FINALLY DELETE
1432 $in = " IN (";
1433 $in .= implode(",", ilUtil::quoteArray($tag_fks));
1434 $in .= ")";
1435
1436 $ilDB->query("DELETE FROM xmlparam WHERE tag_fk ".$in);
1437 $ilDB->query("DELETE FROM xmlvalue WHERE tag_fk ".$in);
1438 $ilDB->query("DELETE FROM xmltags WHERE tag_pk ".$in);
1439
1440 #$ilBench->stop('NestedSet','deleteAllChildMetaData');
1441 return true;
1442 }
1443
1450 function _getAllChildIds($a_obj_id)
1451 {
1452 global $ilDB;
1453
1454 $query = "SELECT obj_id FROM lm_data WHERE lm_id = ".$ilDB->quote($a_obj_id)." ";
1455 $res = $ilDB->query($query);
1456 while($row = $res->fetchRow(DB_FETCHMODE_OBJECT))
1457 {
1458 $ids[$row->obj_id] = $row->obj_id;
1459 }
1460 $ids[$a_obj_id] = $a_obj_id;
1461
1462 return $ids ? $ids : array();
1463 }
1464
1465
1466 // }}}
1467
1468}
1469
1470?>
$result
const DB_FETCHMODE_ASSOC
Definition: class.ilDB.php:10
const DB_FETCHMODE_OBJECT
Definition: class.ilDB.php:11
Class NestedSetXML functions for storing XML-Data into nested-set-database-strcture.
addDomNode($xPath, $name, $value="", $attributes="", $index=0)
updateDomContent($xPath, $name="", $index=0, $newNode)
replace_content(&$node, &$new_content)
Replace node contents.
replaceDomContent($xPath, $name="", $index=0, $newNode)
$obj_type
The type of the data to those this entry belongs.
updateDomNode($xPath, $meta, $no=0)
getTagValue()
get tag content
$xml_parser
SAX-Parser-Handle.
startElement($parser, $name, $attrs)
Method is called, at an introductory TAG @access private.
$LEFT
Left and right edge tags.
getFirstDomNode($xPath)
first dom-node
endElement($parser, $name)
method called at a closing tag @access private
deleteDomNode($xPath, $name, $index=0)
$db
Datenbank-handle.
getXpathNodes(&$doc, $qry)
get node in dom-structure
$lastTag
last Tag-Name found
addXMLNode($xPath, $xml, $index=0)
ilNestedSetXML()
Constructor initilize netsed-set variables @access public.
getTagName()
find first tag-name
setTagValue($value)
set tag-content
init($obj_id, $obj_type)
initilialize Nested-Set-Structur
setTagName($tagName)
set tag-name
export($obj_id, $type)
Export-Function.
$DEPTH
Nesting level of the tags.
setParameterModifier(&$a_object, $a_method)
getDomContent($xPath, $name="", $index=0)
static stripSlashes($a_str, $a_strip_html=true, $a_allow="")
strip slashes if magic qoutes is enabled
static quoteArray($a_array)
Quotes all members of an array for usage in DB query statement.
$data
$r
Definition: example_031.php:79
global $ilBench
Definition: ilias.php:18
domxml_open_mem($str, $mode=DOMXML_LOAD_PARSING, &$error=NULL)
redirection script todo: (a better solution should control the processing via a xml file)
global $ilDB