ILIAS  release_5-3 Revision v5.3.23-19-g915713cf615
class.ilLMPageObject.php
Go to the documentation of this file.
1 <?php
2 
3 /* Copyright (c) 1998-2010 ILIAS open source, Extended GPL, see docs/LICENSE */
4 
5 require_once("./Modules/LearningModule/classes/class.ilLMObject.php");
6 require_once("./Modules/LearningModule/classes/class.ilLMPage.php");
7 
8 define("IL_CHAPTER_TITLE", "st_title");
9 define("IL_PAGE_TITLE", "pg_title");
10 define("IL_NO_HEADER", "none");
11 
30 {
31  public $is_alias;
32  public $origin_id;
33  public $id;
34  public $dom;
35  public $page_object;
36 
41  public function __construct(&$a_content_obj, $a_id = 0, $a_halt = true)
42  {
43  parent::__construct($a_content_obj, $a_id);
44  $this->setType("pg");
45  $this->id = $a_id;
46 
47  $this->is_alias = false;
48  $this->contains_int_link = false;
49  $this->mobs_contained = array();
50  $this->files_contained = array();
51  $this->halt_on_error = $a_halt;
52 
53  if ($a_id != 0) {
54  $this->read();
55  }
56  }
57 
58  public function __desctruct()
59  {
60  if (is_object($this->page_object)) {
61  unset($this->page_object);
62  }
63  }
64 
68  public function read()
69  {
70  parent::read();
71 
72  $this->page_object = new ilLMPage($this->id, 0);
73  }
74 
75  public function create($a_upload = false, $a_omit_page_object_creation = false)
76  {
77  parent::create($a_upload);
78  if ($a_omit_page_object_creation) {
79  return;
80  }
81  if (!is_object($this->page_object)) {
82  $this->page_object = new ilLMPage();
83  }
84  $this->page_object->setId($this->getId());
85  $this->page_object->setParentId($this->getLMId());
86  $this->page_object->create($a_upload);
87  }
88 
89  public function delete($a_delete_meta_data = true)
90  {
91  parent::delete($a_delete_meta_data);
92  $this->page_object->delete();
93  }
94 
95 
99  public function copy($a_target_lm)
100  {
101  // copy page
102  $lm_page = new ilLMPageObject($a_target_lm);
103  $lm_page->setTitle($this->getTitle());
104  $lm_page->setShortTitle($this->getShortTitle());
105  $lm_page->setLayout($this->getLayout());
106  $lm_page->setLMId($a_target_lm->getId());
107  $lm_page->setType($this->getType());
108  $lm_page->setDescription($this->getDescription());
109  $lm_page->setImportId("il__pg_" . $this->getId());
110  $lm_page->create(true); // setting "upload" flag to true prevents creating of meta data
111 
112  // check whether export id already exists in the target lm
113  $del_exp_id = false;
114  $exp_id = ilLMPageObject::getExportId($this->getLMId(), $this->getId());
115  if (trim($exp_id) != "") {
116  if (ilLMPageObject::existsExportID($a_target_lm->getId(), $exp_id)) {
117  $del_exp_id = true;
118  }
119  }
120 
121  // copy meta data
122  include_once("Services/MetaData/classes/class.ilMD.php");
123  $md = new ilMD($this->getLMId(), $this->getId(), $this->getType());
124  $new_md = $md->cloneMD($a_target_lm->getId(), $lm_page->getId(), $this->getType());
125 
126  // check whether export id already exists in the target lm
127  if ($del_exp_id) {
128  ilLMPageObject::saveExportId($a_target_lm->getId(), $lm_page->getId(), "");
129  } else {
131  $a_target_lm->getId(),
132  $lm_page->getId(),
133  trim($exp_id)
134  );
135  }
136 
137  // copy page content and activation
138  $page = $lm_page->getPageObject();
139  $this->page_object->copy($page->getId(), $page->getParentType(), $page->getParentId());
140  /*$page->setXMLContent($this->page_object->copyXMLContent());
141  $page->setActive($this->page_object->getActive());
142  $page->setActivationStart($this->page_object->getActivationStart());
143  $page->setActivationEnd($this->page_object->getActivationEnd());
144  $page->buildDom();
145  $page->update();*/
146  $lm_page->read(); // this gets the updated page object into lm page
147 
148  // copy translations
149  include_once("./Modules/LearningModule/classes/class.ilLMObjTranslation.php");
150  ilLMObjTranslation::copy($this->getId(), $lm_page->getId());
151 
152  return $lm_page;
153  }
154 
158  public function &copyToOtherContObject(&$a_cont_obj, &$a_copied_nodes)
159  {
160  // copy page
161  $lm_page = new ilLMPageObject($a_cont_obj);
162  $lm_page->setTitle($this->getTitle());
163  $lm_page->setShortTitle($this->getShortTitle());
164  $lm_page->setLMId($a_cont_obj->getId());
165  $lm_page->setImportId("il__pg_" . $this->getId());
166  $lm_page->setType($this->getType());
167  $lm_page->setDescription($this->getDescription());
168  $lm_page->create(true); // setting "upload" flag to true prevents creating of meta data
169  $a_copied_nodes[$this->getId()] = $lm_page->getId();
170 
171  // copy meta data
172  include_once("Services/MetaData/classes/class.ilMD.php");
173  $md = new ilMD($this->getLMId(), $this->getId(), $this->getType());
174  $new_md = $md->cloneMD($a_cont_obj->getId(), $lm_page->getId(), $this->getType());
175 
176  // copy page content
177  $page = $lm_page->getPageObject();
178  $page->setXMLContent($this->page_object->getXMLContent());
179  $page->buildDom();
180  $page->update();
181 
182  return $lm_page;
183  }
184 
192  public static function _splitPage($a_page_id, $a_pg_parent_type, $a_hier_id)
193  {
194  // get content object (learning module / digilib book)
195  $lm_id = ilLMObject::_lookupContObjID($a_page_id);
197  include_once("./Modules/LearningModule/classes/class.ilObjLearningModule.php");
198  $cont_obj = new ilObjLearningModule($lm_id, false);
199  $source_lm_page = new ilLMPageObject($cont_obj, $a_page_id);
200 
201  // create new page
202  $lm_page = new ilLMPageObject($cont_obj);
203  $lm_page->setTitle($source_lm_page->getTitle());
204  $lm_page->setLMId($source_lm_page->getLMId());
205  $lm_page->setType($source_lm_page->getType());
206  $lm_page->setDescription($source_lm_page->getDescription());
207  $lm_page->create(true);
208 
209 
210  // copy complete content of source page to new page
211  $source_page = $source_lm_page->getPageObject();
212  $page = $lm_page->getPageObject();
213  $page->setXMLContent($source_page->copyXMLContent());
214  //echo htmlentities($source_page->copyXMLContent());
215  $page->buildDom(true);
216  $page->update();
217  // echo "-".$page->getId()."-".$page->getParentType()."-";
218 
219  // copy meta data
220  include_once("Services/MetaData/classes/class.ilMD.php");
221  $md = new ilMD($source_lm_page->getLMId(), $a_page_id, $source_lm_page->getType());
222  $md->cloneMD($source_lm_page->getLMId(), $lm_page->getId(), $source_lm_page->getType());
223 
224  // insert new page in tree (after original page)
225  $tree = new ilTree($cont_obj->getId());
226  $tree->setTableNames('lm_tree', 'lm_data');
227  $tree->setTreeTablePK("lm_id");
228  if ($tree->isInTree($source_lm_page->getId())) {
229  $parent_node = $tree->getParentNodeData($source_lm_page->getId());
230  $tree->insertNode($lm_page->getId(), $parent_node["child"], $source_lm_page->getId());
231  }
232 
233  // remove all nodes < hierarchical id from new page (incl. update)
234  $page->addHierIds();
235  $page->deleteContentBeforeHierId($a_hier_id);
236  // $page->update();
237 
238  // remove all nodes >= hierarchical id from source page
239  $source_page->buildDom();
240  $source_page->addHierIds();
241  $source_page->deleteContentFromHierId($a_hier_id);
242 
243  return $lm_page;
244  }
245 
253  public static function _splitPageNext($a_page_id, $a_pg_parent_type, $a_hier_id)
254  {
255  // get content object (learning module / digilib book)
256  $lm_id = ilLMObject::_lookupContObjID($a_page_id);
258  include_once("./Modules/LearningModule/classes/class.ilObjLearningModule.php");
259  $cont_obj = new ilObjLearningModule($lm_id, false);
260  $tree = new ilTree($cont_obj->getId());
261  $tree->setTableNames('lm_tree', 'lm_data');
262  $tree->setTreeTablePK("lm_id");
263 
264  $source_lm_page = new ilLMPageObject($cont_obj, $a_page_id);
265  $source_page = $source_lm_page->getPageObject();
266 
267  // get next page
268  $succ = $tree->fetchSuccessorNode($a_page_id, "pg");
269  if ($succ["child"] > 0) {
270  $target_lm_page = new ilLMPageObject($cont_obj, $succ["child"]);
271  $target_page = $target_lm_page->getPageObject();
272  $target_page->buildDom();
273  $target_page->addHierIds();
274 
275  // move nodes to target page
276  $source_page->buildDom();
277  $source_page->addHierIds();
278  ilLMPage::_moveContentAfterHierId($source_page, $target_page, $a_hier_id);
279  //$source_page->deleteContentFromHierId($a_hier_id);
280 
281  return $succ["child"];
282  }
283  }
284 
285 
291  public function assignPageObject(&$a_page_obj)
292  {
293  $this->page_object = $a_page_obj;
294  }
295 
296 
302  public function &getPageObject()
303  {
304  return $this->page_object;
305  }
306 
307 
311  public function setId($a_id)
312  {
313  $this->id = $a_id;
314  }
315 
316  public function getId()
317  {
318  return $this->id;
319  }
320 
324  public function setAlias($a_is_alias)
325  {
326  $this->is_alias = $a_is_alias;
327  }
328 
329  public function isAlias()
330  {
331  return $this->is_alias;
332  }
333 
334  // only for page aliases
335  public function setOriginID($a_id)
336  {
337  return $this->origin_id = $a_id;
338  }
339 
340  // only for page aliases
341  public function getOriginID()
342  {
343  return $this->origin_id;
344  }
345 
349  public static function getPageList($lm_id)
350  {
351  return ilLMObject::getObjectList($lm_id, "pg");
352  }
353 
357  public static function getPagesWithLinksList($a_lm_id, $a_par_type)
358  {
359  $pages = ilLMPageObject::getPageList($a_lm_id);
360  $ids = array();
361  foreach ($pages as $page) {
362  $ids[] = $page["obj_id"];
363  }
364 
365  $linked_pages = ilLMPage::getPagesWithLinks($a_par_type, $a_lm_id);
366  $result = array();
367  foreach ($pages as $page) {
368  if (is_array($linked_pages[$page["obj_id"]])) {
369  $result[] = $page;
370  }
371  }
372  return $result;
373  }
374 
381  public static function _getPresentationTitle(
382  $a_pg_id,
383  $a_mode = IL_CHAPTER_TITLE,
384  $a_include_numbers = false,
385  $a_time_scheduled_activation = false,
386  $a_force_content = false,
387  $a_lm_id = 0,
388  $a_lang = "-",
389  $a_include_short = false
390  ) {
391  if ($a_mode == IL_NO_HEADER && !$a_force_content) {
392  return "";
393  }
394 
395  if ($a_lm_id == 0) {
396  $a_lm_id = ilLMObject::_lookupContObjID($a_pg_id);
397  }
398 
399  if ($a_lm_id == 0) {
400  return "";
401  }
402 
403  // this is optimized when ilLMObject::preloadDataByLM is invoked (e.g. done in ilLMExplorerGUI)
404  $title = "";
405  if ($a_include_short) {
406  $title = trim(ilLMObject::_lookupShortTitle($a_pg_id));
407  }
408  if ($title == "") {
409  $title = ilLMObject::_lookupTitle($a_pg_id);
410  }
411 
412  // this is also optimized since ilObjectTranslation re-uses instances for one lm
413  include_once("./Services/Object/classes/class.ilObjectTranslation.php");
414  $ot = ilObjectTranslation::getInstance($a_lm_id);
415  $languages = $ot->getLanguages();
416 
417  if ($a_lang != "-" && $ot->getContentActivated() && isset($languages[$a_lang])) {
418  include_once("./Modules/LearningModule/classes/class.ilLMObjTranslation.php");
419  $lmobjtrans = new ilLMObjTranslation($a_pg_id, $a_lang);
420  $trans_title = "";
421  if ($a_include_short) {
422  $trans_title = trim($lmobjtrans->getShortTitle());
423  }
424  if ($trans_title == "") {
425  $trans_title = $lmobjtrans->getTitle();
426  }
427  if ($trans_title != "") {
428  $title = $trans_title;
429  }
430  }
431 
432  if ($a_mode == IL_PAGE_TITLE) {
433  return $title;
434  }
435 
436  include_once("./Modules/LearningModule/classes/class.ilLMTree.php");
437  $tree = ilLMTree::getInstance($a_lm_id);
438 
439  if ($tree->isInTree($a_pg_id)) {
440  $pred_node = $tree->fetchPredecessorNode($a_pg_id, "st");
441  $childs = $tree->getChildsByType($pred_node["obj_id"], "pg");
442  $cnt_str = "";
443  if (count($childs) > 1) {
444  $cnt = 0;
445  foreach ($childs as $child) {
446  include_once("./Modules/LearningModule/classes/class.ilLMPage.php");
448  $child["obj_id"],
449  ilObject::_lookupType($a_lm_id),
450  $a_time_scheduled_activation
451  );
452 
453  if (!$active) {
454  $act_data = ilLMPage::_lookupActivationData((int) $child["obj_id"], ilObject::_lookupType($a_lm_id));
455  if ($act_data["show_activation_info"] &&
456  (ilUtil::now() < $act_data["activation_start"])) {
457  $active = true;
458  }
459  }
460 
461  if ($child["type"] != "pg" || $active) {
462  $cnt++;
463  }
464  if ($child["obj_id"] == $a_pg_id) {
465  $cur_cnt = $cnt;
466  }
467  }
468  if ($cnt > 1) {
469  $cnt_str = " (" . $cur_cnt . "/" . $cnt . ")";
470  }
471  }
472  require_once("./Modules/LearningModule/classes/class.ilStructureObject.php");
473  //$struct_obj = new ilStructureObject($pred_node["obj_id"]);
474  //return $struct_obj->getTitle();
476  $pred_node["obj_id"],
478  $a_include_numbers,
479  false,
480  false,
481  0,
482  $a_lang,
483  true
484  ) . $cnt_str;
485 
486  //return $pred_node["title"].$cnt_str;
487  } else {
488  return $title;
489  }
490  }
491 
498  public function exportXML(&$a_xml_writer, $a_mode = "normal", $a_inst = 0)
499  {
500  $attrs = array();
501  $a_xml_writer->xmlStartTag("PageObject", $attrs);
502 
503  switch ($a_mode) {
504  case "normal":
505  // MetaData
506  $this->exportXMLMetaData($a_xml_writer);
507 
508  // PageContent
509  $this->exportXMLPageContent($a_xml_writer, $a_inst);
510  break;
511 
512  case "alias":
513  $attrs = array();
514  $attrs["OriginId"] = "il_" . $a_inst .
515  "_pg_" . $this->getId();
516  $a_xml_writer->xmlElement("PageAlias", $attrs);
517  break;
518  }
519 
520  // Layout
521  // not implemented
522 
523  $a_xml_writer->xmlEndTag("PageObject");
524  }
525 
529  public static function _exportXMLAlias(&$a_xml_writer, $a_id, $a_inst = 0)
530  {
531  $attrs = array();
532  $a_xml_writer->xmlStartTag("PageObject", $attrs);
533 
534  $attrs = array();
535  $attrs["OriginId"] = "il_" . $a_inst .
536  "_pg_" . $a_id;
537  $a_xml_writer->xmlElement("PageAlias", $attrs);
538 
539  $a_xml_writer->xmlEndTag("PageObject");
540  }
541 
542 
549  public function exportXMLMetaData(&$a_xml_writer)
550  {
551  include_once("Services/MetaData/classes/class.ilMD2XML.php");
552  $md2xml = new ilMD2XML($this->getLMId(), $this->getId(), $this->getType());
553  $md2xml->setExportMode(true);
554  $md2xml->startExport();
555  $a_xml_writer->appendXML($md2xml->getXML());
556  }
557 
558  public function modifyExportIdentifier($a_tag, $a_param, $a_value)
559  {
560  if ($a_tag == "Identifier" && $a_param == "Entry") {
561  $a_value = "il_" . IL_INST_ID . "_pg_" . $this->getId();
562  //$a_value = ilUtil::insertInstIntoID($a_value);
563  }
564 
565  return $a_value;
566  }
567 
568 
575  public function exportXMLPageContent(&$a_xml_writer, $a_inst = 0)
576  {
577  //echo "exportxmlpagecontent:$a_inst:<br>";
578  $cont_obj = $this->getContentObject();
579 
580  $this->page_object->buildDom();
581  $this->page_object->insertInstIntoIDs($a_inst);
582  $this->mobs_contained = $this->page_object->collectMediaObjects(false);
583  //$this->files_contained = $this->page_object->collectFileItems();
584  include_once("./Services/COPage/classes/class.ilPCFileList.php");
585  $this->files_contained = ilPCFileList::collectFileItems($this->page_object, $this->page_object->getDomDoc());
586  // $this->questions_contained = $this->page_object->getQuestionIds();
587  $xml = $this->page_object->getXMLFromDom(false, false, false, "", true);
588  $xml = str_replace("&", "&amp;", $xml);
589  $a_xml_writer->appendXML($xml);
590 
591  $this->page_object->freeDom();
592  }
593 
599  public function getQuestionIds()
600  {
601  include_once("./Services/COPage/classes/class.ilPCQuestion.php");
603  $this->content_object->getType(),
604  $this->getId()
605  );
606  }
607 
613  public function getMediaObjectIds()
614  {
615  return $this->mobs_contained;
616  }
617 
623  public function getFileItemIds()
624  {
625  return $this->files_contained;
626  }
627 
634  public function exportFO(&$a_xml_writer)
635  {
637  if ($title != "") {
638  $attrs = array();
639  $attrs["font-family"] = "Times";
640  $attrs["font-size"] = "14pt";
641  $a_xml_writer->xmlElement("fo:block", $attrs, $title);
642  }
643 
644  // PageContent
645  $this->page_object->buildDom();
646  $fo = $this->page_object->getFO();
647  $a_xml_writer->appendXML($fo);
648  }
649 
656  public static function queryQuestionsOfLearningModule(
657  $a_lm_id,
658  $a_order_field,
659  $a_order_dir,
660  $a_offset,
661  $a_limit
662  ) {
663  global $DIC;
664 
665  $ilDB = $DIC->database();
666  $rbacreview = $DIC->rbac()->review();
667 
668 
669  // count query
670  $count_query = "SELECT count(pq.question_id) cnt ";
671 
672  // basic query
673  $query = "SELECT pq.page_id, pq.question_id ";
674 
675  $from = " FROM page_question pq JOIN lm_tree t ON (t.lm_id = " . $ilDB->quote($a_lm_id, "integer") .
676  " AND pq.page_id = t.child and pq.page_parent_type = " . $ilDB->quote("lm", "text") . ") " .
677  " WHERE t.lm_id = " . $ilDB->quote($a_lm_id, "integer");
678  $count_query.= $from;
679  $query.= $from;
680 
681 
682  // count query
683  $set = $ilDB->query($count_query);
684  $cnt = 0;
685  if ($rec = $ilDB->fetchAssoc($set)) {
686  $cnt = $rec["cnt"];
687  }
688 
689  $offset = (int) $a_offset;
690  $limit = (int) $a_limit;
691  if ($a_limit > 0) {
692  $ilDB->setLimit($limit, $offset);
693  }
694 
695  // set query
696  $set = $ilDB->query($query);
697  $result = array();
698  while ($rec = $ilDB->fetchAssoc($set)) {
699  $result[] = $rec;
700  }
701  return array("cnt" => $cnt, "set" => $result);
702  }
703 }
& cloneMD($a_rbac_id, $a_obj_id, $a_obj_type)
Definition: class.ilMD.php:326
getShortTitle()
get short title of lm object
& getPageObject()
get assigned page object
static saveExportId($a_lm_id, $a_lmobj_id, $a_exp_id, $a_type="pg")
Save export id.
Class ilObjLearningModule.
create($a_upload=false, $a_omit_page_object_creation=false)
modifyExportIdentifier($a_tag, $a_param, $a_value)
existsExportID($a_lm_id, $a_exp_id, $a_type="pg")
Does export ID exist in lm?
static _getQuestionIdsForPage($a_parent_type, $a_page_id, $a_lang="-")
Get all questions of a page.
exportXMLMetaData(&$a_xml_writer)
export page objects meta data to xml (see ilias_co.dtd)
$result
const IL_PAGE_TITLE
const IL_NO_HEADER
setType($a_type)
global $DIC
Definition: saml.php:7
getLayout()
Get layout.
static _lookupShortTitle($a_obj_id)
Lookup short title.
static getPagesWithLinks($a_parent_type, $a_parent_id, $a_lang="-")
Get all pages for parent object that contain internal links.
getQuestionIds()
Get question ids.
$from
assignPageObject(&$a_page_obj)
assign page object
static _lookupContObjID($a_id)
get learning module / digibook id for lm object
static _moveContentAfterHierId(&$a_source_page, &$a_target_page, $a_hid)
move content of hierarchical id >= $a_hid to other page
static _lookupTitle($a_obj_id)
Lookup title.
copy($a_target_lm)
copy page
exportFO(&$a_xml_writer)
export page object to fo
static now()
Return current timestamp in Y-m-d H:i:s format.
static _getPresentationTitle( $a_st_id, $a_mode=IL_CHAPTER_TITLE, $a_include_numbers=false, $a_time_scheduled_activation=false, $a_force_content=false, $a_lm_id=0, $a_lang="-", $a_include_short=false)
get presentation title
__construct(&$a_content_obj, $a_id=0, $a_halt=true)
Constructor public.
static _splitPage($a_page_id, $a_pg_parent_type, $a_hier_id)
split page at hierarchical id
$xml
Definition: metadata.php:240
exportXML(&$a_xml_writer, $a_mode="normal", $a_inst=0)
export page object to xml (see ilias_co.dtd)
Class ilLMPageObject.
static _lookupActive($a_id, $a_parent_type, $a_check_scheduled_activation=false, $a_lang="-")
lookup activation status
static _splitPageNext($a_page_id, $a_pg_parent_type, $a_hier_id)
split page to next page at hierarchical id
getFileItemIds()
get ids of all file items within the page
static collectFileItems($a_page, $a_domdoc)
Get all file items that are used within the page.
static getInstance($a_tree_id)
Get Instance.
& copyToOtherContObject(&$a_cont_obj, &$a_copied_nodes)
copy a page to another content object (learning module / dlib book)
static queryQuestionsOfLearningModule( $a_lm_id, $a_order_field, $a_order_dir, $a_offset, $a_limit)
Get questions of learning module.
setAlias($a_is_alias)
set wether page object is an alias
static getPagesWithLinksList($a_lm_id, $a_par_type)
Get all pages of lm that contain any internal links.
$query
setTableNames($a_table_tree, $a_table_obj_data, $a_table_obj_reference="")
set table names The primary key of the table containing your object_data must be &#39;obj_id&#39; You may use...
static getExportId($a_lm_id, $a_lmobj_id, $a_type="pg")
Get export ID.
Tree class data representation in hierachical trees using the Nested Set Model with Gaps by Joe Celco...
Create styles array
The data for the language used.
static _lookupType($a_id, $a_reference=false)
lookup object type
getMediaObjectIds()
get ids of all media objects within the page
static _lookupActivationData($a_id, $a_parent_type, $a_lang="-")
Lookup activation data.
getTitle()
get title of lm object
static _getPresentationTitle( $a_pg_id, $a_mode=IL_CHAPTER_TITLE, $a_include_numbers=false, $a_time_scheduled_activation=false, $a_force_content=false, $a_lm_id=0, $a_lang="-", $a_include_short=false)
presentation title doesn&#39;t have to be page title, it may be chapter title + page title or chapter tit...
static getInstance($a_obj_id)
Get instance.
global $ilDB
exportXMLPageContent(&$a_xml_writer, $a_inst=0)
export page objects meta data to xml (see ilias_co.dtd)
static _exportXMLAlias(&$a_xml_writer, $a_id, $a_inst=0)
export page alias to xml
const IL_CHAPTER_TITLE
static getObjectList($lm_id, $type="")
static
static getPageList($lm_id)
static
Translation information on lm object.
Class ilLMObject.
static copy($a_source_id, $a_target_id)
Copy all translations of an object.
Extension of ilPageObject for learning modules.