ILIAS  Release_4_2_x_branch Revision 61807
 All Data Structures Namespaces Files Functions Variables Groups Pages
class.ilNote.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 define("IL_NOTE_PRIVATE", 1);
5 define("IL_NOTE_PUBLIC", 2);
6 
7 define("IL_NOTE_UNLABELED", 0);
8 define("IL_NOTE_IMPORTANT", 1);
9 define("IL_NOTE_QUESTION", 2);
10 define("IL_NOTE_PRO", 3);
11 define("IL_NOTE_CONTRA", 4);
12 
24 class ilNote
25 {
26 
30  function ilNote($a_id = 0)
31  {
32  if ($a_id > 0)
33  {
34  $this->id = $a_id;
35  $this->read();
36  }
37  }
38 
44  function setId($a_id)
45  {
46  $this->id = $a_id;
47  }
48 
54  function getId()
55  {
56  return $this->id;
57  }
58 
69  function setObject($a_obj_type, $a_rep_obj_id, $a_obj_id = 0)
70  {
71  $this->rep_obj_id = $a_rep_obj_id;
72  $this->obj_id = $a_obj_id;
73  $this->obj_type = $a_obj_type;
74  }
75 
76  function getObject()
77  {
78  return array("rep_obj_id" => $this->rep_obj_id,
79  "obj_id" => $this->obj_id,
80  "obj_type" => $this->obj_type);
81  }
82 
83 
89  function setType($a_type)
90  {
91  $this->type = $a_type;
92  }
93 
99  function getType()
100  {
101  return $this->type;
102  }
103 
109  function setAuthor($a_user_id)
110  {
111  $this->author = $a_user_id;
112  }
113 
119  function getAuthor()
120  {
121  return $this->author;
122  }
123 
129  function setText($a_text)
130  {
131  $this->text = $a_text;
132  }
133 
139  function getText()
140  {
141  return $this->text;
142  }
143 
149  function setSubject($a_subject)
150  {
151  $this->subject = $a_subject;
152  }
153 
159  function getSubject()
160  {
161  return $this->subject;
162  }
163 
169  function setCreationDate($a_date)
170  {
171  $this->creation_date = $a_date;
172  }
173 
179  function getCreationDate()
180  {
181  return $this->creation_date;
182  }
183 
189  function setUpdateDate($a_date)
190  {
191  $this->update_date = $a_date;
192  }
193 
199  function getUpdateDate()
200  {
201  return $this->update_date;
202  }
203 
210  function setLabel($a_label)
211  {
212  return $this->label = $a_label;
213  }
214 
221  function getLabel()
222  {
223  return $this->label;
224  }
225 
231  function setInRepository($a_value)
232  {
233  return $this->no_repository = !(bool)$a_value;
234  }
235 
241  function isInRepository()
242  {
243  return !$this->no_repository;
244  }
245 
246  function create()
247  {
248  global $ilDB;
249 
250  $this->id = $ilDB->nextId("note");
251  /*$q = "INSERT INTO note (id, rep_obj_id, obj_id, obj_type, type,".
252  "author, note_text, subject, label, creation_date) VALUES (".
253  $ilDB->quote($this->id, "integer").",".
254  $ilDB->quote((int) $this->rep_obj_id, "integer").",".
255  $ilDB->quote((int) $this->obj_id, "integer").",".
256  $ilDB->quote((string) $this->obj_type, "text").",".
257  $ilDB->quote((int) $this->type, "integer").",".
258  $ilDB->quote((int) $this->author, "integer").",".
259  $ilDB->quote((string) $this->text, "clob").",".
260  $ilDB->quote((string) $this->subject, "text").",".
261  $ilDB->quote((int) $this->label, "integer").",".
262  $ilDB->now().")";
263  $ilDB->manipulate($q);*/
264 
265  $ilDB->insert("note", array(
266  "id" => array("integer", $this->id),
267  "rep_obj_id" => array("integer", (int) $this->rep_obj_id),
268  "obj_id" => array("integer", (int) $this->obj_id),
269  "obj_type" => array("text", (string) $this->obj_type),
270  "type" => array("integer", (int) $this->type),
271  "author" => array("integer", (int) $this->author),
272  "note_text" => array("clob", (string) $this->text),
273  "subject" => array("text", (string) $this->subject),
274  "label" => array("integer", (int) $this->label),
275  "creation_date" => array("timestamp", ilUtil::now()),
276  "no_repository" => array("integer", $this->no_repository)
277  ));
278 
279  $this->creation_date = ilNote::_lookupCreationDate($this->getId());
280  }
281 
282  function update()
283  {
284  global $ilDB;
285 
286  /*$q = "UPDATE note SET ".
287  "rep_obj_id = ".$ilDB->quote((int) $this->rep_obj_id, "integer").",".
288  "obj_id = ".$ilDB->quote((int) $this->obj_id, "integer").",".
289  "obj_type = ".$ilDB->quote((string) $this->obj_type, "text").",".
290  "type = ".$ilDB->quote((int) $this->type, "integer").",".
291  "author = ".$ilDB->quote((int) $this->author,"integer").",".
292  "note_text = ".$ilDB->quote((string) $this->text, "clob").",".
293  "subject = ".$ilDB->quote((string) $this->subject, "text").",".
294  "update_date = ".$ilDB->now().",".
295  "label = ".$ilDB->quote((int) $this->label, "integer").
296  "WHERE id =".$ilDB->quote((int) $this->getId(), "integer");
297  $ilDB->manipulate($q);*/
298  $ilDB->update("note", array(
299  "rep_obj_id" => array("integer", (int) $this->rep_obj_id),
300  "obj_id" => array("integer", (int) $this->obj_id),
301  "obj_type" => array("text", (string) $this->obj_type),
302  "type" => array("integer", (int) $this->type),
303  "author" => array("integer", (int) $this->author),
304  "note_text" => array("clob", (string) $this->text),
305  "subject" => array("text", (string) $this->subject),
306  "label" => array("integer", (int) $this->label),
307  "update_date" => array("timestamp", ilUtil::now()),
308  "no_repository" => array("integer", $this->no_repository)
309  ), array(
310  "id" => array("integer", $this->getId())
311  ));
312 
313  $this->update_date = ilNote::_lookupUpdateDate($this->getId());
314  }
315 
316  function read()
317  {
318  global $ilDB;
319 
320  $q = "SELECT * FROM note WHERE id = ".
321  $ilDB->quote((int) $this->getId(), "integer");
322  $set = $ilDB->query($q);
323  $note_rec = $ilDB->fetchAssoc($set);
324  $this->setAllData($note_rec);
325  }
326 
330  function delete()
331  {
332  global $ilDB;
333 
334  $q = "DELETE FROM note WHERE id = ".
335  $ilDB->quote((int) $this->getId(), "integer");
336  $ilDB->manipulate($q);
337  }
338 
342  function setAllData($a_note_rec)
343  {
344  $this->setId($a_note_rec["id"]);
345  $this->setObject($a_note_rec["obj_type"], $a_note_rec["rep_obj_id"], $a_note_rec["obj_id"]);
346  $this->setType($a_note_rec["type"]);
347  $this->setAuthor($a_note_rec["author"]);
348  $this->setText($a_note_rec["note_text"]);
349  $this->setSubject($a_note_rec["subject"]);
350  $this->setLabel($a_note_rec["label"]);
351  $this->setCreationDate($a_note_rec["creation_date"]);
352  $this->setUpdateDate($a_note_rec["update_date"]);
353  $this->setInRepository(!(bool)$a_note_rec["no_repository"]);
354  }
355 
359  function _lookupCreationDate($a_id)
360  {
361  global $ilDB;
362 
363  $q = "SELECT * FROM note WHERE id = ".
364  $ilDB->quote((int) $this->getId(), "integer");
365  $set = $ilDB->query($q);
366  $note_rec = $ilDB->fetchAssoc($set);
367 
368  return $note_rec["creation_date"];
369  }
370 
374  function _lookupUpdateDate($a_id)
375  {
376  global $ilDB;
377 
378  $q = "SELECT * FROM note WHERE id = ".
379  $ilDB->quote((int) $this->getId(), "integer");
380  $set = $ilDB->query($q);
381  $note_rec = $ilDB->fetchAssoc($set);
382 
383  return $note_rec["update_date"];
384  }
385 
389  function _getNotesOfObject($a_rep_obj_id, $a_obj_id, $a_obj_type,
390  $a_type = IL_NOTE_PRIVATE, $a_incl_sub = false, $a_filter = "",
391  $a_all_public = "y", $a_repository_mode = true)
392  {
393  global $ilDB, $ilUser;
394 
395  $author_where = ($a_type == IL_NOTE_PRIVATE || $a_all_public == "n")
396  ? " AND author = ".$ilDB->quote((int) $ilUser->getId(), "integer")
397  : "";
398 
399  $sub_where = (!$a_incl_sub)
400  ? " AND obj_id = ".$ilDB->quote((int) $a_obj_id, "integer").
401  " AND obj_type = ".$ilDB->quote((string) $a_obj_type, "text")
402  : "";
403 
404  if(!$a_repository_mode)
405  {
406  $sub_where .= " AND no_repository = ".$ilDB->quote(1, "integer");
407  }
408 
409  $q = "SELECT * FROM note WHERE ".
410  " rep_obj_id = ".$ilDB->quote((int) $a_rep_obj_id, "integer").
411  $sub_where.
412  " AND type = ".$ilDB->quote((int) $a_type, "integer").
413  $author_where.
414  " ORDER BY creation_date DESC";
415 
416  $set = $ilDB->query($q);
417  $notes = array();
418  while($note_rec = $ilDB->fetchAssoc($set))
419  {
420  if ($a_filter != "")
421  {
422  if (!is_array($a_filter))
423  {
424  $a_filter = array($a_filter);
425  }
426  if (!in_array($note_rec["id"], $a_filter))
427  {
428  continue;
429  }
430  }
431  $cnt = count($notes);
432  $notes[$cnt] = new ilNote();
433  $notes[$cnt]->setAllData($note_rec);
434  }
435 
436  return $notes;
437  }
438 
443  {
444  global $ilDB, $ilUser;
445 
446  $q = "SELECT * FROM note WHERE ".
447  " type = ".$ilDB->quote((int) IL_NOTE_PRIVATE, "integer").
448  " AND author = ".$ilDB->quote((int) $ilUser->getId(), "integer").
449  " AND (no_repository IS NULL OR no_repository < ".$ilDB->quote(1, "integer").")".
450  " ORDER BY creation_date DESC";
451 
452  $ilDB->quote($q);
453  $set = $ilDB->query($q);
454  $notes = array();
455  while($note_rec = $ilDB->fetchAssoc($set))
456  {
457  $cnt = count($notes);
458  $notes[$cnt] = new ilNote();
459  $notes[$cnt]->setAllData($note_rec);
460  }
461 
462  return $notes;
463  }
464 
468  function _getRelatedObjectsOfUser($a_mode)
469  {
470  global $ilDB, $ilUser, $tree;
471 
472  if ($a_mode == ilPDNotesGUI::PRIVATE_NOTES)
473  {
474  $q = "SELECT DISTINCT rep_obj_id FROM note WHERE ".
475  " type = ".$ilDB->quote((int) IL_NOTE_PRIVATE, "integer").
476  " AND author = ".$ilDB->quote($ilUser->getId(), "integer").
477  " AND (no_repository IS NULL OR no_repository < ".$ilDB->quote(1, "integer").")".
478  " ORDER BY rep_obj_id";
479 
480  $ilDB->quote($q);
481  $set = $ilDB->query($q);
482  $reps = array();
483  while($rep_rec = $ilDB->fetchAssoc($set))
484  {
485  // #9343: deleted objects
486  if(ilObject::_lookupType($rep_rec["rep_obj_id"]))
487  {
488  $reps[] = array("rep_obj_id" => $rep_rec["rep_obj_id"]);
489  }
490  }
491  }
492  else
493  {
494  // all objects where the user wrote at least one comment
495  $q = "SELECT DISTINCT rep_obj_id FROM note WHERE ".
496  " type = ".$ilDB->quote((int) IL_NOTE_PUBLIC, "integer").
497  " AND author = ".$ilDB->quote($ilUser->getId(), "integer").
498  " AND (no_repository IS NULL OR no_repository < ".$ilDB->quote(1, "integer").")".
499  " ORDER BY rep_obj_id";
500 
501  $set = $ilDB->query($q);
502  $reps = array();
503  while($rep_rec = $ilDB->fetchAssoc($set))
504  {
505  // #9343: deleted objects
506  if ($type = ilObject::_lookupType($rep_rec["rep_obj_id"]))
507  {
508  if (ilNote::commentsActivated($rep_rec["rep_obj_id"], "", $type))
509  {
510  $reps[] = array("rep_obj_id" => $rep_rec["rep_obj_id"]);
511  }
512  }
513  }
514 
515  // additionally all objects on the personal desktop of the user
516  // that have at least on comment
517  $dis = ilObjUser::_lookupDesktopItems($ilUser->getId());
518  $obj_ids = array();
519  foreach($dis as $di)
520  {
521  $obj_ids[] = $di["obj_id"];
522  }
523  if (count($obj_ids) > 0)
524  {
525  $q = "SELECT DISTINCT rep_obj_id FROM note WHERE ".
526  $ilDB->in("rep_obj_id", $obj_ids, false, "integer").
527  " AND (no_repository IS NULL OR no_repository < ".$ilDB->quote(1, "integer").")";
528 
529  $set = $ilDB->query($q);
530  while($rec = $ilDB->fetchAssoc($set))
531  {
532  $add = true;
533  reset($reps);
534  foreach ($reps as $r)
535  {
536  if ($r["rep_obj_id"] == $rec["rep_obj_id"])
537  {
538  $add = false;
539  }
540  }
541  if ($add)
542  {
543  $type = ilObject::_lookupType($rec["rep_obj_id"]);
544  if (ilNote::commentsActivated($rec["rep_obj_id"], "", $type))
545  {
546  $reps[] = array("rep_obj_id" => $rec["rep_obj_id"]);
547  }
548  }
549  }
550  }
551  }
552 
553  if(sizeof($reps))
554  {
555  // check if notes/comments belong to objects in trash
556  // see ilNoteGUI::showTargets()
557  foreach($reps as $idx => $rep)
558  {
559  $has_active_ref = false;
560 
561  // repository?
562  $ref_ids = ilObject::_getAllReferences($rep["rep_obj_id"]);
563  if($ref_ids)
564  {
565  foreach($ref_ids as $ref_id)
566  {
567  if(!$tree->isDeleted($ref_id))
568  {
569  $has_active_ref = true;
570  break;
571  }
572  }
573  }
574  else
575  {
576  // personal workspace?
577  include_once "Services/PersonalWorkspace/classes/class.ilWorkspaceTree.php";
578  include_once "Services/PersonalWorkspace/classes/class.ilWorkspaceAccessHandler.php";
579  $wsp_tree = new ilWorkspaceTree($ilUser->getId());
580  $node_id = $wsp_tree->lookupNodeId($rep["rep_obj_id"]);
581  if($node_id)
582  {
583  $has_active_ref = true;
584  }
585  }
586 
587  if(!$has_active_ref)
588  {
589  unset($reps[$idx]);
590  }
591  }
592  }
593 
594  return $reps;
595  }
596 
604  static function getUserCount($a_rep_obj_id, $a_obj_id, $a_type)
605  {
606  global $ilDB;
607 
608  $set = $ilDB->queryF("SELECT count(DISTINCT author) cnt FROM note WHERE ".
609  "rep_obj_id = %s AND obj_id = %s AND obj_type = %s",
610  array("integer", "integer", "text"),
611  array((int) $a_rep_obj_id, (int) $a_obj_id, (string)$a_type));
612  $rec = $ilDB->fetchAssoc($set);
613  return (int) $rec["cnt"];
614  }
615 
622  static function _countNotesAndCommentsMultiple($a_rep_obj_ids, $a_no_sub_objs = false)
623  {
624  global $ilDB, $ilUser;
625 
626  $q = "SELECT count(id) c, rep_obj_id, type FROM note WHERE ".
627  " ((type = ".$ilDB->quote(IL_NOTE_PRIVATE, "integer")." AND ".
628  "author = ".$ilDB->quote((int) $ilUser->getId(), "integer").") OR ".
629  " type = ".$ilDB->quote(IL_NOTE_PUBLIC, "integer").") AND ".
630  $ilDB->in("rep_obj_id", $a_rep_obj_ids, false, "integer");
631 
632  if ($a_no_sub_objs)
633  {
634  $q .= " AND obj_id = ".$ilDB->quote(0, "integer");
635  }
636 
637  $q .= " GROUP BY rep_obj_id, type ";
638 
639  $cnt = array();
640  $set = $ilDB->query($q);
641  while ($rec = $ilDB->fetchAssoc($set))
642  {
643  $cnt[$rec["rep_obj_id"]][$rec["type"]] = $rec["c"];
644  }
645 
646  return $cnt;
647  }
648 
655  static function _countNotesAndComments($a_rep_obj_id, $a_sub_obj_id = null)
656  {
657  global $ilDB, $ilUser;
658 
659  $q = "SELECT count(id) c, rep_obj_id, type FROM note WHERE ".
660  " ((type = ".$ilDB->quote(IL_NOTE_PRIVATE, "integer")." AND ".
661  "author = ".$ilDB->quote((int) $ilUser->getId(), "integer").") OR ".
662  " type = ".$ilDB->quote(IL_NOTE_PUBLIC, "integer").") AND ".
663  " rep_obj_id = ".$ilDB->quote($a_rep_obj_id, "integer");
664 
665  if ($a_sub_obj_id !== null)
666  {
667  $q .= " AND obj_id = ".$ilDB->quote($a_sub_obj_id, "integer");
668  }
669 
670  $q .= " GROUP BY rep_obj_id, type ";
671 
672  $cnt = array();
673  $set = $ilDB->query($q);
674  while ($rec = $ilDB->fetchAssoc($set))
675  {
676  $cnt[$rec["rep_obj_id"]][$rec["type"]] = $rec["c"];
677  }
678 
679  return $cnt;
680  }
681 
688  static function activateComments($a_rep_obj_id, $a_obj_id, $a_obj_type, $a_activate = true)
689  {
690  global $ilDB;
691 
692  if ($a_obj_type == "")
693  {
694  $a_obj_type = "-";
695  }
696  $set = $ilDB->query("SELECT * FROM note_settings ".
697  " WHERE rep_obj_id = ".$ilDB->quote((int) $a_rep_obj_id, "integer").
698  " AND obj_id = ".$ilDB->quote((int) $a_obj_id, "integer").
699  " AND obj_type = ".$ilDB->quote($a_obj_type, "text")
700  );
701  if ($rec = $ilDB->fetchAssoc($set))
702  {
703  if (($rec["activated"] == 0 && $a_activate) ||
704  ($rec["activated"] == 1 && !$a_activate))
705  {
706  $ilDB->manipulate("UPDATE note_settings SET ".
707  " activated = ".$ilDB->quote((int) $a_activate, "integer").
708  " WHERE rep_obj_id = ".$ilDB->quote((int) $a_rep_obj_id, "integer").
709  " AND obj_id = ".$ilDB->quote((int) $a_obj_id, "integer").
710  " AND obj_type = ".$ilDB->quote($a_obj_type, "text")
711  );
712  }
713  }
714  else
715  {
716  if ($a_activate)
717  {
718  $q = "INSERT INTO note_settings ".
719  "(rep_obj_id, obj_id, obj_type, activated) VALUES (".
720  $ilDB->quote((int) $a_rep_obj_id, "integer").",".
721  $ilDB->quote((int) $a_obj_id, "integer").",".
722  $ilDB->quote($a_obj_type, "text").",".
723  $ilDB->quote(1, "integer").
724  ")";
725  $ilDB->manipulate($q);
726  }
727  }
728  }
729 
736  static function commentsActivated($a_rep_obj_id, $a_obj_id, $a_obj_type)
737  {
738  global $ilDB;
739 
740  if ($a_obj_type == "")
741  {
742  $a_obj_type = "-";
743  }
744  $set = $ilDB->query("SELECT * FROM note_settings ".
745  " WHERE rep_obj_id = ".$ilDB->quote((int) $a_rep_obj_id, "integer").
746  " AND obj_id = ".$ilDB->quote((int) $a_obj_id, "integer").
747  " AND obj_type = ".$ilDB->quote($a_obj_type, "text")
748  );
749  $rec = $ilDB->fetchAssoc($set);
750  return $rec["activated"];
751  }
752 
759  static function getRepObjActivation($a_rep_obj_ids)
760  {
761  global $ilDB;
762 
763  $set = $ilDB->query("SELECT * FROM note_settings ".
764  " WHERE ".$ilDB->in("rep_obj_id", $a_rep_obj_ids, false, "integer").
765  " AND obj_id = 0 ");
766  $activations = array();
767  while ($rec = $ilDB->fetchAssoc($set))
768  {
769  if ($rec["activated"])
770  {
771  $activations[$rec["rep_obj_id"]][$rec["obj_type"]] = true;
772  }
773  }
774 
775  return $activations;
776  }
777 
778 }
779 ?>