ILIAS  release_10 Revision v10.1-43-ga1241a92c2f
class.ilObjBlog.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
23 
24 class ilObjBlog extends ilObject2
25 {
26  public const NAV_MODE_LIST = 1;
27  public const NAV_MODE_MONTH = 2;
28  public const ABSTRACT_DEFAULT_SHORTEN_LENGTH = 500;
29  public const ABSTRACT_DEFAULT_IMAGE_WIDTH = 144;
30  public const ABSTRACT_DEFAULT_IMAGE_HEIGHT = 144;
31  public const NAV_MODE_LIST_DEFAULT_POSTINGS = 10;
32  protected ?Settings $blog_settings = null;
34  protected \ILIAS\Style\Content\DomainService $content_style_domain;
35  protected \ILIAS\Notes\Service $notes_service;
36 
37  protected bool $notes = false;
38  protected bool $style = false;
39 
40  public function __construct(
41  int $a_id = 0,
42  bool $a_reference = true
43  ) {
44  global $DIC;
45 
46  $this->notes_service = $DIC->notes();
47  $this->settings_manager = $DIC->blog()->internal()->domain()->blogSettings();
48 
49  parent::__construct($a_id, $a_reference);
50  $this->rbac_review = $DIC->rbac()->review();
51 
52  $this->content_style_domain = $DIC
53  ->contentStyle()
54  ->domain();
55 
56  if ($this->getId() > 0) {
57  $this->blog_settings = $this->settings_manager->getByObjId($this->getId());
58  }
59  }
60 
61  protected function initType(): void
62  {
63  $this->type = "blog";
64  }
65 
66  protected function doRead(): void
67  {
68  // #14661
69  $this->setNotesStatus(
70  $this->notes_service->domain()->commentsActive($this->id)
71  );
72  $this->blog_settings = $this->settings_manager->getByObjId($this->getId());
73  }
74 
75  protected function doCreate(bool $clone_mode = false): void
76  {
77  $ilDB = $this->db;
78 
79  $this->createMetaData();
80 
81  $ilDB->manipulate("INSERT INTO il_blog (id,ppic,rss_active,approval" .
82  ",abs_shorten,abs_shorten_len,abs_image,abs_img_width,abs_img_height" .
83  ",keywords,authors,nav_mode,nav_list_mon_with_post,ov_post) VALUES (" .
84  $ilDB->quote($this->id, "integer") . "," .
85  $ilDB->quote(true, "integer") . "," .
86  $ilDB->quote(true, "integer") . "," .
87  $ilDB->quote(false, "integer") . "," .
88  $ilDB->quote(false, "integer") . "," .
89  $ilDB->quote(0, "integer") . "," .
90  $ilDB->quote(false, "integer") . "," .
91  $ilDB->quote(0, "integer") . "," .
92  $ilDB->quote(0, "integer") . "," .
93  $ilDB->quote(true, "integer") . "," .
94  $ilDB->quote(false, "integer") . "," .
95  $ilDB->quote(self::NAV_MODE_LIST, "integer") . "," .
96  $ilDB->quote(5, "integer") . "," .
97  $ilDB->quote(5, "integer") .
98  ")");
99 
100  // #14661
101  $this->notes_service->domain()->activateComments($this->id);
102  }
103 
104  protected function doDelete(): void
105  {
106  $ilDB = $this->db;
107 
108  $this->deleteMetaData();
109 
111 
112  // remove all notifications
114 
115  $ilDB->manipulate("DELETE FROM il_blog" .
116  " WHERE id = " . $ilDB->quote($this->id, "integer"));
117  }
118 
119  protected function doUpdate(): void
120  {
121  $this->updateMetaData();
122 
123  if ($this->id) {
124  // #14661
125  $this->notes_service->domain()->activateComments(
126  $this->id,
127  $this->getNotesStatus()
128  );
129  }
130  }
131 
132  protected function doCloneObject(ilObject2 $new_obj, int $a_target_id, ?int $a_copy_id = null): void
133  {
134  assert($new_obj instanceof ilObjBlog);
135 
136  $new_obj->setNotesStatus($this->getNotesStatus());
137  $new_obj->update();
138 
139  $this->settings_manager->clone($this->getId(), $new_obj->getId());
140 
141  // set/copy stylesheet
142  $this->content_style_domain->styleForObjId($this->getId())->cloneTo($new_obj->getId());
143 
144  $this->cloneMetaData($new_obj);
145  }
146 
147  public function getNotesStatus(): bool
148  {
149  return $this->notes;
150  }
151 
152  public function setNotesStatus(bool $a_status): void
153  {
154  $this->notes = $a_status;
155  }
156 
157  public static function sendNotification(
158  string $a_action,
159  bool $a_in_wsp,
160  int $a_blog_node_id,
161  int $a_posting_id,
162  ?string $a_comment = null
163  ): void {
164  global $DIC;
165 
166  $ilUser = $DIC->user();
167 
168  // get blog object id (repository or workspace)
169  if ($a_in_wsp) {
170  $tree = new ilWorkspaceTree($ilUser->getId()); // owner of tree is irrelevant
171  $blog_obj_id = $tree->lookupObjectId($a_blog_node_id);
172  $access_handler = new ilWorkspaceAccessHandler($tree);
173  } else {
174  $blog_obj_id = ilObject::_lookupObjId($a_blog_node_id);
175  $access_handler = null;
176  }
177  if (!$blog_obj_id) {
178  return;
179  }
180 
181  $posting = new ilBlogPosting($a_posting_id);
182 
183  // #11138
184  $ignore_threshold = ($a_action === "comment");
185 
186  $admin_only = false;
187 
188  // approval handling
189  if (!$posting->isApproved()) {
190  $blog_settings = $DIC->blog()->internal()->domain()->blogSettings()->getByObjId($blog_obj_id);
191  if ($blog_settings?->getApproval()) {
192  switch ($a_action) {
193  case "update":
194  // un-approved posting was updated - no notifications
195  return;
196 
197  case "new":
198  // un-approved posting was activated - admin-only notification
199  $admin_only = true;
200  $ignore_threshold = true;
201  $a_action = "approve";
202  break;
203  }
204  }
205  }
206 
207  // create/update news item (only in repository)
208  if (!$a_in_wsp &&
209  in_array($a_action, array("update", "new"))) {
210  $posting->handleNews(($a_action === "update"));
211  }
212 
213  // recipients
216  $blog_obj_id,
217  $a_posting_id,
218  $ignore_threshold
219  );
220  if (!count($users)) {
221  return;
222  }
223 
224  $ntf = new ilSystemNotification($a_in_wsp);
225  $ntf->setLangModules(array("blog"));
226  $ntf->setRefId($a_blog_node_id);
227  $ntf->setChangedByUserId($ilUser->getId());
228  $ntf->setSubjectLangId('blog_change_notification_subject');
229  $ntf->setIntroductionLangId('blog_change_notification_body_' . $a_action);
230  $ntf->addAdditionalInfo('blog_posting', $posting->getTitle());
231  if ($a_comment) {
232  $ntf->addAdditionalInfo('comment', $a_comment, true);
233  }
234  $ntf->setGotoLangId('blog_change_notification_link');
235  $ntf->setReasonLangId('blog_change_notification_reason');
236 
237  $abstract = $posting->getNotificationAbstract();
238  if ($abstract) {
239  $ntf->addAdditionalInfo('content', $abstract, true);
240  }
241 
242  $notified = $ntf->sendMailAndReturnRecipients(
243  $users,
244  "_" . $a_posting_id,
245  ($admin_only ? "write" : "read")
246  );
247 
248  // #14387
249  if (count($notified)) {
250  ilNotification::updateNotificationTime(ilNotification::TYPE_BLOG, $blog_obj_id, $notified, $a_posting_id);
251  }
252  }
253 
257  public static function deliverRSS(string $a_wsp_id): void
258  {
259  global $DIC;
260 
261  $ilSetting = $DIC->settings();
262 
263  if (!$ilSetting->get('enable_global_profiles')) {
264  return;
265  }
266 
267  // #10827
268  if (!str_ends_with($a_wsp_id, "_cll")) {
269  $wsp_id = new ilWorkspaceTree(0);
270  $obj_id = $wsp_id->lookupObjectId((int) $a_wsp_id);
271  $is_wsp = "_wsp";
272  $pl = $DIC->blog()->internal()->gui()->permanentLink(0, (int) $a_wsp_id);
273  } else {
274  $a_wsp_id = substr($a_wsp_id, 0, -4);
275  $obj_id = ilObject::_lookupObjId((int) $a_wsp_id);
276  $is_wsp = null;
277  $pl = $DIC->blog()->internal()->gui()->permanentLink((int) $a_wsp_id);
278  }
279  if (!$obj_id) {
280  return;
281  }
282 
283  $blog_settings = $DIC->blog()->internal()->domain()->blogSettings()
284  ->getByObjId($obj_id);
285  if (!$blog_settings?->getRSS()) {
286  return;
287  }
288 
289  $blog = new self($obj_id, false);
290  $feed = new ilFeedWriter();
291 
292  $url = $pl->getPermanentLink();
293  $url = str_replace("&", "&amp;", $url);
294 
295  // #11870
296  $feed->setChannelTitle(str_replace("&", "&amp;", $blog->getTitle()));
297  $feed->setChannelDescription(str_replace("&", "&amp;", $blog->getDescription()));
298  $feed->setChannelLink($url);
299 
300  // needed for blogpostinggui / pagegui
301  $tpl = new ilGlobalTemplate("tpl.main.html", true, true);
302 
303  foreach (ilBlogPosting::getAllPostings($obj_id) as $item) {
304  $id = $item["id"];
305 
306  // only published items
307  $is_active = ilBlogPosting::_lookupActive($id, "blp");
308  if (!$is_active) {
309  continue;
310  }
311 
312  // #16434
313  $snippet = strip_tags(ilBlogPostingGUI::getSnippet($id), "<br><br/><div><p>");
314  $snippet = str_replace("&", "&amp;", $snippet);
315  $snippet = "<![CDATA[" . $snippet . "]]>";
316 
317  $url = $pl->getPermanentLink((int) $id);
318  $url = str_replace("&", "&amp;", $url);
319 
320  $feed_item = new ilFeedItem();
321  $feed_item->setTitle(str_replace("&", "&amp;", $item["title"])); // #16022
322  $feed_item->setDate($item["created"]->get(IL_CAL_DATETIME));
323  $feed_item->setDescription($snippet);
324  $feed_item->setLink($url);
325  $feed_item->setAbout($url);
326  $feed->addItem($feed_item);
327  }
328 
329  $feed->showFeed();
330  exit();
331  }
332 
333  public function initDefaultRoles(): void
334  {
336  'il_blog_contributor_' . $this->getRefId(),
337  "Contributor of blog obj_no." . $this->getId(),
338  'il_blog_contributor',
339  $this->getRefId()
340  );
341 
343  'il_blog_editor_' . $this->getRefId(),
344  "Editor of blog obj_no." . $this->getId(),
345  'il_blog_editor',
346  $this->getRefId()
347  );
348  }
349 
350  public function getLocalContributorRole(int $a_node_id): int
351  {
352  foreach ($this->rbac_review->getLocalRoles($a_node_id) as $role_id) {
353  if (str_starts_with(ilObject::_lookupTitle($role_id), "il_blog_contributor")) {
354  return $role_id;
355  }
356  }
357  return 0;
358  }
359 
360  public function getLocalEditorRole(int $a_node_id): int
361  {
362  foreach ($this->rbac_review->getLocalRoles($a_node_id) as $role_id) {
363  if (strpos(ilObject::_lookupTitle($role_id), "il_blog_editor") === 0) {
364  return $role_id;
365  }
366  }
367  return 0;
368  }
369 
370  public function getAllLocalRoles(int $a_node_id): array
371  {
372  $res = array();
373  foreach ($this->rbac_review->getLocalRoles($a_node_id) as $role_id) {
375  }
376 
377  asort($res);
378  return $res;
379  }
380 
381  public function getRolesWithContributeOrRedact(int $a_node_id): array
382  {
383  $contr_op_id = ilRbacReview::_getOperationIdByName("contribute");
384  $redact_op_id = ilRbacReview::_getOperationIdByName("redact");
385  $contr_role_id = $this->getLocalContributorRole($a_node_id);
386  $editor_role_id = $this->getLocalEditorRole($a_node_id);
387 
388  $res = array();
389  foreach ($this->rbac_review->getParentRoleIds($a_node_id) as $role_id => $role) {
390  if ($role_id != $contr_role_id &&
391  $role_id != $editor_role_id) {
392  $all_ops = $this->rbac_review->getActiveOperationsOfRole($a_node_id, $role_id);
393  if (in_array($contr_op_id, $all_ops) ||
394  in_array($redact_op_id, $all_ops)) {
395  $res[$role_id] = ilObjRole::_getTranslation($role["title"]);
396  }
397  }
398  }
399 
400  return $res;
401  }
402 }
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
const ABSTRACT_DEFAULT_IMAGE_WIDTH
static _lookupActive(int $a_id, string $a_parent_type, bool $a_check_scheduled_activation=false, string $a_lang="-")
lookup activation status
$res
Definition: ltiservices.php:69
Settings $blog_settings
const NAV_MODE_LIST_DEFAULT_POSTINGS
Class ilBlogPosting.
const IL_CAL_DATETIME
static getAllPostings(int $a_blog_id, int $a_limit=1000, int $a_offset=0)
Get all postings of blog.
cloneMetaData(ilObject $target_obj)
special template class to simplify handling of ITX/PEAR
SettingsManager $settings_manager
getLocalContributorRole(int $a_node_id)
getRolesWithContributeOrRedact(int $a_node_id)
ILIAS Style Content DomainService $content_style_domain
ilTree $tree
setNotesStatus(bool $a_status)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
const NAV_MODE_LIST
static createDefaultRole(string $a_title, string $a_description, string $a_tpl_name, int $a_ref_id)
$url
Definition: shib_logout.php:63
getAllLocalRoles(int $a_node_id)
const ABSTRACT_DEFAULT_SHORTEN_LENGTH
static getNotificationsForObject(int $type, int $id, ?int $page_id=null, bool $ignore_threshold=false)
Get all users/recipients for given object.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static _lookupObjId(int $ref_id)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static deleteAllBlogPostings(int $a_blog_id)
Delete all postings for blog.
__construct(int $a_id=0, bool $a_reference=true)
static sendNotification(string $a_action, bool $a_in_wsp, int $a_blog_node_id, int $a_posting_id, ?string $a_comment=null)
static _lookupTitle(int $obj_id)
const ABSTRACT_DEFAULT_IMAGE_HEIGHT
static _getTranslation(string $a_role_title)
ilDBInterface $db
global $DIC
Definition: shib_login.php:25
static deliverRSS(string $a_wsp_id)
Deliver blog as rss feed.
doCloneObject(ilObject2 $new_obj, int $a_target_id, ?int $a_copy_id=null)
static updateNotificationTime(int $type, int $id, array $user_ids, ?int $page_id=null, bool $activate_new_entries=true)
Update the last mail timestamp for given object and users.
static _getOperationIdByName(string $a_operation)
get operation id by name of operation
global $ilSetting
Definition: privfeed.php:32
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Definition: plugin.php:24
__construct(Container $dic, ilPlugin $plugin)
static getSnippet(int $a_id, bool $a_truncate=false, int $a_truncate_length=500, string $a_truncate_sign="...", bool $a_include_picture=false, int $a_picture_width=144, int $a_picture_height=144, string $a_export_directory=null)
Get first text paragraph of page.
getLocalEditorRole(int $a_node_id)
static removeForObject(int $type, int $id)
Remove all notifications for given object.
const NAV_MODE_MONTH
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
doCreate(bool $clone_mode=false)
ILIAS Notes Service $notes_service