ILIAS  Release_4_1_x_branch Revision 61804
 All Data Structures Namespaces Files Functions Variables Groups Pages
class.ilWikiPage.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (c) 1998-2009 ILIAS open source, Extended GPL, see docs/LICENSE */
3 
4 include_once("./Services/COPage/classes/class.ilPageObject.php");
5 
14 class ilWikiPage extends ilPageObject
15 {
21  function __construct($a_id = 0, $a_old_nr = 0)
22  {
23  parent::__construct("wpg", $a_id, $a_old_nr);
24  }
25 
31  function setTitle($a_title)
32  {
33  $this->title = ilWikiUtil::makeDbTitle($a_title);
34  }
35 
41  function getTitle()
42  {
43  return $this->title;
44  }
45 
51  function setWikiId($a_wikiid)
52  {
53  $this->setParentId($a_wikiid);
54  }
55 
61  function getWikiId()
62  {
63  return $this->getParentId();
64  }
65 
71  function setWikiRefId($a_wiki_ref_id)
72  {
73  $this->parent_ref_id = $a_wiki_ref_id;
74  }
75 
81  function getWikiRefId()
82  {
83  return $this->parent_ref_id;
84  }
85 
89  function create($a_prevent_page_creation = false)
90  {
91  global $ilDB;
92 
93  $id = $ilDB->nextId("il_wiki_page");
94  $this->setId($id);
95  $query = "INSERT INTO il_wiki_page (".
96  "id".
97  ", title".
98  ", wiki_id".
99  " ) VALUES (".
100  $ilDB->quote($this->getId(), "integer")
101  .",".$ilDB->quote($this->getTitle(), "text")
102  .",".$ilDB->quote($this->getWikiId(), "integer")
103  .")";
104  $ilDB->manipulate($query);
105 
106  // create page object
107  if (!$a_prevent_page_creation)
108  {
109  parent::create();
110  $this->saveInternalLinks($this->getXMLContent());
111 
112  include_once "./Services/Notification/classes/class.ilNotification.php";
114  }
115  }
116 
123  function update($a_validate = true, $a_no_history = false)
124  {
125  global $ilDB;
126 
127  // update wiki page data
128  $query = "UPDATE il_wiki_page SET ".
129  " title = ".$ilDB->quote($this->getTitle(), "text").
130  ",wiki_id = ".$ilDB->quote($this->getWikiId(), "integer").
131  " WHERE id = ".$ilDB->quote($this->getId(), "integer");
132  $ilDB->manipulate($query);
133  parent::update($a_validate, $a_no_history);
134 
135  include_once "./Services/Notification/classes/class.ilNotification.php";
137 
138  return true;
139  }
140 
144  function read()
145  {
146  global $ilDB;
147 
148  $query = "SELECT * FROM il_wiki_page WHERE id = ".
149  $ilDB->quote($this->getId(), "integer");
150  $set = $ilDB->query($query);
151  $rec = $ilDB->fetchAssoc($set);
152 
153  $this->setTitle($rec["title"]);
154  $this->setWikiId($rec["wiki_id"]);
155 
156  // get co page
157  parent::read();
158  }
159 
160 
166  function delete()
167  {
168  global $ilDB;
169 
170  // get other pages that link to this page
171  $linking_pages = ilWikiPage::getLinksToPage($this->getWikiId(),
172  $this->getId());
173 
174  // delete internal links information to this page
175  include_once("./Services/COPage/classes/class.ilInternalLink.php");
177 
178  include_once "./Services/Notification/classes/class.ilNotification.php";
180 
181  // remove all notifications
182  include_once "./Services/Notification/classes/class.ilNotification.php";
184 
185  // delete comments and notes of this page
186  // (we keep them first)
187 
188  // delete record of table il_wiki_data
189  $query = "DELETE FROM il_wiki_page".
190  " WHERE id = ".$ilDB->quote($this->getId(), "integer");
191 
192  $ilDB->manipulate($query);
193 
194  // delete co page
195  parent::delete();
196 
197  // make links of other pages to this page a missing link
198  foreach($linking_pages as $lp)
199  {
200  $ilDB->manipulateF("DELETE FROM il_wiki_missing_page ".
201  " WHERE wiki_id = %s AND source_id = %s AND target_name = %s ",
202  array("integer", "integer", "text"),
203  array($this->getWikiId(), $lp["id"], $this->getTitle()));
204  $ilDB->manipulateF("INSERT INTO il_wiki_missing_page ".
205  "(wiki_id, source_id, target_name) VALUES ".
206  "(%s,%s,%s)",
207  array("integer", "integer", "text"),
208  array($this->getWikiId(), $lp["id"], $this->getTitle()));
209  }
210 
211  return true;
212  }
213 
219  static function deleteAllPagesOfWiki($a_wiki_id)
220  {
221  global $ilDB;
222 
223  // delete record of table il_wiki_data
224  $query = "SELECT * FROM il_wiki_page".
225  " WHERE wiki_id = ".$ilDB->quote($a_wiki_id, "integer");
226  $set = $ilDB->query($query);
227 
228  while($rec = $ilDB->fetchAssoc($set))
229  {
230  $wiki_page = new ilWikiPage($rec["id"]);
231  $wiki_page->delete();
232 
233 
234  }
235  }
236 
240  static function exists($a_wiki_id, $a_title)
241  {
242  global $ilDB;
243 
244  $a_title = ilWikiUtil::makeDbTitle($a_title);
245 
246  $query = "SELECT * FROM il_wiki_page".
247  " WHERE wiki_id = ".$ilDB->quote($a_wiki_id, "integer").
248  " AND title = ".$ilDB->quote($a_title, "text");
249  $set = $ilDB->query($query);
250  if($rec = $ilDB->fetchAssoc($set))
251  {
252  return true;
253  }
254 
255  return false;
256  }
257 
261  static function getPageIdForTitle($a_wiki_id, $a_title)
262  {
263  global $ilDB;
264 
265  $a_title = ilWikiUtil::makeDbTitle($a_title);
266 
267  $query = "SELECT * FROM il_wiki_page".
268  " WHERE wiki_id = ".$ilDB->quote($a_wiki_id, "integer").
269  " AND title = ".$ilDB->quote($a_title, "text");
270  $set = $ilDB->query($query);
271  if($rec = $ilDB->fetchAssoc($set))
272  {
273  return $rec["id"];
274  }
275 
276  return false;
277  }
278 
282  static function lookupTitle($a_page_id)
283  {
284  global $ilDB;
285 
286  $query = "SELECT * FROM il_wiki_page".
287  " WHERE id = ".$ilDB->quote($a_page_id, "integer");
288  $set = $ilDB->query($query);
289  if($rec = $ilDB->fetchAssoc($set))
290  {
291  return $rec["title"];
292  }
293 
294  return false;
295  }
296 
300  static function lookupWikiId($a_page_id)
301  {
302  global $ilDB;
303 
304  $query = "SELECT wiki_id FROM il_wiki_page".
305  " WHERE id = ".$ilDB->quote($a_page_id, "integer");
306  $set = $ilDB->query($query);
307  if ($rec = $ilDB->fetchAssoc($set))
308  {
309  return $rec["wiki_id"];
310  }
311 
312  return false;
313  }
314 
320  static function getAllPages($a_wiki_id)
321  {
322  global $ilDB;
323 
324  $pages = parent::getAllPages("wpg", $a_wiki_id);
325 
326  $query = "SELECT * FROM il_wiki_page".
327  " WHERE wiki_id = ".$ilDB->quote($a_wiki_id, "integer").
328  " ORDER BY title";
329  $set = $ilDB->query($query);
330 
331  $pg = array();
332  while($rec = $ilDB->fetchAssoc($set))
333  {
334  if (isset($pages[$rec["id"]]))
335  {
336  $pg[$rec["id"]] = $pages[$rec["id"]];
337  $pg[$rec["id"]]["title"] = $rec["title"];
338  }
339  }
340 
341  return $pg;
342  }
343 
347  static function getLinksToPage($a_wiki_id, $a_page_id)
348  {
349  global $ilDB;
350 
351  include_once("./Services/COPage/classes/class.ilInternalLink.php");
352  $sources = ilInternalLink::_getSourcesOfTarget("wpg", $a_page_id, 0);
353 
354  $ids = array();
355  foreach ($sources as $source)
356  {
357  if ($source["type"] == "wpg:pg")
358  {
359  $ids[] = $source["id"];
360  }
361  }
362  // get wiki page record
363  $query = "SELECT * FROM il_wiki_page wp, page_object p".
364  " WHERE ".$ilDB->in("wp.id", $ids, false, "integer").
365  " AND wp.id = p.page_id AND p.parent_type = ".$ilDB->quote("wpg", "text").
366  " AND wp.wiki_id = ".$ilDB->quote($a_wiki_id, "integer").
367  " ORDER BY title";
368  $set = $ilDB->query($query);
369 
370  $pages = array();
371  while ($rec = $ilDB->fetchAssoc($set))
372  {
373  $pages[] = array_merge($rec, array("user" => $rec["last_change_user"],
374  "date" => $rec["last_change"]));
375  }
376 
377  return $pages;
378  }
379 
385  static function getOrphanedPages($a_wiki_id)
386  {
387  global $ilDB;
388 
389  $pages = ilWikiPage::getAllPages($a_wiki_id);
390 
391  include_once("./Services/COPage/classes/class.ilInternalLink.php");
392 
393  $orphaned = array();
394  foreach ($pages as $k => $page)
395  {
396  $sources = ilInternalLink::_getSourcesOfTarget("wpg", $page["id"], 0);
397 
398  $ids = array();
399  foreach ($sources as $source)
400  {
401  if ($source["type"] == "wpg:pg")
402  {
403  $ids[] = $source["id"];
404  }
405  }
406  // delete record of table il_wiki_data
407  $query = "SELECT count(*) AS cnt FROM il_wiki_page".
408  " WHERE ".$ilDB->in("id", $ids, false, "integer").
409  " AND wiki_id = ".$ilDB->quote($a_wiki_id, "integer").
410  " ORDER BY title";
411  $set = $ilDB->query($query);
412  $rec = $ilDB->fetchAssoc($set);
413  if ($rec["cnt"] == 0 &&
414  ilObjWiki::_lookupStartPage($a_wiki_id) != $page["title"])
415  {
416  $orphaned[] = $page;
417  }
418  }
419 
420  return $orphaned;
421  }
422 
428  static function _wikiPageExists($a_wiki_id, $a_title)
429  {
430  global $ilDB;
431 
432  $a_title = ilWikiUtil::makeDbTitle($a_title);
433 
434  $query = "SELECT id FROM il_wiki_page".
435  " WHERE wiki_id = ".$ilDB->quote($a_wiki_id, "integer").
436  " AND title = ".$ilDB->quote($a_title, "text");
437  $set = $ilDB->query($query);
438 
439  $pages = array();
440  if ($rec = $ilDB->fetchAssoc($set))
441  {
442  return true;
443  }
444 
445  return false;
446  }
447 
453  static function getParentObjectContributors($a_wiki_id)
454  {
455  global $ilDB;
456 
457  $contributors = parent::getParentObjectContributors("wpg", $a_wiki_id);
458 
459  return $contributors;
460  }
461 
467  static function getPageContributors($a_page_id)
468  {
469  global $ilDB;
470 
471  $contributors = parent::getPageContributors("wpg", $a_page_id);
472 
473  return $contributors;
474  }
475 
476 
482  function saveInternalLinks($a_xml)
483  {
484  global $ilDB;
485 
486 
487  // *** STEP 1: Standard Processing ***
488 
490 
491 
492  // *** STEP 2: Other Pages -> This Page ***
493 
494  // Check, whether ANOTHER page links to this page as a "missing" page
495  // (this is the case, when this page is created newly)
496  $set = $ilDB->queryF("SELECT * FROM il_wiki_missing_page WHERE ".
497  " wiki_id = %s AND target_name = %s",
498  array("integer", "text"),
499  array($this->getWikiId(), $this->getTitle()));
500  while ($anmiss = $ilDB->fetchAssoc($set)) // insert internal links instead
501  {
502  ilInternalLink::_saveLink("wpg:pg", $anmiss["source_id"], "wpg",
503  $this->getId(), 0);
504  }
505 
506  // now remove the missing page entries
507  $ilDB->manipulateF("DELETE FROM il_wiki_missing_page WHERE ".
508  " wiki_id = %s AND target_name = %s",
509  array("integer", "text"),
510  array($this->getWikiId(), $this->getTitle()));
511 
512 
513  // *** STEP 3: This Page -> Other Pages ***
514 
515  // remove the exising "missing page" links for THIS page (they will be re-inserted below)
516  $ilDB->manipulateF("DELETE FROM il_wiki_missing_page WHERE ".
517  " wiki_id = %s AND source_id = %s",
518  array("integer", "integer"),
519  array($this->getWikiId(), $this->getId()));
520 
521  // collect the wiki links of the page
522  include_once("./Modules/Wiki/classes/class.ilWikiUtil.php");
523  $int_wiki_links = ilWikiUtil::collectInternalLinks($a_xml, $this->getWikiId(), true);
524 
525  foreach($int_wiki_links as $wlink)
526  {
527  $page_id = ilWikiPage::_getPageIdForWikiTitle($this->getWikiId(), $wlink);
528 
529  if ($page_id > 0) // save internal link for existing page
530  {
531  ilInternalLink::_saveLink("wpg:pg", $this->getId(), "wpg",
532  $page_id, 0);
533  }
534  else // save missing link for non-existing page
535  {
536  $ilDB->manipulateF("DELETE FROM il_wiki_missing_page WHERE".
537  " wiki_id = %s AND source_id = %s AND target_name = %s",
538  array("integer", "integer", "text"),
539  array($this->getWikiId(), $this->getId(), $wlink));
540  $ilDB->manipulateF("INSERT INTO il_wiki_missing_page (wiki_id, source_id, target_name)".
541  " VALUES (%s,%s,%s)",
542  array("integer", "integer", "text"),
543  array($this->getWikiId(), $this->getId(), $wlink));
544  }
545  }
546  }
547 
551  static function _getPageIdForWikiTitle($a_wiki_id, $a_title)
552  {
553  global $ilDB;
554 
555  $query = "SELECT id FROM il_wiki_page".
556  " WHERE wiki_id = ".$ilDB->quote($a_wiki_id, "integer").
557  " AND title = ".$ilDB->quote($a_title, "text");
558  $set = $ilDB->query($query);
559  if($rec = $ilDB->fetchAssoc($set))
560  {
561  return $rec["id"];
562  }
563 
564  return false;
565  }
566 
572  static function getPopularPages($a_wiki_id)
573  {
574  global $ilDB;
575 
576  $query = "SELECT wp.*, po.view_cnt as cnt FROM il_wiki_page wp, page_object po".
577  " WHERE wp.wiki_id = ".$ilDB->quote($a_wiki_id, "integer").
578  " AND wp.id = po.page_id ".
579  " AND po.parent_type = ".$ilDB->quote("wpg", "text")." ".
580  " ORDER BY po.view_cnt";
581  $set = $ilDB->query($query);
582 
583  $pages = array();
584  while($rec = $ilDB->fetchAssoc($set))
585  {
586  $pages[] = $rec;
587  }
588 
589  return $pages;
590  }
591 
597  static function countPages($a_wiki_id)
598  {
599  global $ilDB;
600 
601  // delete record of table il_wiki_data
602  $query = "SELECT count(*) as cnt FROM il_wiki_page".
603  " WHERE wiki_id = ".$ilDB->quote($a_wiki_id, "integer");
604  $s = $ilDB->query($query);
605  $r = $ilDB->fetchAssoc($s);
606 
607  return $r["cnt"];
608  }
609 
615  static function getRandomPage($a_wiki_id)
616  {
617  global $ilDB;
618 
619  $cnt = ilWikiPage::countPages($a_wiki_id);
620 
621  if ($cnt < 1)
622  {
623  return "";
624  }
625 
626  $rand = rand(1, $cnt);
627 
628  // delete record of table il_wiki_data
629  $ilDB->setLimit(1, $rand);
630  $query = "SELECT title FROM il_wiki_page".
631  " WHERE wiki_id = ".$ilDB->quote($a_wiki_id, "integer");
632  $s = $ilDB->query($query);
633  $r = $ilDB->fetchAssoc($s);
634 
635  return $r["title"];
636  }
637 
643  static function getNewPages($a_wiki_id)
644  {
645  global $ilDB;
646 
647  $pages = parent::getNewPages("wpg", $a_wiki_id);
648 
649  foreach($pages as $k => $page)
650  {
651  $pages[$k]["title"] = ilWikiPage::lookupTitle($page["id"]);
652  }
653 
654  return $pages;
655  }
656 
657 
664  public static function lookupObjIdByPage($a_page_id)
665  {
666  global $ilDB;
667 
668  $query = "SELECT wiki_id FROM il_wiki_page".
669  " WHERE id = ".$ilDB->quote($a_page_id, "integer");
670  $set = $ilDB->query($query);
671  if($rec = $ilDB->fetchAssoc($set))
672  {
673  return $rec["wiki_id"];
674  }
675 
676  return false;
677  }
678 } // END class.ilWikiPage
679 ?>