1<?php
2
3/* Copyright (c) 1998-2010 ILIAS open source, Extended GPL, see docs/LICENSE */
4
5include_once("./Services/News/classes/class.ilNewsItem.php");
6include_once("./Services/Feeds/classes/class.ilFeedItem.php");
7include_once("./Services/Feeds/classes/class.ilFeedWriter.php");
8
9/** @defgroup ServicesFeeds Services/Feeds
10 */
11
12/**
13* Feed writer for objects.
14*
15* @author Alex Killing <alex.killing@gmx.de>
16* @version $Id$
17* @ingroup ServicesFeeds
18*/
19class ilObjectFeedWriter extends ilFeedWriter
20{
21    /**
22     * @var ilSetting
23     */
24    protected $settings;
25
26    /**
27     * @var ilLanguage
28     */
29    protected $lng;
30
31    public function __construct($a_ref_id, $a_userid = false, $a_purpose = false)
32    {
33        global $DIC;
34
35        $this->settings = $DIC->settings();
36        $this->lng = $DIC->language();
37        $ilSetting = $DIC->settings();
38        $lng = $DIC->language();
39
40        parent::__construct();
41
42        if ($a_ref_id <= 0) {
43            return;
44        }
45
46        include_once("./Services/Block/classes/class.ilBlockSetting.php");
47        $news_set = new ilSetting("news");
48        if (!$news_set->get("enable_rss_for_internal")) {
49            return;
50        }
51        $obj_id = ilObject::_lookupObjId($a_ref_id);
52        $obj_type = ilObject::_lookupType($obj_id);
53        $obj_title = ilObject::_lookupTitle($obj_id);
54
55        if (!ilBlockSetting::_lookup("news", "public_feed", 0, $obj_id)) {
56            return;
57        }
58
59        // path
60        $loc = $this->getContextPath($a_ref_id);
61
62        if ($ilSetting->get('short_inst_name') != "") {
63            $this->setChannelTitle($ilSetting->get('short_inst_name') . " - " .
64                $this->prepareStr($loc . " " . $obj_title));
65        } else {
66            $this->setChannelTitle("ILIAS" . " - " .
67                $this->prepareStr($loc . " " . $obj_title . ($a_purpose ? " - " . $a_purpose : "")));
68        }
69        $this->setChannelAbout(ILIAS_HTTP_PATH);
70        $this->setChannelLink(ILIAS_HTTP_PATH);
71        // not nice, to do: general solution
72        if ($obj_type == "mcst") {
73            include_once("./Modules/MediaCast/classes/class.ilObjMediaCastAccess.php");
74
75            if (!ilObjMediaCastAccess::_lookupOnline($obj_id)) {
76                $lng->loadLanguageModule("mcst");
77
78                $feed_item = new ilFeedItem();
79                $feed_item->setTitle($lng->txt("mcst_media_cast_not_online"));
80                $feed_item->setDescription($lng->txt("mcst_media_cast_not_online_text"));
81                $feed_item->setLink(ILIAS_HTTP_PATH . "/goto.php?client_id=" . CLIENT_ID .
82                    "&amp;target=" . $item["context_obj_type"]);
83                $this->addItem($feed_item);
84                return;
85            }
86        }
87
88
89        $rss_period = ilNewsItem::_lookupRSSPeriod();
90
91        ilNewsItem::setPrivateFeedId($a_userid);
92        $news_item = new ilNewsItem();
93        $news_item->setContextObjId($obj_id);
94        $news_item->setContextObjType($obj_type);
95        $items = $news_item->getNewsForRefId($a_ref_id, true, false, $rss_period, true);
96
97        if ($a_purpose) {
98            include_once("./Services/MediaObjects/classes/class.ilMediaItem.php");
99        }
100
101        $i = 0;
102        foreach ($items as $item) {
103            $i++;
104
105            if ($a_purpose != false && $obj_type == "mcst") {
106                $mob = ilMediaItem::_getMediaItemsOfMObId($item["mob_id"], $a_purpose);
107
108                if ($mob == false) {
109                    continue;
110                }
111            }
112
113            $obj_title = ilObject::_lookupTitle($item["context_obj_id"]);
114
115            $feed_item = new ilFeedItem();
116
117            $title = ilNewsItem::determineNewsTitle(
118                $item["context_obj_type"],
119                $item["title"],
120                $item["content_is_lang_var"],
121                $item["agg_ref_id"],
122                $item["aggregation"]
123            );
124
125            $loc = "";
126
127            if ($news_set->get("rss_title_format") == "news_obj") {
128                $sep = (trim($this->prepareStr($loc)) == "")
129                    ? ""
130                    : " ";
131                $feed_item->setTitle($this->prepareStr($title) . " (" . $this->prepareStr($loc) . $sep . $this->prepareStr($obj_title) .
132                    ")");
133            } else {
134                $feed_item->setTitle($this->prepareStr($loc) . " " . $this->prepareStr($obj_title) .
135                    ": " . $this->prepareStr($title));
136            }
137            $feed_item->setDescription($this->prepareStr(nl2br(
138                ilNewsItem::determineNewsContent($item["context_obj_type"], $item["content"], $item["content_text_is_lang_var"])
139            )));
140
141            // lm hack, not nice
142            if (in_array($item["context_obj_type"], array("lm")) && $item["context_sub_obj_type"] == "pg"
143                && $item["context_sub_obj_id"] > 0) {
144                $feed_item->setLink(ILIAS_HTTP_PATH . "/goto.php?client_id=" . CLIENT_ID .
145                    "&amp;target=pg_" . $item["context_sub_obj_id"] . "_" . $item["ref_id"]);
146            } elseif ($item["context_obj_type"] == "wiki" && $item["context_sub_obj_type"] == "wpg"
147                && $item["context_sub_obj_id"] > 0) {
148                include_once("./Modules/Wiki/classes/class.ilWikiPage.php");
149                include_once("./Modules/Wiki/classes/class.ilWikiUtil.php");
150                $wptitle = ilWikiUtil::makeUrlTitle(ilWikiPage::lookupTitle($item["context_sub_obj_id"]));
151                $feed_item->setLink(ILIAS_HTTP_PATH . "/goto.php?client_id=" . CLIENT_ID .
152                    "&amp;target=" . $item["context_obj_type"] . "_" . $item["ref_id"] . "_" . $wptitle);
153            } elseif (in_array($item["context_obj_type"], array("frm")) && $item["context_sub_obj_type"] == "pos"
154                && $item["context_sub_obj_id"] > 0) {
155                // frm hack, not nice
156                include_once("./Modules/Forum/classes/class.ilObjForumAccess.php");
157                $thread_id = ilObjForumAccess::_getThreadForPosting($item["context_sub_obj_id"]);
158                if ($thread_id > 0) {
159                    $feed_item->setLink(ILIAS_HTTP_PATH . "/goto.php?client_id=" . CLIENT_ID .
160                        "&amp;target=" . $item["context_obj_type"] . "_" . $item["ref_id"] . "_" . $thread_id . "_" . $item["context_sub_obj_id"]);
161                } else {
162                    $feed_item->setLink(ILIAS_HTTP_PATH . "/goto.php?client_id=" . CLIENT_ID .
163                        "&amp;target=" . $item["context_obj_type"] . "_" . $item["ref_id"]);
164                }
165            } else {
166                $feed_item->setLink(ILIAS_HTTP_PATH . "/goto.php?client_id=" . CLIENT_ID .
167                    "&amp;target=" . $item["context_obj_type"] . "_" . $item["ref_id"]);
168                //echo "<br>".ILIAS_HTTP_PATH."/goto.php?client_id=".CLIENT_ID.
169//					"&amp;target=".$item["context_obj_type"]."_".$item["ref_id"];
170            }
171
172            $feed_item->setAbout($feed_item->getLink() . "&amp;il_about_feed=" . $item["id"]);
173            $feed_item->setDate($item["creation_date"]);
174
175            // Enclosure
176            if ($item["content_type"] == NEWS_AUDIO &&
177                $item["mob_id"] > 0 && ilObject::_exists($item["mob_id"])) {
178                $go_on = true;
179                if ($obj_type == "mcst") {
180                    include_once("./Modules/MediaCast/classes/class.ilObjMediaCastAccess.php");
181
182                    if (!ilObjMediaCastAccess::_lookupPublicFiles($obj_id)) {
183                        $go_on = false;
184                    }
185                }
186
187                if ($go_on) {
188                    include_once("./Services/MediaObjects/classes/class.ilObjMediaObject.php");
189                    $url = ilObjMediaObject::_lookupItemPath($item["mob_id"], true, true, $mob["purpose"]);
190                    $file = ilObjMediaObject::_lookupItemPath($item["mob_id"], false, false, $mob["purpose"]);
191                    if (is_file($file)) {
192                        $size = filesize($file);
193                    }
194                    $feed_item->setEnclosureUrl($url);
195                    $feed_item->setEnclosureType((isset($mob["format"]))?$mob["format"]:"audio/mpeg");
196                    $feed_item->setEnclosureLength($size);
197                }
198            }
199            $this->addItem($feed_item);
200        }
201    }
202}
203