ILIAS  Release_4_0_x_branch Revision 61816
 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 
69  function create()
70  {
71  global $ilDB;
72 
73  $id = $ilDB->nextId("il_wiki_page");
74  $this->setId($id);
75  $query = "INSERT INTO il_wiki_page (".
76  "id".
77  ", title".
78  ", wiki_id".
79  " ) VALUES (".
80  $ilDB->quote($this->getId(), "integer")
81  .",".$ilDB->quote($this->getTitle(), "text")
82  .",".$ilDB->quote($this->getWikiId(), "integer")
83  .")";
84  $ilDB->manipulate($query);
85 
86  // create page object
88 
89  $this->saveInternalLinks($this->getXMLContent());
90  }
91 
98  function update($a_validate = true, $a_no_history = false)
99  {
100  global $ilDB;
101 
102  // update wiki page data
103  $query = "UPDATE il_wiki_page SET ".
104  " title = ".$ilDB->quote($this->getTitle(), "text").
105  ",wiki_id = ".$ilDB->quote($this->getWikiId(), "integer").
106  " WHERE id = ".$ilDB->quote($this->getId(), "integer");
107  $ilDB->manipulate($query);
108  parent::update($a_validate, $a_no_history);
109 
110  return true;
111  }
112 
116  function read()
117  {
118  global $ilDB;
119 
120  $query = "SELECT * FROM il_wiki_page WHERE id = ".
121  $ilDB->quote($this->getId(), "integer");
122  $set = $ilDB->query($query);
123  $rec = $ilDB->fetchAssoc($set);
124 
125  $this->setTitle($rec["title"]);
126  $this->setWikiId($rec["wiki_id"]);
127 
128  // get co page
129  parent::read();
130  }
131 
132 
138  function delete()
139  {
140  global $ilDB;
141 
142  // get other pages that link to this page
143  $linking_pages = ilWikiPage::getLinksToPage($this->getWikiId(),
144  $this->getId());
145 
146  // delete internal links information to this page
147  include_once("./Services/COPage/classes/class.ilInternalLink.php");
149 
150  // delete comments and notes of this page
151  // (we keep them first)
152 
153  // delete record of table il_wiki_data
154  $query = "DELETE FROM il_wiki_page".
155  " WHERE id = ".$ilDB->quote($this->getId(), "integer");
156 
157  $ilDB->manipulate($query);
158 
159  // delete co page
160  parent::delete();
161 
162  // make links of other pages to this page a missing link
163  foreach($linking_pages as $lp)
164  {
165  $ilDB->manipulateF("DELETE FROM il_wiki_missing_page ".
166  " WHERE wiki_id = %s AND source_id = %s AND target_name = %s ",
167  array("integer", "integer", "text"),
168  array($this->getWikiId(), $lp["id"], $this->getTitle()));
169  $ilDB->manipulateF("INSERT INTO il_wiki_missing_page ".
170  "(wiki_id, source_id, target_name) VALUES ".
171  "(%s,%s,%s)",
172  array("integer", "integer", "text"),
173  array($this->getWikiId(), $lp["id"], $this->getTitle()));
174  }
175 
176  return true;
177  }
178 
184  static function deleteAllPagesOfWiki($a_wiki_id)
185  {
186  global $ilDB;
187 
188  // delete record of table il_wiki_data
189  $query = "SELECT * FROM il_wiki_page".
190  " WHERE wiki_id = ".$ilDB->quote($a_wiki_id, "integer");
191  $set = $ilDB->query($query);
192 
193  while($rec = $ilDB->fetchAssoc($set))
194  {
195  $wiki_page = new ilWikiPage($rec["id"]);
196  $wiki_page->delete();
197  }
198  }
199 
203  static function exists($a_wiki_id, $a_title)
204  {
205  global $ilDB;
206 
207  $a_title = ilWikiUtil::makeDbTitle($a_title);
208 
209  $query = "SELECT * FROM il_wiki_page".
210  " WHERE wiki_id = ".$ilDB->quote($a_wiki_id, "integer").
211  " AND title = ".$ilDB->quote($a_title, "text");
212  $set = $ilDB->query($query);
213  if($rec = $ilDB->fetchAssoc($set))
214  {
215  return true;
216  }
217 
218  return false;
219  }
220 
224  static function getPageIdForTitle($a_wiki_id, $a_title)
225  {
226  global $ilDB;
227 
228  $a_title = ilWikiUtil::makeDbTitle($a_title);
229 
230  $query = "SELECT * FROM il_wiki_page".
231  " WHERE wiki_id = ".$ilDB->quote($a_wiki_id, "integer").
232  " AND title = ".$ilDB->quote($a_title, "text");
233  $set = $ilDB->query($query);
234  if($rec = $ilDB->fetchAssoc($set))
235  {
236  return $rec["id"];
237  }
238 
239  return false;
240  }
241 
245  static function lookupTitle($a_page_id)
246  {
247  global $ilDB;
248 
249  $query = "SELECT * FROM il_wiki_page".
250  " WHERE id = ".$ilDB->quote($a_page_id, "integer");
251  $set = $ilDB->query($query);
252  if($rec = $ilDB->fetchAssoc($set))
253  {
254  return $rec["title"];
255  }
256 
257  return false;
258  }
259 
265  static function getAllPages($a_wiki_id)
266  {
267  global $ilDB;
268 
269  $pages = parent::getAllPages("wpg", $a_wiki_id);
270 
271  $query = "SELECT * FROM il_wiki_page".
272  " WHERE wiki_id = ".$ilDB->quote($a_wiki_id, "integer").
273  " ORDER BY title";
274  $set = $ilDB->query($query);
275 
276  while($rec = $ilDB->fetchAssoc($set))
277  {
278  if (isset($pages[$rec["id"]]))
279  {
280  $pages[$rec["id"]]["title"] = $rec["title"];
281  }
282  }
283 
284  return $pages;
285  }
286 
290  static function getLinksToPage($a_wiki_id, $a_page_id)
291  {
292  global $ilDB;
293 
294  include_once("./Services/COPage/classes/class.ilInternalLink.php");
295  $sources = ilInternalLink::_getSourcesOfTarget("wpg", $a_page_id, 0);
296 
297  $ids = array();
298  foreach ($sources as $source)
299  {
300  if ($source["type"] == "wpg:pg")
301  {
302  $ids[] = $source["id"];
303  }
304  }
305  // get wiki page record
306  $query = "SELECT * FROM il_wiki_page wp, page_object p".
307  " WHERE ".$ilDB->in("wp.id", $ids, false, "integer").
308  " AND wp.id = p.page_id AND p.parent_type = ".$ilDB->quote("wpg", "text").
309  " AND wp.wiki_id = ".$ilDB->quote($a_wiki_id, "integer").
310  " ORDER BY title";
311  $set = $ilDB->query($query);
312 
313  $pages = array();
314  while ($rec = $ilDB->fetchAssoc($set))
315  {
316  $pages[] = array_merge($rec, array("user" => $rec["last_change_user"],
317  "date" => $rec["last_change"]));
318  }
319 
320  return $pages;
321  }
322 
328  static function getOrphanedPages($a_wiki_id)
329  {
330  global $ilDB;
331 
332  $pages = ilWikiPage::getAllPages($a_wiki_id);
333 
334  include_once("./Services/COPage/classes/class.ilInternalLink.php");
335 
336  $orphaned = array();
337  foreach ($pages as $k => $page)
338  {
339  $sources = ilInternalLink::_getSourcesOfTarget("wpg", $page["id"], 0);
340 
341  $ids = array();
342  foreach ($sources as $source)
343  {
344  if ($source["type"] == "wpg:pg")
345  {
346  $ids[] = $source["id"];
347  }
348  }
349  // delete record of table il_wiki_data
350  $query = "SELECT count(*) AS cnt FROM il_wiki_page".
351  " WHERE ".$ilDB->in("id", $ids, false, "integer").
352  " AND wiki_id = ".$ilDB->quote($a_wiki_id, "integer").
353  " ORDER BY title";
354  $set = $ilDB->query($query);
355  $rec = $ilDB->fetchAssoc($set);
356  if ($rec["cnt"] == 0 &&
357  ilObjWiki::_lookupStartPage($a_wiki_id) != $page["title"])
358  {
359  $orphaned[] = $page;
360  }
361  }
362 
363  return $orphaned;
364  }
365 
371  static function _wikiPageExists($a_wiki_id, $a_title)
372  {
373  global $ilDB;
374 
375  $a_title = ilWikiUtil::makeDbTitle($a_title);
376 
377  $query = "SELECT id FROM il_wiki_page".
378  " WHERE wiki_id = ".$ilDB->quote($a_wiki_id, "integer").
379  " AND title = ".$ilDB->quote($a_title, "text");
380  $set = $ilDB->query($query);
381 
382  $pages = array();
383  if ($rec = $ilDB->fetchAssoc($set))
384  {
385  return true;
386  }
387 
388  return false;
389  }
390 
396  static function getParentObjectContributors($a_wiki_id)
397  {
398  global $ilDB;
399 
400  $contributors = parent::getParentObjectContributors("wpg", $a_wiki_id);
401 
402  return $contributors;
403  }
404 
410  static function getPageContributors($a_page_id)
411  {
412  global $ilDB;
413 
414  $contributors = parent::getPageContributors("wpg", $a_page_id);
415 
416  return $contributors;
417  }
418 
419 
425  function saveInternalLinks($a_xml)
426  {
427  global $ilDB;
428 
429 
430  // *** STEP 1: Standard Processing ***
431 
433 
434 
435  // *** STEP 2: Other Pages -> This Page ***
436 
437  // Check, whether ANOTHER page links to this page as a "missing" page
438  // (this is the case, when this page is created newly)
439  $set = $ilDB->queryF("SELECT * FROM il_wiki_missing_page WHERE ".
440  " wiki_id = %s AND target_name = %s",
441  array("integer", "text"),
442  array($this->getWikiId(), $this->getTitle()));
443  while ($anmiss = $ilDB->fetchAssoc($set)) // insert internal links instead
444  {
445  ilInternalLink::_saveLink("wpg:pg", $anmiss["source_id"], "wpg",
446  $this->getId(), 0);
447  }
448 
449  // now remove the missing page entries
450  $ilDB->manipulateF("DELETE FROM il_wiki_missing_page WHERE ".
451  " wiki_id = %s AND target_name = %s",
452  array("integer", "text"),
453  array($this->getWikiId(), $this->getTitle()));
454 
455 
456  // *** STEP 3: This Page -> Other Pages ***
457 
458  // remove the exising "missing page" links for THIS page (they will be re-inserted below)
459  $ilDB->manipulateF("DELETE FROM il_wiki_missing_page WHERE ".
460  " wiki_id = %s AND source_id = %s",
461  array("integer", "integer"),
462  array($this->getWikiId(), $this->getId()));
463 
464  // collect the wiki links of the page
465  include_once("./Modules/Wiki/classes/class.ilWikiUtil.php");
466  $int_wiki_links = ilWikiUtil::collectInternalLinks($a_xml, $this->getWikiId(), true);
467 
468  foreach($int_wiki_links as $wlink)
469  {
470  $page_id = ilWikiPage::_getPageIdForWikiTitle($this->getWikiId(), $wlink);
471 
472  if ($page_id > 0) // save internal link for existing page
473  {
474  ilInternalLink::_saveLink("wpg:pg", $this->getId(), "wpg",
475  $page_id, 0);
476  }
477  else // save missing link for non-existing page
478  {
479  $ilDB->manipulateF("DELETE FROM il_wiki_missing_page WHERE".
480  " wiki_id = %s AND source_id = %s AND target_name = %s",
481  array("integer", "integer", "text"),
482  array($this->getWikiId(), $this->getId(), $wlink));
483  $ilDB->manipulateF("INSERT INTO il_wiki_missing_page (wiki_id, source_id, target_name)".
484  " VALUES (%s,%s,%s)",
485  array("integer", "integer", "text"),
486  array($this->getWikiId(), $this->getId(), $wlink));
487  }
488  }
489  }
490 
494  static function _getPageIdForWikiTitle($a_wiki_id, $a_title)
495  {
496  global $ilDB;
497 
498  $query = "SELECT id FROM il_wiki_page".
499  " WHERE wiki_id = ".$ilDB->quote($a_wiki_id, "integer").
500  " AND title = ".$ilDB->quote($a_title, "text");
501  $set = $ilDB->query($query);
502  if($rec = $ilDB->fetchAssoc($set))
503  {
504  return $rec["id"];
505  }
506 
507  return false;
508  }
509 
515  static function getPopularPages($a_wiki_id)
516  {
517  global $ilDB;
518 
519  $query = "SELECT wp.*, po.view_cnt as cnt FROM il_wiki_page wp, page_object po".
520  " WHERE wp.wiki_id = ".$ilDB->quote($a_wiki_id, "integer").
521  " AND wp.id = po.page_id ".
522  " AND po.parent_type = ".$ilDB->quote("wpg", "text")." ".
523  " ORDER BY po.view_cnt";
524  $set = $ilDB->query($query);
525 
526  $pages = array();
527  while($rec = $ilDB->fetchAssoc($set))
528  {
529  $pages[] = $rec;
530  }
531 
532  return $pages;
533  }
534 
540  static function countPages($a_wiki_id)
541  {
542  global $ilDB;
543 
544  // delete record of table il_wiki_data
545  $query = "SELECT count(*) as cnt FROM il_wiki_page".
546  " WHERE wiki_id = ".$ilDB->quote($a_wiki_id, "integer");
547  $s = $ilDB->query($query);
548  $r = $ilDB->fetchAssoc($s);
549 
550  return $r["cnt"];
551  }
552 
558  static function getRandomPage($a_wiki_id)
559  {
560  global $ilDB;
561 
562  $cnt = ilWikiPage::countPages($a_wiki_id);
563 
564  if ($cnt < 1)
565  {
566  return "";
567  }
568 
569  $rand = rand(1, $cnt);
570 
571  // delete record of table il_wiki_data
572  $ilDB->setLimit(1, $rand);
573  $query = "SELECT title FROM il_wiki_page".
574  " WHERE wiki_id = ".$ilDB->quote($a_wiki_id, "integer");
575  $s = $ilDB->query($query);
576  $r = $ilDB->fetchAssoc($s);
577 
578  return $r["title"];
579  }
580 
586  static function getNewPages($a_wiki_id)
587  {
588  global $ilDB;
589 
590  $pages = parent::getNewPages("wpg", $a_wiki_id);
591 
592  foreach($pages as $k => $page)
593  {
594  $pages[$k]["title"] = ilWikiPage::lookupTitle($page["id"]);
595  }
596 
597  return $pages;
598  }
599 
600 
607  public static function lookupObjIdByPage($a_page_id)
608  {
609  global $ilDB;
610 
611  $query = "SELECT wiki_id FROM il_wiki_page".
612  " WHERE id = ".$ilDB->quote($a_page_id, "integer");
613  $set = $ilDB->query($query);
614  if($rec = $ilDB->fetchAssoc($set))
615  {
616  return $rec["wiki_id"];
617  }
618 
619  return false;
620  }
621 } // END class.ilWikiPage
622 ?>