ILIAS  release_7 Revision v7.30-3-g800a261c036
class.ilNewsItem.php
Go to the documentation of this file.
1<?php
2/* Copyright (c) 1998-2012 ILIAS open source, Extended GPL, see docs/LICENSE */
3
4define("NEWS_NOTICE", 0);
5define("NEWS_MESSAGE", 1);
6define("NEWS_WARNING", 2);
7
8define("NEWS_TEXT", "text");
9define("NEWS_HTML", "html");
10define("NEWS_AUDIO", "audio");
11define("NEWS_USERS", "users");
12define("NEWS_PUBLIC", "public");
13
14
15
33{
37 protected $db;
38
42 protected $tree;
43
47 protected $access;
48
52 protected $obj_data_cache;
53
57 protected $user;
58
62 protected $lng;
63
67 protected $ctrl;
68
69 protected $id;
70 protected $title;
71 protected $content;
75 protected $content_html;
76 protected $context_obj_id;
80 protected $content_type = "text";
81 protected $creation_date;
82 protected $update_date;
83 protected $user_id;
87 protected $update_user_id;
88 protected $visibility = "users";
89 protected $content_long;
90 protected $priority = 1;
91 protected $content_is_lang_var = 0;
92 protected $mob_id;
93 protected $playtime;
94
95 private static $privFeedId = false;
96 private $limitation;
97
103 public function __construct($a_id = 0)
104 {
105 global $DIC;
106
107 $this->db = $DIC->database();
108 $this->tree = $DIC->repositoryTree();
109 $this->access = $DIC->access();
110 $this->obj_data_cache = $DIC["ilObjDataCache"];
111 $this->user = $DIC->user();
112 $this->lng = $DIC->language();
113 $this->ctrl = $DIC->ctrl();
114 if ($a_id > 0) {
115 $this->setId($a_id);
116 $this->read();
117 }
118 $this->limitation = true;
119 }
120
126 public function setId($a_id)
127 {
128 $this->id = $a_id;
129 }
130
136 public function getId()
137 {
138 return $this->id;
139 }
140
146 public function setTitle($a_title)
147 {
148 $this->title = $a_title;
149 }
150
156 public function getTitle()
157 {
158 return $this->title;
159 }
160
166 public function setContent($a_content)
167 {
168 $this->content = $a_content;
169 }
170
176 public function getContent()
177 {
178 return $this->content;
179 }
180
186 public function setContextObjId($a_context_obj_id)
187 {
188 $this->context_obj_id = $a_context_obj_id;
189 }
190
196 public function getContextObjId()
197 {
199 }
200
206 public function setContextObjType($a_context_obj_type)
207 {
208 $this->context_obj_type = $a_context_obj_type;
209 }
210
216 public function getContextObjType()
217 {
219 }
220
226 public function setContextSubObjId($a_context_sub_obj_id)
227 {
228 $this->context_sub_obj_id = $a_context_sub_obj_id;
229 }
230
236 public function getContextSubObjId()
237 {
239 }
240
246 public function setContextSubObjType($a_context_sub_obj_type)
247 {
248 $this->context_sub_obj_type = $a_context_sub_obj_type;
249 }
250
256 public function getContextSubObjType()
257 {
259 }
260
266 public function setContentType($a_content_type = "text")
267 {
268 $this->content_type = $a_content_type;
269 }
270
276 public function getContentType()
277 {
278 return $this->content_type;
279 }
280
286 public function setCreationDate($a_creation_date)
287 {
288 $this->creation_date = $a_creation_date;
289 }
290
296 public function getCreationDate()
297 {
299 }
300
306 public function setUpdateDate($a_update_date)
307 {
308 $this->update_date = $a_update_date;
309 }
310
316 public function getUpdateDate()
317 {
318 return $this->update_date;
319 }
320
326 public function setUserId($a_user_id)
327 {
328 $this->user_id = $a_user_id;
329 }
330
336 public function getUserId()
337 {
338 return $this->user_id;
339 }
340
346 public function setUpdateUserId($a_val)
347 {
348 $this->update_user_id = $a_val;
349 }
350
356 public function getUpdateUserId()
357 {
359 }
360
366 public function setVisibility($a_visibility = "users")
367 {
368 $this->visibility = $a_visibility;
369 }
370
376 public function getVisibility()
377 {
378 return $this->visibility;
379 }
380
386 public function setContentLong($a_content_long)
387 {
388 $this->content_long = $a_content_long;
389 }
390
396 public function getContentLong()
397 {
398 return $this->content_long;
399 }
400
406 public function setPriority($a_priority = 1)
407 {
408 $this->priority = $a_priority;
409 }
410
416 public function getPriority()
417 {
418 return $this->priority;
419 }
420
426 public function setContentIsLangVar($a_content_is_lang_var = 0)
427 {
428 $this->content_is_lang_var = $a_content_is_lang_var;
429 }
430
436 public function getContentIsLangVar()
437 {
439 }
440
446 public function setMobId($a_mob_id)
447 {
448 $this->mob_id = $a_mob_id;
449 }
450
456 public function getMobId()
457 {
458 return $this->mob_id;
459 }
460
466 public function setPlaytime($a_playtime)
467 {
468 $this->playtime = $a_playtime;
469 }
470
476 public function getPlaytime()
477 {
478 return $this->playtime;
479 }
480
481
487 public function setLimitation($a_limitation)
488 {
489 $this->limitation = $a_limitation;
490 }
491
497 public function getLimitation()
498 {
499 return $this->limitation;
500 }
501
507 public function setContentTextIsLangVar($a_val = 0)
508 {
509 $this->content_text_is_lang_var = $a_val;
510 }
511
517 public function getContentTextIsLangVar()
518 {
519 return $this->content_text_is_lang_var;
520 }
521
527 public function setMobPlayCounter($a_val)
528 {
529 $this->mob_cnt_play = $a_val;
530 }
531
537 public function getMobPlayCounter()
538 {
539 return $this->mob_cnt_play;
540 }
541
547 public function setMobDownloadCounter($a_val)
548 {
549 $this->mob_cnt_download = $a_val;
550 }
551
557 public function getMobDownloadCounter()
558 {
559 return $this->mob_cnt_download;
560 }
561
567 public function setContentHtml($a_val)
568 {
569 $this->content_html = $a_val;
570 }
571
577 public function getContentHtml()
578 {
579 return $this->content_html;
580 }
581
586 public function read()
587 {
589
590 $query = "SELECT * FROM il_news_item WHERE id = " .
591 $ilDB->quote($this->getId(), "integer");
592 $set = $ilDB->query($query);
593 $rec = $ilDB->fetchAssoc($set);
594
595 $this->setTitle($rec["title"]);
596 $this->setContent($rec["content"]);
597 $this->setContextObjId((int) $rec["context_obj_id"]);
598 $this->setContextObjType($rec["context_obj_type"]);
599 $this->setContextSubObjId((int) $rec["context_sub_obj_id"]);
600 $this->setContextSubObjType($rec["context_sub_obj_type"]);
601 $this->setContentType($rec["content_type"]);
602 $this->setCreationDate($rec["creation_date"]);
603 $this->setUpdateDate($rec["update_date"]);
604 $this->setUserId($rec["user_id"]);
605 $this->setUpdateUserId($rec["update_user_id"]);
606 $this->setVisibility($rec["visibility"]);
607 $this->setContentLong($rec["content_long"]);
608 $this->setPriority($rec["priority"]);
609 $this->setContentIsLangVar($rec["content_is_lang_var"]);
610 $this->setContentTextIsLangVar((int) $rec["content_text_is_lang_var"]);
611 $this->setMobId($rec["mob_id"]);
612 $this->setPlaytime($rec["playtime"]);
613 $this->setMobPlayCounter($rec["mob_cnt_play"]);
614 $this->setMobDownloadCounter($rec["mob_cnt_download"]);
615 $this->setContentHtml($rec["content_html"]);
616 }
617
622 public function create()
623 {
625
626 // insert new record into db
627 $this->setId($ilDB->nextId("il_news_item"));
628 $ilDB->insert("il_news_item", array(
629 "id" => array("integer", $this->getId()),
630 "title" => array("text", $this->getTitle()),
631 "content" => array("clob", $this->getContent()),
632 "content_html" => array("integer", (int) $this->getContentHtml()),
633 "context_obj_id" => array("integer", (int) $this->getContextObjId()),
634 "context_obj_type" => array("text", $this->getContextObjType()),
635 "context_sub_obj_id" => array("integer", (int) $this->getContextSubObjId()),
636 "context_sub_obj_type" => array("text", $this->getContextSubObjType()),
637 "content_type" => array("text", $this->getContentType()),
638 "creation_date" => array("timestamp", ilUtil::now()),
639 "update_date" => array("timestamp", ilUtil::now()),
640 "user_id" => array("integer", $this->getUserId()),
641 "update_user_id" => array("integer", (int) $this->getUpdateUserId()),
642 "visibility" => array("text", $this->getVisibility()),
643 "content_long" => array("clob", $this->getContentLong()),
644 "priority" => array("integer", $this->getPriority()),
645 "content_is_lang_var" => array("integer", $this->getContentIsLangVar()),
646 "content_text_is_lang_var" => array("integer", (int) $this->getContentTextIsLangVar()),
647 "mob_id" => array("integer", $this->getMobId()),
648 "playtime" => array("text", $this->getPlaytime())
649 ));
650
651
652 $news_set = new ilSetting("news");
653 $max_items = $news_set->get("max_items");
654 if ($max_items <= 0) {
655 $max_items = 50;
656 }
657
658 // limit number of news
659 if ($this->getLimitation()) {
660 // Determine how many rows should be deleted
661 $query = "SELECT count(*) cnt " .
662 "FROM il_news_item " .
663 "WHERE " .
664 "context_obj_id = " . $ilDB->quote($this->getContextObjId(), "integer") .
665 " AND context_obj_type = " . $ilDB->quote($this->getContextObjType(), "text") .
666 " AND context_sub_obj_id = " . $ilDB->quote($this->getContextSubObjId(), "integer") .
667 " AND " . $ilDB->equals("context_sub_obj_type", $this->getContextSubObjType(), "text", true) . " ";
668
669 $set = $ilDB->query($query);
670 $rec = $ilDB->fetchAssoc($set);
671
672 // if we have more records than allowed, delete them
673 if (($rec["cnt"] > $max_items) && $this->getContextObjId() > 0) {
674 $query = "SELECT * " .
675 "FROM il_news_item " .
676 "WHERE " .
677 "context_obj_id = " . $ilDB->quote($this->getContextObjId(), "integer") .
678 " AND context_obj_type = " . $ilDB->quote($this->getContextObjType(), "text") .
679 " AND context_sub_obj_id = " . $ilDB->quote($this->getContextSubObjId(), "integer") .
680 " AND " . $ilDB->equals("context_sub_obj_type", $this->getContextSubObjType(), "text", true) .
681 " ORDER BY creation_date ASC";
682
683 $ilDB->setLimit($rec["cnt"] - $max_items);
684 $del_set = $ilDB->query($query);
685 while ($del_item = $ilDB->fetchAssoc($del_set)) {
686 $del_news = new ilNewsItem($del_item["id"]);
687 $del_news->delete();
688 }
689 }
690 }
691 }
692
699 public function update($a_as_new = false)
700 {
702
703 $fields = array(
704 "title" => array("text", $this->getTitle()),
705 "content" => array("clob", $this->getContent()),
706 "content_html" => array("integer", (int) $this->getContentHtml()),
707 "context_obj_id" => array("integer", $this->getContextObjId()),
708 "context_obj_type" => array("text", $this->getContextObjType()),
709 "context_sub_obj_id" => array("integer", $this->getContextSubObjId()),
710 "context_sub_obj_type" => array("text", $this->getContextSubObjType()),
711 "content_type" => array("text", $this->getContentType()),
712 "user_id" => array("integer", $this->getUserId()),
713 "update_user_id" => array("integer", (int) $this->getUpdateUserId()),
714 "visibility" => array("text", $this->getVisibility()),
715 "content_long" => array("clob", $this->getContentLong()),
716 "priority" => array("integer", $this->getPriority()),
717 "content_is_lang_var" => array("integer", $this->getContentIsLangVar()),
718 "content_text_is_lang_var" => array("integer", (int) $this->getContentTextIsLangVar()),
719 "mob_id" => array("integer", $this->getMobId()),
720 "mob_cnt_play" => array("integer", $this->getMobPlayCounter()),
721 "mob_cnt_download" => array("integer", $this->getMobDownloadCounter()),
722 "playtime" => array("text", $this->getPlaytime())
723 );
724
725 $now = ilUtil::now();
726 if ($a_as_new) {
727 $fields["creation_date"] = array("timestamp", $now);
728 $fields["update_date"] = array("timestamp", $now);
729 } else {
730 $fields["update_date"] = array("timestamp", $now);
731 }
732
733 $ilDB->update("il_news_item", $fields, array(
734 "id" => array("integer", $this->getId())
735 ));
736 }
737
738
743 public static function _getNewsItemsOfUser(
744 $a_user_id,
745 $a_only_public = false,
746 $a_prevent_aggregation = false,
747 $a_per = 0,
748 &$a_cnt = null
749 ) {
750 global $DIC;
751
752 $ilAccess = $DIC->access();
753
754 $fav_rep = new ilFavouritesDBRepository();
755
756 $news_item = new ilNewsItem();
757 $news_set = new ilSetting("news");
758
759 $per = $a_per;
760
761 include_once("./Services/News/classes/class.ilNewsSubscription.php");
762 include_once("./Services/Block/classes/class.ilBlockSetting.php");
763
764 // this is currently not used
765 $ref_ids = ilNewsSubscription::_getSubscriptionsOfUser($a_user_id);
766
767 if (ilObjUser::_lookupPref($a_user_id, "pd_items_news") != "n") {
768 // get all items of the personal desktop
769 $pd_items = $fav_rep->getFavouritesOfUser($a_user_id);
770 foreach ($pd_items as $item) {
771 if (!in_array($item["ref_id"], $ref_ids)) {
772 $ref_ids[] = $item["ref_id"];
773 }
774 }
775
776 // get all memberships
777 include_once 'Services/Membership/classes/class.ilParticipants.php';
778 $crs_mbs = ilParticipants::_getMembershipByType($a_user_id, 'crs');
779 $grp_mbs = ilParticipants::_getMembershipByType($a_user_id, 'grp');
780 $items = array_merge($crs_mbs, $grp_mbs);
781 foreach ($items as $i) {
782 $item_references = ilObject::_getAllReferences($i);
783 if (is_array($item_references) && count($item_references)) {
784 foreach ($item_references as $ref_id) {
785 if (!in_array($ref_id, $ref_ids)) {
786 $ref_ids[] = $ref_id;
787 }
788 }
789 }
790 }
791 }
792
793 $data = array();
794
795 foreach ($ref_ids as $ref_id) {
796 if (!$a_only_public) {
797 // this loop should not cost too much performance
798 $acc = $ilAccess->checkAccessOfUser($a_user_id, "read", "", $ref_id);
799
800 if (!$acc) {
801 continue;
802 }
803 }
804 if (ilNewsItem::getPrivateFeedId() != false) {
805 global $DIC;
806
807 $rbacsystem = $DIC->rbac()->system();
808 $acc = $rbacsystem->checkAccessOfUser(ilNewsItem::getPrivateFeedId(), "read", $ref_id);
809
810 if (!$acc) {
811 continue;
812 }
813 }
814
815 $obj_id = ilObject::_lookupObjId($ref_id);
816 $obj_type = ilObject::_lookupType($obj_id);
817 $news = $news_item->getNewsForRefId(
818 $ref_id,
819 $a_only_public,
820 false,
821 $per,
822 $a_prevent_aggregation,
823 false,
824 false,
825 false,
826 $a_user_id
827 );
828
829 // counter
830 if (!is_null($a_cnt)) {
831 $a_cnt[$ref_id] = count($news);
832 }
833
835 }
836
837 $data = ilUtil::sortArray($data, "creation_date", "desc", false, true);
838
839 return $data;
840 }
841
860 public function getNewsForRefId(
861 $a_ref_id,
862 $a_only_public = false,
863 $a_stopnesting = false,
864 $a_time_period = 0,
865 $a_prevent_aggregation = true,
866 $a_forum_group_sequences = false,
867 $a_no_auto_generated = false,
868 $a_ignore_date_filter = false,
869 $a_user_id = null,
870 $a_limit = 0,
871 $a_excluded = array()
872 ) {
873 $obj_id = ilObject::_lookupObjId($a_ref_id);
874 $obj_type = ilObject::_lookupType($obj_id);
875
876 // get starting date
877 $starting_date = "";
878 if ($obj_type == "grp" || $obj_type == "crs") {
879 // see #31471, #30687, and ilMembershipNotification
881 $obj_id,
882 'cont_use_news',
883 true
884 ) || (
886 $obj_id,
887 'cont_show_news',
888 true
890 $obj_id,
891 'news_timeline'
892 )
893 )) {
894 return [];
895 }
896
897 include_once("./Services/Block/classes/class.ilBlockSetting.php");
898 $hide_news_per_date = ilBlockSetting::_lookup(
899 "news",
900 "hide_news_per_date",
901 0,
902 $obj_id
903 );
904 if ($hide_news_per_date && !$a_ignore_date_filter) {
905 $starting_date = ilBlockSetting::_lookup(
906 "news",
907 "hide_news_date",
908 0,
909 $obj_id
910 );
911 }
912 }
913
914 if ($obj_type == "cat" && !$a_stopnesting) {
915 $news = $this->getAggregatedChildNewsData(
916 $a_ref_id,
917 $a_only_public,
918 $a_time_period,
919 $a_prevent_aggregation,
920 $starting_date,
921 $a_no_auto_generated
922 );
923 } elseif (($obj_type == "grp" || $obj_type == "crs") &&
924 !$a_stopnesting) {
925 $news = $this->getAggregatedNewsData(
926 $a_ref_id,
927 $a_only_public,
928 $a_time_period,
929 $a_prevent_aggregation,
930 $starting_date,
931 $a_no_auto_generated,
932 $a_user_id,
933 $a_limit,
934 $a_excluded
935 );
936 } else {
937 $news_item = new ilNewsItem();
938 $news_item->setContextObjId($obj_id);
939 $news_item->setContextObjType($obj_type);
940 $news = $news_item->queryNewsForContext(
941 $a_only_public,
942 $a_time_period,
943 $starting_date,
944 $a_no_auto_generated
945 );
946 $unset = array();
947 foreach ($news as $k => $v) {
948 if (!$a_only_public || $v["visibility"] == NEWS_PUBLIC ||
949 ($v["priority"] == 0 &&
951 "news",
952 "public_notifications",
953 0,
954 $obj_id
955 ))) {
956 $news[$k]["ref_id"] = $a_ref_id;
957 } else {
958 $unset[] = $k;
959 }
960 }
961 foreach ($unset as $un) {
962 unset($news[$un]);
963 }
964 }
965
966 if (!$a_prevent_aggregation) {
967 $news = $this->aggregateForums($news);
968 } elseif ($a_forum_group_sequences) {
969 $news = $this->aggregateForums($news, true);
970 }
971
972 return $news;
973 }
974
979 public function getAggregatedNewsData(
980 $a_ref_id,
981 $a_only_public = false,
982 $a_time_period = 0,
983 $a_prevent_aggregation = false,
984 $a_starting_date = "",
985 $a_no_auto_generated = false,
986 $a_user_id = null,
987 $a_limit = 0,
988 $a_exclude = array()
989 ) {
991 $ilAccess = $this->access;
992 $ilObjDataCache = $this->obj_data_cache;
993
994 // get news of parent object
995
996 $data = array();
997
998 // get subtree
999 $cur_node = $tree->getNodeData($a_ref_id);
1000
1001 // do not check for lft (materialized path)
1002 if ($cur_node) {
1003 $nodes = (array) $tree->getSubTree($cur_node, true);
1004 } else {
1005 $nodes = array();
1006 }
1007
1008 // preload object data cache
1009 $ref_ids = array();
1010 $obj_ids = array();
1011 foreach ($nodes as $node) {
1012 $ref_ids[] = $node["child"];
1013 $obj_ids[] = $node["obj_id"];
1014 }
1015
1016 $ilObjDataCache->preloadReferenceCache($ref_ids);
1017 if (!$a_only_public) {
1018 include_once "Services/Object/classes/class.ilObjectActivation.php";
1020 }
1021
1022 // no check, for which of the objects any news are available
1023 $news_obj_ids = ilNewsItem::filterObjIdsPerNews($obj_ids, $a_time_period, $a_starting_date);
1024 //$news_obj_ids = $obj_ids;
1025
1026 // get news for all subtree nodes
1027 $contexts = array();
1028 foreach ($nodes as $node) {
1029 // only go on, if news are available
1030 if (!in_array($node["obj_id"], $news_obj_ids)) {
1031 continue;
1032 }
1033
1034 if (!$a_only_public) {
1035 if (!$a_user_id) {
1036 $acc = $ilAccess->checkAccess("read", "", $node["child"]);
1037 } else {
1038 $acc = $ilAccess->checkAccessOfUser(
1039 $a_user_id,
1040 "read",
1041 "",
1042 $node["child"]
1043 );
1044 }
1045 if (!$acc) {
1046 continue;
1047 }
1048 }
1049
1050 $ref_id[$node["obj_id"]] = $node["child"];
1051 $contexts[] = array("obj_id" => $node["obj_id"],
1052 "obj_type" => $node["type"]);
1053 }
1054
1055 // sort and return
1056 $news = $this->queryNewsForMultipleContexts(
1057 $contexts,
1058 $a_only_public,
1059 $a_time_period,
1060 $a_starting_date,
1061 $a_no_auto_generated,
1062 $a_user_id,
1063 $a_limit,
1064 $a_exclude
1065 );
1066
1067 $to_del = array();
1068 foreach ($news as $k => $v) {
1069 $news[$k]["ref_id"] = $ref_id[$v["context_obj_id"]];
1070 }
1071
1073 $data = ilUtil::sortArray($data, "creation_date", "desc", false, true);
1074
1075 if (!$a_prevent_aggregation) {
1076 $data = $this->aggregateFiles($data, $a_ref_id);
1077 }
1078
1079 return $data;
1080 }
1081
1088 protected function aggregateForums($news, $a_group_posting_sequence = false)
1089 {
1090 $to_del = array();
1091 $forums = array();
1092
1093 // aggregate
1094 foreach ($news as $k => $v) {
1095 if ($a_group_posting_sequence && $last_aggregation_forum > 0 &&
1096 $last_aggregation_forum != $news[$k]["context_obj_id"]) {
1097 $forums[$last_aggregation_forum] = "";
1098 }
1099
1100 if ($news[$k]["context_obj_type"] == "frm") {
1101 if ($forums[$news[$k]["context_obj_id"]] == "") {
1102 // $forums[forum_id] = news_id;
1103 $forums[$news[$k]["context_obj_id"]] = $k;
1104 $last_aggregation_forum = $news[$k]["context_obj_id"];
1105 } else {
1106 $to_del[] = $k;
1107 }
1108
1109 $news[$k]["no_context_title"] = true;
1110
1111 // aggregate every forum into it's "k" news
1112 $news[$forums[$news[$k]["context_obj_id"]]]["aggregation"][$k]
1113 = $news[$k];
1114 $news[$k]["agg_ref_id"]
1115 = $news[$k]["ref_id"];
1116 $news[$k]["content"] = "";
1117 $news[$k]["content_long"] = "";
1118 }
1119 }
1120
1121 // delete double entries
1122 foreach ($to_del as $k) {
1123 unset($news[$k]);
1124 }
1125 //var_dump($news[14]["aggregation"]);
1126
1127
1128 return $news;
1129 }
1130
1137 protected function aggregateFiles($news, $a_ref_id)
1138 {
1139 $first_file = "";
1140 $to_del = array();
1141 foreach ($news as $k => $v) {
1142 // aggregate file related news
1143 if ($news[$k]["context_obj_type"] == "file") {
1144 if ($first_file == "") {
1145 $first_file = $k;
1146 } else {
1147 $to_del[] = $k;
1148 }
1149 $news[$first_file]["aggregation"][$k] = $news[$k];
1150 $news[$first_file]["agg_ref_id"] = $a_ref_id;
1151 $news[$first_file]["ref_id"] = $a_ref_id;
1152 }
1153 }
1154
1155 foreach ($to_del as $v) {
1156 unset($news[$v]);
1157 }
1158
1159 return $news;
1160 }
1161
1162
1174 protected function getAggregatedChildNewsData(
1175 $a_ref_id,
1176 $a_only_public = false,
1177 $a_time_period = 0,
1178 $a_prevent_aggregation = false,
1179 $a_starting_date = "",
1180 $a_no_auto_generated = false
1181 ) {
1183 $ilAccess = $this->access;
1184
1185 // get news of parent object
1186 $data = $this->getNewsForRefId(
1187 $a_ref_id,
1188 $a_only_public,
1189 true,
1190 $a_time_period,
1191 true,
1192 false,
1193 false,
1194 $a_no_auto_generated
1195 );
1196 foreach ($data as $k => $v) {
1197 $data[$k]["ref_id"] = $a_ref_id;
1198 }
1199
1200 // get childs
1201 $nodes = $tree->getChilds($a_ref_id);
1202
1203 // no check, for which of the objects any news are available
1204 $obj_ids = array();
1205 foreach ($nodes as $node) {
1206 $obj_ids[] = $node["obj_id"];
1207 }
1208 $news_obj_ids = ilNewsItem::filterObjIdsPerNews($obj_ids, $a_time_period, $a_starting_date);
1209 //$news_obj_ids = $obj_ids;
1210
1211 // get news for all subtree nodes
1212 $contexts = array();
1213 foreach ($nodes as $node) {
1214 // only go on, if news are available
1215 if (!in_array($node["obj_id"], $news_obj_ids)) {
1216 continue;
1217 }
1218
1219 if (!$a_only_public && !$ilAccess->checkAccess("read", "", $node["child"])) {
1220 continue;
1221 }
1222 $ref_id[$node["obj_id"]] = $node["child"];
1223 $contexts[] = array("obj_id" => $node["obj_id"],
1224 "obj_type" => $node["type"]);
1225 }
1226
1227 $news = $this->queryNewsForMultipleContexts(
1228 $contexts,
1229 $a_only_public,
1230 $a_time_period,
1231 $a_starting_date,
1232 $a_no_auto_generated
1233 );
1234 foreach ($news as $k => $v) {
1235 $news[$k]["ref_id"] = $ref_id[$v["context_obj_id"]];
1236 }
1238
1239 // sort and return
1240 $data = ilUtil::sortArray($data, "creation_date", "desc", false, true);
1241
1242 if (!$a_prevent_aggregation) {
1243 $data = $this->aggregateFiles($data, $a_ref_id);
1244 }
1245
1246 return $data;
1247 }
1248
1257 public function setContext(int $a_obj_id, string $a_obj_type, int $a_sub_obj_id = 0, string $a_sub_obj_type = "")
1258 {
1259 $this->setContextObjId($a_obj_id);
1260 $this->setContextObjType($a_obj_type);
1261 $this->setContextSubObjId($a_sub_obj_id);
1262 $this->setContextSubObjType($a_sub_obj_type);
1263 }
1264
1271 protected static function handleTimePeriod($a_time_period)
1272 {
1273 // time period is number of days
1274 if (is_numeric($a_time_period)) {
1275 if ($a_time_period > 0) {
1276 return date('Y-m-d H:i:s', time() - ($a_time_period * 24 * 60 * 60));
1277 }
1278 }
1279 // time period is datetime
1280 elseif (preg_match("/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/", $a_time_period)) {
1281 return $a_time_period;
1282 }
1283 // :TODO: what to return?
1284 }
1285
1295 public function queryNewsForContext(
1296 $a_for_rss_use = false,
1297 $a_time_period = 0,
1298 $a_starting_date = "",
1299 $a_no_auto_generated = false,
1300 $a_oldest_first = false,
1301 $a_limit = 0
1302 ) {
1303 $ilDB = $this->db;
1305 $lng = $this->lng;
1306
1307 $and = "";
1308 if ($a_time_period > 0) {
1309 $limit_ts = self::handleTimePeriod($a_time_period);
1310 $and = " AND creation_date >= " . $ilDB->quote($limit_ts, "timestamp") . " ";
1311 }
1312
1313 if ($a_starting_date != "") {
1314 $and .= " AND creation_date > " . $ilDB->quote($a_starting_date, "timestamp") . " ";
1315 }
1316
1317 if ($a_no_auto_generated) {
1318 $and .= " AND priority = 1 AND content_type = " . $ilDB->quote("text", "text") . " ";
1319 }
1320
1321 // this is changed with 4.1 (news table for lm pages)
1322 if ($this->getContextSubObjId() > 0) {
1323 $and .= " AND context_sub_obj_id = " . $ilDB->quote($this->getContextSubObjId(), "integer") .
1324 " AND context_sub_obj_type = " . $ilDB->quote($this->getContextSubObjType(), "text");
1325 }
1326
1327 $ordering = ($a_oldest_first)
1328 ? " creation_date ASC, id ASC "
1329 : " creation_date DESC, id DESC ";
1330
1331 if ($a_for_rss_use && ilNewsItem::getPrivateFeedId() == false) {
1332 $query = "SELECT * " .
1333 "FROM il_news_item " .
1334 " WHERE " .
1335 "context_obj_id = " . $ilDB->quote($this->getContextObjId(), "integer") .
1336 " AND context_obj_type = " . $ilDB->quote($this->getContextObjType(), "text") .
1337 $and .
1338 " ORDER BY " . $ordering;
1339 } elseif (ilNewsItem::getPrivateFeedId() != false) {
1340 $query = "SELECT il_news_item.* " .
1341 ", il_news_read.user_id user_read " .
1342 "FROM il_news_item LEFT JOIN il_news_read " .
1343 "ON il_news_item.id = il_news_read.news_id AND " .
1344 " il_news_read.user_id = " . $ilDB->quote(ilNewsItem::getPrivateFeedId(), "integer") .
1345 " WHERE " .
1346 "context_obj_id = " . $ilDB->quote($this->getContextObjId(), "integer") .
1347 " AND context_obj_type = " . $ilDB->quote($this->getContextObjType(), "text") .
1348 $and .
1349 " ORDER BY " . $ordering;
1350 } else {
1351 $query = "SELECT il_news_item.* " .
1352 ", il_news_read.user_id as user_read " .
1353 "FROM il_news_item LEFT JOIN il_news_read " .
1354 "ON il_news_item.id = il_news_read.news_id AND " .
1355 " il_news_read.user_id = " . $ilDB->quote($ilUser->getId(), "integer") .
1356 " WHERE " .
1357 "context_obj_id = " . $ilDB->quote($this->getContextObjId(), "integer") .
1358 " AND context_obj_type = " . $ilDB->quote($this->getContextObjType(), "text") .
1359 $and .
1360 " ORDER BY " . $ordering;
1361 }
1362 //echo $query;
1363 $set = $ilDB->query($query);
1364 $result = array();
1365 while ($rec = $ilDB->fetchAssoc($set)) {
1366 if ($a_limit > 0 && count($result) >= $a_limit) {
1367 continue;
1368 }
1369 if (!$a_for_rss_use || (ilNewsItem::getPrivateFeedId() != false) || ($rec["visibility"] == NEWS_PUBLIC ||
1370 ($rec["priority"] == 0 &&
1372 "news",
1373 "public_notifications",
1374 0,
1375 $rec["context_obj_id"]
1376 )))) {
1377 $result[$rec["id"]] = $rec;
1378 }
1379 }
1380
1381 // do we get data for rss and may the time limit by an issue?
1382 // do a second query without time limit.
1383 // this is not very performant, but I do not have a better
1384 // idea. The keep_rss_min setting is currently (Jul 2012) only set
1385 // by mediacasts
1386 if ($a_time_period != "" && $a_for_rss_use) {
1387 include_once("./Services/Block/classes/class.ilBlockSetting.php");
1388 $keep_rss_min = ilBlockSetting::_lookup(
1389 "news",
1390 "keep_rss_min",
1391 0,
1392 $this->getContextObjId()
1393 );
1394 if ($keep_rss_min > 0) {
1395 return $this->queryNewsForContext(
1396 true,
1397 0,
1398 $a_starting_date,
1399 $a_no_auto_generated,
1400 $a_oldest_first,
1401 $keep_rss_min
1402 );
1403 }
1404 }
1405
1406 return $result;
1407 }
1408
1415 public static function queryNewsByIds(array $a_news_ids)
1416 {
1417 global $DIC;
1418 $ilDB = $DIC->database();
1419 $news = array();
1420 $set = $ilDB->query("SELECT * FROM il_news_item " .
1421 " WHERE " . $ilDB->in("id", $a_news_ids, false, "integer"));
1422 while ($rec = $ilDB->fetchAssoc($set)) {
1423 $news[$rec["id"]] = $rec;
1424 }
1425 return $news;
1426 }
1427
1435 public function checkNewsExistsForObjects($objects, $a_time_period = 1)
1436 {
1437 $ilDB = $this->db;
1438
1439 $all = array();
1440
1441 $limit_ts = self::handleTimePeriod($a_time_period);
1442
1443 // are there any news items for relevant objects and?
1444 $query = $ilDB->query("SELECT id,context_obj_id,context_obj_type" .
1445 " FROM il_news_item" .
1446 " WHERE " . $ilDB->in("context_obj_id", array_keys($objects), false, "integer") .
1447 " AND creation_date >= " . $ilDB->quote($limit_ts, "timestamp"));
1448 while ($rec = $ilDB->fetchAssoc($query)) {
1449 if ($objects[$rec["context_obj_id"]]["type"] == $rec["context_obj_type"]) {
1450 $all[] = $rec["id"];
1451 }
1452 }
1453
1454 return $all;
1455 }
1456
1471 $a_contexts,
1472 $a_for_rss_use = false,
1473 $a_time_period = 0,
1474 $a_starting_date = "",
1475 $a_no_auto_generated = false,
1476 $a_user_id = null,
1477 $a_limit = 0,
1478 $a_exclude = array()
1479 ) {
1480 $ilDB = $this->db;
1482 $lng = $this->lng;
1483 $ilCtrl = $this->ctrl;
1484
1485 $and = "";
1486 if ($a_time_period > 0) {
1487 $limit_ts = self::handleTimePeriod($a_time_period);
1488 $and = " AND creation_date >= " . $ilDB->quote($limit_ts, "timestamp") . " ";
1489 }
1490
1491 if ($a_starting_date != "") {
1492 $and .= " AND creation_date > " . $ilDB->quote($a_starting_date, "timestamp") . " ";
1493 }
1494
1495 if ($a_no_auto_generated) {
1496 $and .= " AND priority = 1 AND content_type = " . $ilDB->quote("text", "text") . " ";
1497 }
1498
1499 if ($a_limit > 0) {
1500 $ilDB->setLimit($a_limit, 0);
1501 }
1502
1503 if (is_array($a_exclude) && count($a_exclude) > 0) {
1504 $and .= " AND " . $ilDB->in("id", $a_exclude, true, "integer") . " ";
1505 }
1506
1507 $ids = array();
1508 $type = array();
1509
1510 foreach ($a_contexts as $cont) {
1511 $ids[] = $cont["obj_id"];
1512 $type[$cont["obj_id"]] = $cont["obj_type"];
1513 }
1514
1515 if ($a_for_rss_use && ilNewsItem::getPrivateFeedId() == false) {
1516 $query = "SELECT * " .
1517 "FROM il_news_item " .
1518 " WHERE " .
1519 $ilDB->in("context_obj_id", $ids, false, "integer") . " " .
1520 $and .
1521 " ORDER BY creation_date DESC ";
1522 } elseif (ilNewsItem::getPrivateFeedId() != false) {
1523 $query = "SELECT il_news_item.* " .
1524 ", il_news_read.user_id as user_read " .
1525 "FROM il_news_item LEFT JOIN il_news_read " .
1526 "ON il_news_item.id = il_news_read.news_id AND " .
1527 " il_news_read.user_id = " . $ilDB->quote(ilNewsItem::getPrivateFeedId(), "integer") .
1528 " WHERE " .
1529 $ilDB->in("context_obj_id", $ids, false, "integer") . " " .
1530 $and .
1531 " ORDER BY creation_date DESC ";
1532 } else {
1533 if ($a_user_id) {
1534 $user_id = $a_user_id;
1535 } else {
1536 $user_id = $ilUser->getId();
1537 }
1538 $query = "SELECT il_news_item.* " .
1539 ", il_news_read.user_id as user_read " .
1540 "FROM il_news_item LEFT JOIN il_news_read " .
1541 "ON il_news_item.id = il_news_read.news_id AND " .
1542 " il_news_read.user_id = " . $ilDB->quote($user_id, "integer") .
1543 " WHERE " .
1544 $ilDB->in("context_obj_id", $ids, false, "integer") . " " .
1545 $and .
1546 " ORDER BY creation_date DESC ";
1547 }
1548
1549 $set = $ilDB->query($query);
1550 $result = array();
1551 while ($rec = $ilDB->fetchAssoc($set)) {
1552 if ($type[$rec["context_obj_id"]] == $rec["context_obj_type"]) {
1553 if (!$a_for_rss_use || ilNewsItem::getPrivateFeedId() != false || ($rec["visibility"] == NEWS_PUBLIC ||
1554 ($rec["priority"] == 0 &&
1556 "news",
1557 "public_notifications",
1558 0,
1559 $rec["context_obj_id"]
1560 )))) {
1561 $result[$rec["id"]] = $rec;
1562 }
1563 }
1564 }
1565
1566 return $result;
1567 }
1568
1569
1574 public static function _setRead($a_user_id, $a_news_id)
1575 {
1576 global $DIC;
1577
1578 $ilDB = $DIC->database();
1579 $ilAppEventHandler = $DIC["ilAppEventHandler"];
1580
1581 $ilDB->replace(
1582 "il_news_read",
1583 array(
1584 "user_id" => array("integer", $a_user_id),
1585 "news_id" => array("integer", $a_news_id)
1586 ),
1587 array()
1588 );
1589
1590 /*
1591 $ilDB->manipulate("DELETE FROM il_news_read WHERE ".
1592 "user_id = ".$ilDB->quote($a_user_id, "integer").
1593 " AND news_id = ".$ilDB->quote($a_news_id, "integer"));
1594 $ilDB->manipulate("INSERT INTO il_news_read (user_id, news_id) VALUES (".
1595 $ilDB->quote($a_user_id, "integer").",".
1596 $ilDB->quote($a_news_id, "integer").")");*/
1597
1598 $ilAppEventHandler->raise(
1599 "Services/News",
1600 "readNews",
1601 array("user_id" => $a_user_id, "news_ids" => array($a_news_id))
1602 );
1603 }
1604
1609 public static function _setUnread($a_user_id, $a_news_id)
1610 {
1611 global $DIC;
1612
1613 $ilDB = $DIC->database();
1614 $ilAppEventHandler = $DIC["ilAppEventHandler"];
1615
1616 $ilDB->manipulate("DELETE FROM il_news_read (user_id, news_id) VALUES (" .
1617 " WHERE user_id = " . $ilDB->quote($a_user_id, "integer") .
1618 " AND news_id = " . $ilDB->quote($a_news_id, "integer"));
1619
1620 $ilAppEventHandler->raise(
1621 "Services/News",
1622 "unreadNews",
1623 array("user_id" => $a_user_id, "news_ids" => array($a_news_id))
1624 );
1625 }
1626
1635 public static function mergeNews($n1, $n2)
1636 {
1637 foreach ($n2 as $id => $news) {
1638 $n1[$id] = $news;
1639 }
1640
1641 return $n1;
1642 }
1643
1649 public static function _getDefaultVisibilityForRefId($a_ref_id)
1650 {
1651 global $DIC;
1652
1653 $tree = $DIC->repositoryTree();
1654 $ilSetting = $DIC->settings();
1655
1656 include_once("./Services/Block/classes/class.ilBlockSetting.php");
1657
1658 $news_set = new ilSetting("news");
1659 $default_visibility = ($news_set->get("default_visibility") != "")
1660 ? $news_set->get("default_visibility")
1661 : "users";
1662
1663 if ($tree->isInTree($a_ref_id)) {
1664 $path = $tree->getPathFull($a_ref_id);
1665
1666 foreach ($path as $key => $row) {
1667 if (!in_array($row["type"], array("root", "cat","crs", "fold", "grp"))) {
1668 continue;
1669 }
1670
1672 "news",
1673 "default_visibility",
1674 0,
1675 $row["obj_id"]
1676 );
1677
1678 if ($visibility != "") {
1679 $default_visibility = $visibility;
1680 }
1681 }
1682 }
1683
1684 return $default_visibility;
1685 }
1686
1687
1692 public function delete()
1693 {
1694 $ilDB = $this->db;
1695
1696 // delete il_news_read entries
1697 $ilDB->manipulate("DELETE FROM il_news_read " .
1698 " WHERE news_id = " . $ilDB->quote($this->getId(), "integer"));
1699
1700 // delete multimedia object
1701 $mob = $this->getMobId();
1702
1703 // delete
1704 $query = "DELETE FROM il_news_item" .
1705 " WHERE id = " . $ilDB->quote($this->getId(), "integer");
1706 $ilDB->manipulate($query);
1707
1708 // delete mob after news, to have a "mob usage" of 0
1709 if ($mob > 0 and ilObject::_exists($mob)) {
1710 include_once("./Services/MediaObjects/classes/class.ilObjMediaObject.php");
1711 $mob = new ilObjMediaObject($mob);
1712 $mob->delete();
1713 }
1714 }
1715
1720 public static function getNewsOfContext(
1721 $a_context_obj_id,
1722 $a_context_obj_type,
1723 $a_context_sub_obj_id = 0,
1724 $a_context_sub_obj_type = ""
1725 ) {
1726 global $DIC;
1727
1728 $ilDB = $DIC->database();
1729
1730 if ($a_context_obj_id == 0 || $a_context_obj_type == "") {
1731 return [];
1732 }
1733
1734 if ($a_context_sub_obj_id > 0) {
1735 $and = " AND context_sub_obj_id = " . $ilDB->quote($a_context_sub_obj_id, "integer") .
1736 " AND context_sub_obj_type = " . $ilDB->quote($a_context_sub_obj_type, "text");
1737 }
1738
1739 // get news records
1740 $query = "SELECT * FROM il_news_item" .
1741 " WHERE context_obj_id = " . $ilDB->quote($a_context_obj_id, "integer") .
1742 " AND context_obj_type = " . $ilDB->quote($a_context_obj_type, "text") .
1743 $and;
1744
1745 $news_set = $ilDB->query($query);
1746
1747 $news_arr = [];
1748 while ($news = $ilDB->fetchAssoc($news_set)) {
1749 $news_arr[] = new ilNewsItem($news["id"]);
1750 }
1751 return $news_arr;
1752 }
1753
1758 public static function deleteNewsOfContext(
1759 $a_context_obj_id,
1760 $a_context_obj_type,
1761 $a_context_sub_obj_id = 0,
1762 $a_context_sub_obj_type = ""
1763 ) {
1764 foreach (self::getNewsOfContext(
1765 $a_context_obj_id,
1766 $a_context_obj_type,
1767 $a_context_sub_obj_id,
1768 $a_context_sub_obj_type
1769 ) as $n) {
1770 $n->delete();
1771 }
1772 }
1773
1778 public static function _lookupTitle($a_news_id)
1779 {
1780 global $DIC;
1781
1782 $ilDB = $DIC->database();
1783
1784 $query = "SELECT title FROM il_news_item WHERE id = " .
1785 $ilDB->quote($a_news_id, "integer");
1786 $set = $ilDB->query($query);
1787 $rec = $ilDB->fetchAssoc($set);
1788 return $rec["title"];
1789 }
1790
1795 public static function _lookupVisibility($a_news_id)
1796 {
1797 global $DIC;
1798
1799 $ilDB = $DIC->database();
1800
1801 $query = "SELECT visibility FROM il_news_item WHERE id = " .
1802 $ilDB->quote($a_news_id, "integer");
1803 $set = $ilDB->query($query);
1804 $rec = $ilDB->fetchAssoc($set);
1805
1806 return $rec["visibility"];
1807 }
1808
1813 public static function _lookupMobId($a_news_id)
1814 {
1815 global $DIC;
1816
1817 $ilDB = $DIC->database();
1818
1819 $query = "SELECT mob_id FROM il_news_item WHERE id = " .
1820 $ilDB->quote($a_news_id, "integer");
1821 $set = $ilDB->query($query);
1822 $rec = $ilDB->fetchAssoc($set);
1823 return $rec["mob_id"];
1824 }
1825
1830 public static function filterObjIdsPerNews($a_obj_ids, $a_time_period = 0, $a_starting_date = "", $a_ending_date = '', $ignore_period = false)
1831 {
1832 global $DIC;
1833
1834 $ilDB = $DIC->database();
1835
1836 $and = "";
1837 if ($a_time_period > 0) {
1838 $limit_ts = self::handleTimePeriod($a_time_period);
1839 $and = " AND creation_date >= " . $ilDB->quote($limit_ts, "timestamp") . " ";
1840 }
1841
1842 if ($a_starting_date != "") {
1843 $and .= " AND creation_date >= " . $ilDB->quote($a_starting_date, "timestamp");
1844 }
1845
1846 $query = "SELECT DISTINCT(context_obj_id) AS obj_id FROM il_news_item" .
1847 " WHERE " . $ilDB->in("context_obj_id", $a_obj_ids, false, "integer") . " " . $and;
1848 //" WHERE context_obj_id IN (".implode(ilUtil::quoteArray($a_obj_ids),",").")".$and;
1849
1850 $set = $ilDB->query($query);
1851 $objs = array();
1852 while ($rec = $ilDB->fetchAssoc($set)) {
1853 $objs[] = $rec["obj_id"];
1854 }
1855
1856 return $objs;
1857 }
1858
1862 public static function determineNewsTitleByNewsId($a_news_id, $a_agg_ref_id = 0, $a_aggregation = "")
1863 {
1864 global $DIC;
1865
1866 $ilDB = $DIC->database();
1867
1868 $query = "SELECT context_obj_type, content_is_lang_var, title FROM il_news_item WHERE id = " .
1869 $ilDB->quote($a_news_id, "integer");
1870 $set = $ilDB->query($query);
1871 $rec = $ilDB->fetchAssoc($set);
1872
1874 $rec["context_obj_type"],
1875 $rec["title"],
1876 $rec["content_is_lang_var"],
1877 $a_agg_ref_id,
1878 $a_aggregation
1879 );
1880 }
1881
1886 public static function determineNewsTitle(
1887 $a_context_obj_type,
1888 $a_title,
1889 $a_content_is_lang_var,
1890 $a_agg_ref_id = 0,
1891 $a_aggregation = ""
1892 ) {
1893 global $DIC;
1894
1895 $lng = $DIC->language();
1896 $obj_definition = $DIC["objDefinition"];
1897
1898 if ($a_agg_ref_id > 0) {
1899 $cnt = count($a_aggregation);
1900
1901 // forums
1902 if ($a_context_obj_type == "frm") {
1903 if ($cnt > 1) {
1904 return sprintf($lng->txt("news_x_postings"), $cnt);
1905 } else {
1906 return $lng->txt("news_1_postings");
1907 }
1908 } else { // files
1909 $up_cnt = $cr_cnt = 0;
1910 foreach ($a_aggregation as $item) {
1911 if ($item["title"] == "file_updated") {
1912 $up_cnt++;
1913 } else {
1914 $cr_cnt++;
1915 }
1916 }
1917 $sep = "";
1918 if ($cr_cnt == 1) {
1919 $tit = $lng->txt("news_1_file_created");
1920 $sep = "<br />";
1921 } elseif ($cr_cnt > 1) {
1922 $tit = sprintf($lng->txt("news_x_files_created"), $cr_cnt);
1923 $sep = "<br />";
1924 }
1925 if ($up_cnt == 1) {
1926 $tit .= $sep . $lng->txt("news_1_file_updated");
1927 } elseif ($up_cnt > 1) {
1928 $tit .= $sep . sprintf($lng->txt("news_x_files_updated"), $up_cnt);
1929 }
1930 return $tit;
1931 }
1932 } else {
1933 if ($a_content_is_lang_var) {
1934 if ($obj_definition->isPlugin($a_context_obj_type)) {
1935 return ilObjectPlugin::lookupTxtById($a_context_obj_type, $a_title);
1936 }
1937 return $lng->txt($a_title);
1938 } else {
1939 return $a_title;
1940 }
1941 }
1942
1943 return "";
1944 }
1945
1950 public static function determineNewsContent($a_context_obj_type, $a_content, $a_is_lang_var)
1951 {
1952 global $DIC;
1953
1954 $lng = $DIC->language();
1955 $obj_definition = $DIC["objDefinition"];
1956
1957 if ($a_is_lang_var) {
1958 if ($obj_definition->isPlugin($a_context_obj_type)) {
1959 return ilObjectPlugin::lookupTxtById($a_context_obj_type, $a_content);
1960 }
1961 $lng->loadLanguageModule($a_context_obj_type);
1962 return $lng->txt($a_content);
1963 } else {
1964 return $a_content;
1965 }
1966 }
1967
1968
1969
1974 public static function getFirstNewsIdForContext(
1975 $a_context_obj_id,
1976 $a_context_obj_type,
1977 $a_context_sub_obj_id = "",
1978 $a_context_sub_obj_type = ""
1979 ) {
1980 global $DIC;
1981
1982 $ilDB = $DIC->database();
1983
1984 // Determine how many rows should be deleted
1985 $query = "SELECT * " .
1986 "FROM il_news_item " .
1987 "WHERE " .
1988 "context_obj_id = " . $ilDB->quote($a_context_obj_id, "integer") .
1989 " AND context_obj_type = " . $ilDB->quote($a_context_obj_type, "text") .
1990 " AND context_sub_obj_id = " . $ilDB->quote($a_context_sub_obj_id, "integer") .
1991 " AND " . $ilDB->equals("context_sub_obj_type", $a_context_sub_obj_type, "text", true);
1992
1993 $set = $ilDB->query($query);
1994 $rec = $ilDB->fetchAssoc($set);
1995
1996 return $rec["id"];
1997 }
1998
2003 public static function getLastNewsIdForContext(
2004 $a_context_obj_id,
2005 $a_context_obj_type,
2006 $a_context_sub_obj_id = "",
2007 $a_context_sub_obj_type = "",
2008 $a_only_today = false
2009 ) {
2010 global $DIC;
2011
2012 $ilDB = $DIC->database();
2013
2014 // Determine how many rows should be deleted
2015 $query = "SELECT id, update_date " .
2016 "FROM il_news_item " .
2017 "WHERE " .
2018 "context_obj_id = " . $ilDB->quote($a_context_obj_id, "integer") .
2019 " AND context_obj_type = " . $ilDB->quote($a_context_obj_type, "text") .
2020 " AND context_sub_obj_id = " . $ilDB->quote($a_context_sub_obj_id, "integer") .
2021 " AND " . $ilDB->equals("context_sub_obj_type", $a_context_sub_obj_type, "text", true) .
2022 " ORDER BY update_date DESC";
2023
2024 $ilDB->setLimit(1);
2025 $set = $ilDB->query($query);
2026 $rec = $ilDB->fetchAssoc($set);
2027
2028 $id = (int) $rec["id"];
2029 if ($a_only_today) {
2030 $now = ilUtil::now();
2031 if (substr($now, 0, 10) != substr($rec["update_date"], 0, 10)) {
2032 $id = 0;
2033 }
2034 }
2035
2036 return $id;
2037 }
2038
2039
2044 public static function _lookupMediaObjectUsages($a_mob_id)
2045 {
2046 global $DIC;
2047
2048 $ilDB = $DIC->database();
2049
2050 $query = "SELECT * " .
2051 "FROM il_news_item " .
2052 "WHERE " .
2053 " mob_id = " . $ilDB->quote($a_mob_id, "integer");
2054
2055 $usages = array();
2056 $set = $ilDB->query($query);
2057 while ($rec = $ilDB->fetchAssoc($set)) {
2058 $usages[$rec["id"]] = array("type" => "news", "id" => $rec["id"]);
2059 }
2060
2061 return $usages;
2062 }
2063
2068 public static function _lookupContextObjId($a_news_id)
2069 {
2070 global $DIC;
2071
2072 $ilDB = $DIC->database();
2073
2074 $query = "SELECT * " .
2075 "FROM il_news_item " .
2076 "WHERE " .
2077 " id = " . $ilDB->quote($a_news_id, "integer");
2078 $set = $ilDB->query($query);
2079 $rec = $ilDB->fetchAssoc($set);
2080
2081 return $rec["context_obj_id"];
2082 }
2083
2087 public static function _lookupDefaultPDPeriod()
2088 {
2089 $news_set = new ilSetting("news");
2090 $per = $news_set->get("pd_period");
2091 if ($per == 0) {
2092 $per = 30;
2093 }
2094
2095 return $per;
2096 }
2097
2101 public static function _lookupUserPDPeriod($a_user_id)
2102 {
2103 $news_set = new ilSetting("news");
2104 $allow_shorter_periods = $news_set->get("allow_shorter_periods");
2105 $allow_longer_periods = $news_set->get("allow_longer_periods");
2106 $default_per = ilNewsItem::_lookupDefaultPDPeriod();
2107
2108 include_once("./Services/Block/classes/class.ilBlockSetting.php");
2110 "pdnews",
2111 "news_pd_period",
2112 $a_user_id,
2113 0
2114 );
2115
2116 // news period information
2117 if ($per <= 0 ||
2118 (!$allow_shorter_periods && ($per < $default_per)) ||
2119 (!$allow_longer_periods && ($per > $default_per))
2120 ) {
2121 $per = $default_per;
2122 }
2123
2124 return $per;
2125 }
2126
2130 public static function _lookupRSSPeriod()
2131 {
2132 $news_set = new ilSetting("news");
2133 $rss_period = $news_set->get("rss_period");
2134 if ($rss_period == 0) { // default to two weeks
2135 $rss_period = 14;
2136 }
2137 return $rss_period;
2138 }
2139
2143 public static function setPrivateFeedId($a_userId)
2144 {
2145 ilNewsItem::$privFeedId = $a_userId;
2146 }
2147
2151 public static function getPrivateFeedId()
2152 {
2154 }
2155
2164 public function deliverMobFile($a_purpose = "Standard", $a_increase_download_cnt = false)
2165 {
2166 $mob = $this->getMobId();
2167 include_once("./Services/MediaObjects/classes/class.ilObjMediaObject.php");
2168 $mob = new ilObjMediaObject($mob);
2169 $mob_dir = ilObjMediaObject::_getDirectory($mob->getId());
2170
2171 // check purpose
2172 if (!$mob->hasPurposeItem($a_purpose)) {
2173 return false;
2174 }
2175
2176 $m_item = $mob->getMediaItem($a_purpose);
2177 if ($m_item->getLocationType() != "Reference") {
2178 $file = $mob_dir . "/" . $m_item->getLocation();
2179 if (file_exists($file) && is_file($file)) {
2180 if ($a_increase_download_cnt) {
2181 $this->increaseDownloadCounter();
2182 }
2183 ilUtil::deliverFile($file, $m_item->getLocation(), "", false, false, false);
2184 return true;
2185 } else {
2186 ilUtil::sendFailure("File not found!", true);
2187 return false;
2188 }
2189 } else {
2190 if ($a_increase_download_cnt) {
2191 $this->increaseDownloadCounter();
2192 }
2193 ilUtil::redirect($m_item->getLocation());
2194 }
2195 }
2196
2201 public function increaseDownloadCounter()
2202 {
2203 $ilDB = $this->db;
2204
2205 $cnt = $this->getMobDownloadCounter();
2206 $cnt++;
2207 $this->setMobDownloadCounter($cnt);
2208 $ilDB->manipulate(
2209 "UPDATE il_news_item SET " .
2210 " mob_cnt_download = " . $ilDB->quote($cnt, "integer") .
2211 " WHERE id = " . $ilDB->quote($this->getId(), "integer")
2212 );
2213 }
2214
2220 public function increasePlayCounter()
2221 {
2222 $ilDB = $this->db;
2223
2224 $cnt = $this->getMobPlayCounter();
2225 $cnt++;
2226 $this->setMobPlayCounter($cnt);
2227 $ilDB->manipulate(
2228 "UPDATE il_news_item SET " .
2229 " mob_cnt_play = " . $ilDB->quote($cnt, "integer") .
2230 " WHERE id = " . $ilDB->quote($this->getId(), "integer")
2231 );
2232 }
2233
2240 public static function prepareNewsDataFromCache($a_cres)
2241 {
2242 global $DIC;
2243
2244 $ilDB = $DIC->database();
2245
2246 $data = $a_cres;
2247 $news_ids = array_keys($data);
2248 $set = $ilDB->query("SELECT id FROM il_news_item " .
2249 " WHERE " . $ilDB->in("id", $news_ids, false, "integer"));
2250 $existing_ids = array();
2251 while ($rec = $ilDB->fetchAssoc($set)) {
2252 $existing_ids[] = $rec["id"];
2253 }
2254 //var_dump($existing_ids);
2255 $existing_news = array();
2256 foreach ($data as $k => $v) {
2257 if (in_array($k, $existing_ids)) {
2258 $existing_news[$k] = $v;
2259 }
2260 }
2261
2262 //var_dump($data);
2263 //var_dump($existing_news);
2264
2265 return $existing_news;
2266 }
2267}
$result
user()
Definition: user.php:4
$n
Definition: RandomTest.php:85
An exception for terminatinating execution or to throw for unit testing.
const NEWS_PUBLIC
static _lookup($a_type, $a_setting, $a_user=0, $a_block_id=0)
Lookup setting from database.
static _lookupContainerSetting($a_id, $a_keyword, $a_default_value=null)
Lookup a container setting.
update($a_as_new=false)
Update item in database.
deliverMobFile($a_purpose="Standard", $a_increase_download_cnt=false)
Deliver mob file.
static _getDefaultVisibilityForRefId($a_ref_id)
Get default visibility for reference id.
static _lookupVisibility($a_news_id)
Lookup News Visibility.
getNewsForRefId( $a_ref_id, $a_only_public=false, $a_stopnesting=false, $a_time_period=0, $a_prevent_aggregation=true, $a_forum_group_sequences=false, $a_no_auto_generated=false, $a_ignore_date_filter=false, $a_user_id=null, $a_limit=0, $a_excluded=array())
Get News For Ref Id.
static _lookupTitle($a_news_id)
Lookup News Title.
setContent($a_content)
Set Content.
__construct($a_id=0)
Constructor.
static getPrivateFeedId()
static _lookupRSSPeriod()
setMobId($a_mob_id)
Set MobId.
getContentIsLangVar()
Get ContentIsLangVar.
static _setUnread($a_user_id, $a_news_id)
Set item unread.
setCreationDate($a_creation_date)
Set CreationDate.
static _lookupMobId($a_news_id)
Lookup mob id.
static getLastNewsIdForContext( $a_context_obj_id, $a_context_obj_type, $a_context_sub_obj_id="", $a_context_sub_obj_type="", $a_only_today=false)
Get last news id of news set related to a certain context.
read()
Read item from database.
setMobPlayCounter($a_val)
Set mob play counter.
getUpdateDate()
Get UpdateDate.
static handleTimePeriod($a_time_period)
Convert time period for DB-queries.
getPlaytime()
Get Playtime.
getAggregatedNewsData( $a_ref_id, $a_only_public=false, $a_time_period=0, $a_prevent_aggregation=false, $a_starting_date="", $a_no_auto_generated=false, $a_user_id=null, $a_limit=0, $a_exclude=array())
Get news aggregation (e.g.
aggregateForums($news, $a_group_posting_sequence=false)
setContentIsLangVar($a_content_is_lang_var=0)
Set ContentIsLangVar.
getContextSubObjId()
Get ContextSubObjId.
getContextSubObjType()
Get ContextSubObjType.
setUserId($a_user_id)
Set UserId.
static deleteNewsOfContext( $a_context_obj_id, $a_context_obj_type, $a_context_sub_obj_id=0, $a_context_sub_obj_type="")
Delete all news of a context.
setContextObjId($a_context_obj_id)
Set ContextObjId.
getMobId()
Get MobId.
setContextSubObjId($a_context_sub_obj_id)
Set ContextSubObjId.
checkNewsExistsForObjects($objects, $a_time_period=1)
static getNewsOfContext( $a_context_obj_id, $a_context_obj_type, $a_context_sub_obj_id=0, $a_context_sub_obj_type="")
Get all news of a context.
increasePlayCounter()
Increase play counter.
setLimitation($a_limitation)
Set Limitation for number of items.
increaseDownloadCounter()
Increase download counter.
static _setRead($a_user_id, $a_news_id)
Set item read.
getVisibility()
Get Visibility.
static filterObjIdsPerNews($a_obj_ids, $a_time_period=0, $a_starting_date="", $a_ending_date='', $ignore_period=false)
Checks whether news are available for.
setUpdateDate($a_update_date)
Set UpdateDate.
getTitle()
Get Title.
setContext(int $a_obj_id, string $a_obj_type, int $a_sub_obj_id=0, string $a_sub_obj_type="")
Set context for news.
static determineNewsContent($a_context_obj_type, $a_content, $a_is_lang_var)
Determine new content.
setTitle($a_title)
Set Title.
static prepareNewsDataFromCache($a_cres)
Prepare news data from cache.
getContentType()
Get ContentType.
setUpdateUserId($a_val)
Set update user id.
getLimitation()
Get Limitation for number of items.
static _getNewsItemsOfUser( $a_user_id, $a_only_public=false, $a_prevent_aggregation=false, $a_per=0, &$a_cnt=null)
Get all news items for a user.
setPlaytime($a_playtime)
Set Playtime.
getContent()
Get Content.
queryNewsForContext( $a_for_rss_use=false, $a_time_period=0, $a_starting_date="", $a_no_auto_generated=false, $a_oldest_first=false, $a_limit=0)
Query news for a context.
static _lookupUserPDPeriod($a_user_id)
setContextObjType($a_context_obj_type)
Set ContextObjType.
setPriority($a_priority=1)
Set Priority.
setContentLong($a_content_long)
Set ContentLong.
static determineNewsTitleByNewsId($a_news_id, $a_agg_ref_id=0, $a_aggregation="")
Determine title for news item entry.
static $privFeedId
static queryNewsByIds(array $a_news_ids)
Query news data by news ids.
static setPrivateFeedId($a_userId)
getContentLong()
Get ContentLong.
static mergeNews($n1, $n2)
Merges two sets of news.
static _lookupDefaultPDPeriod()
static determineNewsTitle( $a_context_obj_type, $a_title, $a_content_is_lang_var, $a_agg_ref_id=0, $a_aggregation="")
Determine title for news item entry.
setContentTextIsLangVar($a_val=0)
Set content text ist lang var.
getPriority()
Get Priority.
setVisibility($a_visibility="users")
Set Visibility.
getContextObjId()
Get ContextObjId.
setId($a_id)
Set Id.
setContentType($a_content_type="text")
Set ContentType.
getMobPlayCounter()
Get mob play counter.
queryNewsForMultipleContexts( $a_contexts, $a_for_rss_use=false, $a_time_period=0, $a_starting_date="", $a_no_auto_generated=false, $a_user_id=null, $a_limit=0, $a_exclude=array())
Query News for multiple Contexts.
setContextSubObjType($a_context_sub_obj_type)
Set ContextSubObjType.
setContentHtml($a_val)
Is content HTML (tiny used?)
getAggregatedChildNewsData( $a_ref_id, $a_only_public=false, $a_time_period=0, $a_prevent_aggregation=false, $a_starting_date="", $a_no_auto_generated=false)
Get news aggregation for child objects (e.g.
static getFirstNewsIdForContext( $a_context_obj_id, $a_context_obj_type, $a_context_sub_obj_id="", $a_context_sub_obj_type="")
Get first new id of news set related to a certain context.
getMobDownloadCounter()
Get mob download counter.
setMobDownloadCounter($a_val)
Set mob download counter.
getUserId()
Get UserId.
getCreationDate()
Get CreationDate.
getContentTextIsLangVar()
Get content text ist lang var.
aggregateFiles($news, $a_ref_id)
static _lookupContextObjId($a_news_id)
Context Object ID.
getContextObjType()
Get ContextObjType.
getUpdateUserId()
Get update user id.
getContentHtml()
Get content as html.
static _lookupMediaObjectUsages($a_mob_id)
Lookup media object usage(s)
static _getSubscriptionsOfUser($a_user_id)
Get subscriptions of user.
Class ilObjMediaObject.
static _getDirectory($a_mob_id)
Get absolute directory.
static _lookupPref($a_usr_id, $a_keyword)
static preloadData(array $a_ref_ids)
Preload data to internal cache.
static lookupTxtById($plugin_id, $lang_var)
static _lookupObjId($a_id)
static _getAllReferences($a_id)
get all reference ids of object
static _exists($a_id, $a_reference=false, $a_type=null)
checks if an object exists in object_data@access public
static _lookupType($a_id, $a_reference=false)
lookup object type
static _getMembershipByType($a_usr_id, $a_type, $a_only_member_role=false)
get membership by type Get course or group membership
ILIAS Setting Class.
static sortArray( $array, $a_array_sortby, $a_array_sortorder=0, $a_numeric=false, $a_keep_keys=false)
sortArray
static redirect($a_script)
static sendFailure($a_info="", $a_keep=false)
Send Failure Message to Screen.
static now()
Return current timestamp in Y-m-d H:i:s format.
static deliverFile( $a_file, $a_filename, $a_mime='', $isInline=false, $removeAfterDelivery=false, $a_exit_after=true)
deliver file for download via browser.
global $DIC
Definition: goto.php:24
$ilUser
Definition: imgupload.php:18
$i
Definition: metadata.php:24
global $ilSetting
Definition: privfeed.php:17
$query
$type
global $ilDB
$data
Definition: storeScorm.php:23