ILIAS  Release_4_0_x_branch Revision 61816
 All Data Structures Namespaces Files Functions Variables Groups Pages
class.ilPCTable.php
Go to the documentation of this file.
1 <?php
2 /*
3  +-----------------------------------------------------------------------------+
4  | ILIAS open source |
5  +-----------------------------------------------------------------------------+
6  | Copyright (c) 1998-2008 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 require_once("./Services/COPage/classes/class.ilPageContent.php");
25 
36 class ilPCTable extends ilPageContent
37 {
38  var $dom;
39  var $tab_node;
40 
41 
45  function init()
46  {
47  $this->setType("tab");
48  }
49 
50  function setNode(&$a_node)
51  {
52  parent::setNode($a_node); // this is the PageContent node
53  $this->tab_node =& $a_node->first_child(); // this is the Table node
54  }
55 
56  function create(&$a_pg_obj, $a_hier_id, $a_pc_id = "")
57  {
58  $this->node = $this->createPageContentNode();
59  $a_pg_obj->insertContent($this, $a_hier_id, IL_INSERT_AFTER, $a_pc_id);
60  $this->tab_node =& $this->dom->create_element("Table");
61  $this->tab_node =& $this->node->append_child($this->tab_node);
62  $this->tab_node->set_attribute("Language", "");
63  }
64 
65  function &addRow () {
66  $new_tr =& $this->dom->create_element("TableRow");
67  $new_tr = &$this->tab_node->append_child($new_tr);
68  return $new_tr;
69  }
70 
71  function &addCell (&$aRow, $a_data = "", $a_lang = "")
72  {
73  $new_td =& $this->dom->create_element("TableData");
74  $new_td =& $aRow->append_child($new_td);
75 
76  // insert data if given
77  if ($a_data != "")
78  {
79  $new_pg =& $this->createPageContentNode(false);
80  $new_par =& $this->dom->create_element("Paragraph");
81  $new_par =& $new_pg->append_child($new_par);
82  $new_par->set_attribute("Language", $a_lang);
83  $new_par->set_attribute("Characteristic", "TableContent");
84  $new_par->set_content($a_data);
85  $new_td->append_child ($new_pg);
86  }
87 
88  return $new_td;
89  }
90 
94  function addRows($a_nr_rows, $a_nr_cols)
95  {
96  for ($i=1; $i<=$a_nr_rows; $i++)
97  {
98  $aRow = $this->addRow();
99  for ($j=1; $j<=$a_nr_cols; $j++)
100  {
101  $this->addCell($aRow);
102  }
103  }
104  }
105 
109  function importSpreadsheet($a_lang, $a_data)
110  {
111  str_replace($a_data, "\r", "\n");
112  str_replace($a_data, "\n\n", "\n");
113  $target_rows = array();
114  $rows = explode("\n", $a_data);
115 
116  // get maximum of cols in a row and
117  // put data in target_row arrays
118  foreach($rows as $row)
119  {
120  $cells = explode("\t", $row);
121  $max_cols = ($max_cols > count($cells))
122  ? $max_cols
123  : count($cells);
124  $target_rows[] = $cells;
125  }
126 
127  // iterate target row arrays and insert data
128  foreach($target_rows as $row)
129  {
130  $aRow = $this->addRow();
131  for ($j=0; $j<$max_cols; $j++)
132  {
133  // mask html
134  $data = str_replace("&","&amp;", $row[$j]);
135  $data = str_replace("<","&lt;", $data);
136  $data = str_replace(">","&gt;", $data);
137 
138  $this->addCell($aRow, $data, $a_lang);
139  }
140  }
141  }
142 
146  function getLanguage()
147  {
148  return $this->getTableAttribute("Language");
149  }
150 
156  function setLanguage($a_lang)
157  {
158  if($a_lang != "")
159  {
160  $this->setTableAttribute("Language", $a_lang);
161  }
162  }
163 
167  function getWidth()
168  {
169  return $this->getTableAttribute("Width");
170  }
171 
177  function setWidth($a_width)
178  {
179  $this->setTableAttribute("Width", $a_width);
180  }
181 
185  function getBorder()
186  {
187  return $this->getTableAttribute("Border");
188  }
189 
195  function setBorder($a_border)
196  {
197  $this->setTableAttribute("Border", $a_border);
198  }
199 
203  function getCellSpacing()
204  {
205  return $this->getTableAttribute("CellSpacing");
206  }
207 
213  function setCellSpacing($a_spacing)
214  {
215  $this->setTableAttribute("CellSpacing", $a_spacing);
216  }
217 
221  function getCellPadding()
222  {
223  return $this->getTableAttribute("CellPadding");
224  }
225 
231  function setCellPadding($a_padding)
232  {
233  $this->setTableAttribute("CellPadding", $a_padding);
234  }
235 
239  function setHorizontalAlign($a_halign)
240  {
241  $this->tab_node->set_attribute("HorizontalAlign", $a_halign);
242  }
243 
248  {
249  return $this->getTableAttribute("HorizontalAlign");
250  }
251 
255  function setTDWidth($a_hier_id, $a_width, $a_pc_id = "")
256  {
257  $xpc = xpath_new_context($this->dom);
258 
259  if ($a_pc_id == "")
260  {
261  $path = "//TableData[@HierId = '".$a_hier_id."']";
262  }
263  else
264  {
265  $path = "//TableData[@PCID = '".$a_pc_id."']";
266  }
267  $res =& xpath_eval($xpc, $path);
268 
269  if (count($res->nodeset) == 1)
270  {
271  if($a_width != "")
272  {
273  $res->nodeset[0]->set_attribute("Width", $a_width);
274  }
275  else
276  {
277  if ($res->nodeset[0]->has_attribute("Width"))
278  {
279  $res->nodeset[0]->remove_attribute("Width");
280  }
281  }
282  }
283  }
284 
288  function setTDSpans($a_colspans, $a_rowspans)
289  {
290  $y = 0;
291  $rows = $this->tab_node->child_nodes();
292  foreach($rows as $row)
293  {
294  if ($row->node_name() == "TableRow")
295  {
296  $x = 0;
297  $cells = $row->child_nodes();
298  foreach($cells as $cell)
299  {
300  if ($cell->node_name() == "TableData")
301  {
302  $ckey = $cell->get_attribute("HierId").":".$cell->get_attribute("PCID");
303  if((int) $a_colspans[$ckey] > 1)
304  {
305  $cell->set_attribute("ColSpan", (int) $a_colspans[$ckey]);
306  }
307  else
308  {
309  if ($cell->has_attribute("ColSpan"))
310  {
311  $cell->remove_attribute("ColSpan");
312  }
313  }
314  if((int) $a_rowspans[$ckey] > 1)
315  {
316  $cell->set_attribute("RowSpan", (int) $a_rowspans[$ckey]);
317  }
318  else
319  {
320  if ($cell->has_attribute("RowSpan"))
321  {
322  $cell->remove_attribute("RowSpan");
323  }
324  }
325  }
326  $x++;
327  }
328  $y++;
329  }
330  }
331  $this->fixHideAndSpans();
332  }
333 
339  function fixHideAndSpans()
340  {
341 
342  // first: get max x and y
343  $max_x = $max_y = 0;
344  $y = 0;
345  $rows = $this->tab_node->child_nodes();
346 
347  foreach($rows as $row)
348  {
349  if ($row->node_name() == "TableRow")
350  {
351  $x = 0;
352  $cells = $row->child_nodes();
353  foreach($cells as $cell)
354  {
355  if ($cell->node_name() == "TableData")
356  {
357  $max_x = max ($max_x, $x);
358  $max_y = max ($max_y, $y);
359  }
360  $x++;
361  }
362  $y++;
363  }
364  }
365 
366  // second: fix hidden/colspans for all cells
367  $y = 0;
368  $rows = $this->tab_node->child_nodes();
369  foreach($rows as $row)
370  {
371  if ($row->node_name() == "TableRow")
372  {
373  $x = 0;
374  $cells = $row->child_nodes();
375  foreach($cells as $cell)
376  {
377  if ($cell->node_name() == "TableData")
378  {
379  $cspan = max(1, (int) $cell->get_attribute("ColSpan"));
380  $rspan = max(1, (int) $cell->get_attribute("RowSpan"));
381 
382  // if col or rowspan is to high: reduce it to the max
383  if ($cspan > $max_x - $x + 1)
384  {
385  $cell->set_attribute("ColSpan", $max_x - $x + 1);
386  $cspan = $max_x - $x + 1;
387  }
388  if ($rspan > $max_y - $y + 1)
389  {
390  $cell->set_attribute("RowSpan", $max_y - $y + 1);
391  $rspan = $max_y - $y + 1;
392  }
393 
394  // check hidden status
395  if ($this->checkCellHidden($colspans, $rowspans, $x, $y))
396  {
397  // hidden: set hidden flag, remove col and rowspan
398  $cell->set_attribute("Hidden", "Y");
399  $cspan = 1;
400  $rspan = 1;
401  if ($cell->has_attribute("ColSpan"))
402  {
403  $cell->remove_attribute("ColSpan");
404  }
405  if ($cell->has_attribute("RowSpan"))
406  {
407  $cell->remove_attribute("RowSpan");
408  }
409  $this->makeEmptyCell($cell);
410  }
411  else
412  {
413  // not hidden: remove hidden flag if existing
414  if ($cell->has_attribute("Hidden"))
415  {
416  $cell->remove_attribute("Hidden");
417  }
418  }
419 
420  $colspans[$x][$y] = $cspan;
421  $rowspans[$x][$y] = $rspan;
422  }
423  $x++;
424  }
425  $y++;
426  }
427  }
428 
429  }
430 
431 
435  function makeEmptyCell($td_node)
436  {
437  // delete children of paragraph node
438  $children = $td_node->child_nodes();
439  for($i=0; $i<count($children); $i++)
440  {
441  $td_node->remove_child($children[$i]);
442  }
443  }
444 
448  function checkCellHidden($colspans, $rowspans, $x, $y)
449  {
450  for ($i = 0; $i<=$x; $i++)
451  {
452  for ($j = 0; $j<=$y; $j++)
453  {
454  if ($i != $x || $j != $y)
455  {
456  if ((($i + $colspans[$i][$j] > $x) &&
457  ($j + $rowspans[$i][$j] > $y)))
458  {
459  return true;
460  }
461  }
462  }
463  }
464  return false;
465  }
466 
472  function getAllCellClasses()
473  {
474  $classes = array();
475  $rows = $this->tab_node->child_nodes();
476  foreach($rows as $row)
477  {
478  if ($row->node_name() == "TableRow")
479  {
480  $cells = $row->child_nodes();
481  foreach($cells as $cell)
482  {
483  if ($cell->node_name() == "TableData")
484  {
485  $classes[$cell->get_attribute("HierId").":".$cell->get_attribute("PCID")]
486  = $cell->get_attribute("Class");
487  }
488  }
489  }
490  }
491 
492  return $classes;
493  }
494 
495 
501  function getAllCellSpans()
502  {
503  $spans = array();
504  $rows = $this->tab_node->child_nodes();
505  $y = 0;
506  $max_x = 0;
507  $max_y = 0;
508  foreach($rows as $row)
509  {
510  if ($row->node_name() == "TableRow")
511  {
512  $x = 0;
513  $cells = $row->child_nodes();
514  foreach($cells as $cell)
515  {
516  if ($cell->node_name() == "TableData")
517  {
518  $spans[$cell->get_attribute("HierId").":".$cell->get_attribute("PCID")]
519  = array("x" => $x, "y" => $y, "colspan" => $cell->get_attribute("ColSpan"),
520  "rowspan" => $cell->get_attribute("RowSpan"));
521  $max_x = max($max_x, $x);
522  $max_y = max($max_y, $y);
523  }
524  $x++;
525  }
526  $y++;
527  }
528  }
529  foreach ($spans as $k => $v)
530  {
531  $spans[$k]["max_x"] = $max_x;
532  $spans[$k]["max_y"] = $max_y;
533  }
534 
535  return $spans;
536  }
537 
543  function getAllCellWidths()
544  {
545  $widths = array();
546  $rows = $this->tab_node->child_nodes();
547  foreach($rows as $row)
548  {
549  if ($row->node_name() == "TableRow")
550  {
551  $cells = $row->child_nodes();
552  foreach($cells as $cell)
553  {
554  if ($cell->node_name() == "TableData")
555  {
556  $widths[$cell->get_attribute("HierId").":".$cell->get_attribute("PCID")]
557  = $cell->get_attribute("Width");
558  }
559  }
560  }
561  }
562 
563  return $widths;
564  }
565 
569  function setTDClass($a_hier_id, $a_class, $a_pc_id = "")
570  {
571  $xpc = xpath_new_context($this->dom);
572  if ($a_pc_id == "")
573  {
574  $path = "//TableData[@HierId = '".$a_hier_id."']";
575  }
576  else
577  {
578  $path = "//TableData[@PCID = '".$a_pc_id."']";
579  }
580  $res =& xpath_eval($xpc, $path);
581  if (count($res->nodeset) == 1)
582  {
583  if($a_class != "")
584  {
585  $res->nodeset[0]->set_attribute("Class", $a_class);
586  }
587  else
588  {
589  if ($res->nodeset[0]->has_attribute("Class"))
590  {
591  $res->nodeset[0]->remove_attribute("Class");
592  }
593  }
594  }
595  }
596 
600  function getCaption()
601  {
602  $hier_id = $this->getHierId();
603  if(!empty($hier_id))
604  {
605  $xpc = xpath_new_context($this->dom);
606  $path = "//PageContent[@HierId = '".$hier_id."']/Table/Caption";
607  $res =& xpath_eval($xpc, $path);
608 
609  if (count($res->nodeset) == 1)
610  {
611  return $res->nodeset[0]->get_content();
612  }
613  }
614  }
615 
619  function getCaptionAlign()
620  {
621  $hier_id = $this->getHierId();
622  if(!empty($hier_id))
623  {
624  $xpc = xpath_new_context($this->dom);
625  $path = "//PageContent[@HierId = '".$hier_id."']/Table/Caption";
626  $res =& xpath_eval($xpc, $path);
627  if (count($res->nodeset) == 1)
628  {
629  return $res->nodeset[0]->get_attribute("Align");
630  }
631  }
632  }
633 
637  function setCaption($a_content, $a_align)
638  {
639  if ($a_content != "")
640  {
641  ilDOMUtil::setFirstOptionalElement($this->dom, $this->tab_node, "Caption",
642  array("Summary", "TableRow"), $a_content,
643  array("Align" => $a_align));
644  }
645  else
646  {
647  ilDOMUtil::deleteAllChildsByName($this->tab_node, array("Caption"));
648  }
649  }
650 
651 
653  /*echo "importing table attributes";
654  var_dump($tableNode);*/
655  if ($node->has_attributes ())
656  {
657  foreach($node->attributes() as $n)
658  {
659 
660  switch (strtolower($n->node_name ())) {
661  case "border":
662  $this->setBorder ($this->extractText($n));
663  break;
664  case "align":
665  $this->setHorizontalAlign(ucfirst(strtolower($this->extractText($n))));
666  break;
667  case "cellspacing":
668  $this->setCellSpacing($this->extractText($n));
669  break;
670  case "cellpadding":
671  $this->setCellPadding($this->extractText($n));
672  break;
673  case "width":
674  $this->setWidth($this->extractText($n));
675  break;
676 
677  }
678 
679  }
680  }
681  }
682 
683 
684  function importCellAttributes (&$node, &$par) {
685  /*echo "importing table attributes";
686  var_dump($tableNode);*/
687  if ($node->has_attributes ())
688  {
689  foreach($node->attributes() as $n)
690  {
691 
692  switch (strtolower($n->node_name ())) {
693  case "class":
694  $par->set_attribute("Class", $this->extractText($n));
695  break;
696  case "width":
697  $par->set_attribute("Width", $this->extractText($n));
698  break;
699  }
700 
701  }
702  }
703  }
704 
705 
706  function importRow ($lng, &$node) {
707  /*echo "add Row";
708  var_dump($node);*/
709 
710  $aRow = $this->addRow();
711 
712  if ($node->has_child_nodes())
713  {
714  foreach($node->child_nodes() as $n)
715  {
716  if ($n->node_type() == XML_ELEMENT_NODE &&
717  strcasecmp($n->node_name (), "td") == 0)
718  {
719  $this->importCell ($lng, $n, $aRow);
720  }
721  }
722  }
723  }
724 
725  function importCell ($lng, &$cellNode, &$aRow) {
726  /*echo "add Cell";
727  var_dump($cellNode);*/
728  $aCell = $this->addCell($aRow);
729  $par = new ilPCParagraph($this->dom);
730  $par->createAtNode($aCell);
731  $par->setText($par->input2xml($this->extractText ($cellNode)));
732  $par->setCharacteristic("TableContent");
733  $par->setLanguage($lng);
734  $this->importCellAttributes($cellNode, $aCell);
735  }
736 
737  function extractText (&$node) {
738  $owner_document = $node->owner_document ();
739  $children = $node->child_nodes();
740  $total_children = count($children);
741  for ($i = 0; $i < $total_children; $i++){
742  $cur_child_node = $children[$i];
743  $output .= $owner_document->dump_node($cur_child_node);
744  }
745  return $output;
746  }
747 
748  function importHtml ($lng, $htmlTable) {
749  $dummy = ilUtil::stripSlashes($htmlTable, false);
750  //echo htmlentities($dummy);
752 
753  if ($dom)
754  {
755  $xpc = @xpath_new_context($dom);
756  // extract first table object
757  $path = "//table[1] | //Table[1]";
758  $res = @xpath_eval($xpc, $path);
759 
760  if (count($res->nodeset) == 0)
761  {
762  $error = "Could not find a table root node";
763  }
764 
765  if (empty ($error))
766  {
767  for($i = 0; $i < count($res->nodeset); $i++)
768  {
769  $node = $res->nodeset[$i];
770 
771  $this->importTableAttributes ($node);
772 
773  if ($node->has_child_nodes())
774  {
775  foreach($node->child_nodes() as $n)
776  {
777  if ($n->node_type() == XML_ELEMENT_NODE &&
778  strcasecmp($n->node_name (), "tr") == 0)
779  {
780 
781  $this->importRow ($lng, $n);
782  }
783  }
784  }
785  }
786  }
787  $dom->free ();
788  }
789  if (is_array($error)) {
790  $errmsg = "";
791  foreach ($error as $errorline) { # Loop through all errors
792  $errmsg .= "[" . $errorline['line'] . ", " . $errorline['col'] . "]: ".$errorline['errormessage']." at Node '". $errorline['nodename'] . "'<br />";
793  }
794  }else
795  {
796  $errmsg = $error;
797  }
798 
799  if (empty ($errmsg)) {
800  return true;
801  }
802 
803  $_SESSION["message"] = $errmsg;
804  return false;
805  }
806 
810  function setFirstRowStyle($a_class)
811  {
812  $childs = $this->tab_node->child_nodes();
813  foreach($childs as $child)
814  {
815  if ($child->node_name() == "TableRow")
816  {
817  $gchilds = $child->child_nodes();
818  foreach($gchilds as $gchild)
819  {
820  if ($gchild->node_name() == "TableData")
821  {
822  $gchild->set_attribute("Class", $a_class);
823  }
824  }
825  return;
826  }
827  }
828  }
829 
835  function setClass($a_class)
836  {
837  $this->setTableAttribute("Class", $a_class);
838  }
839 
845  function getClass()
846  {
847  return $this->getTableAttribute("Class");
848  }
849 
855  function setTemplate($a_template)
856  {
857  $this->setTableAttribute("Template", $a_template);
858  }
859 
865  function getTemplate()
866  {
867  return $this->getTableAttribute("Template");
868  }
869 
875  function setHeaderRows($a_nr)
876  {
877  $this->setTableAttribute("HeaderRows", $a_nr);
878  }
879 
885  function getHeaderRows()
886  {
887  return $this->getTableAttribute("HeaderRows");
888  }
889 
895  function setFooterRows($a_nr)
896  {
897  $this->setTableAttribute("FooterRows", $a_nr);
898  }
899 
905  function getFooterRows()
906  {
907  return $this->getTableAttribute("FooterRows");
908  }
909 
915  function setHeaderCols($a_nr)
916  {
917  $this->setTableAttribute("HeaderCols", $a_nr);
918  }
919 
925  function getHeaderCols()
926  {
927  return $this->getTableAttribute("HeaderCols");
928  }
929 
935  function setFooterCols($a_nr)
936  {
937  $this->setTableAttribute("FooterCols", $a_nr);
938  }
939 
945  function getFooterCols()
946  {
947  return $this->getTableAttribute("FooterCols");
948  }
949 
956  protected function setTableAttribute($a_attr, $a_value)
957  {
958  if (!empty($a_value))
959  {
960  $this->tab_node->set_attribute($a_attr, $a_value);
961  }
962  else
963  {
964  if ($this->tab_node->has_attribute($a_attr))
965  {
966  $this->tab_node->remove_attribute($a_attr);
967  }
968  }
969  }
970 
976  function getTableAttribute($a_attr)
977  {
978  if (is_object($this->tab_node))
979  {
980  return $this->tab_node->get_attribute($a_attr);
981  }
982  }
983 
984 }
985 
986 ?>