ILIAS  release_5-1 Revision 5.0.0-5477-g43f3e3fab5f
class.ilMembershipCronNotifications.php
Go to the documentation of this file.
1 <?php
2 
3 /* Copyright (c) 1998-2009 ILIAS open source, Extended GPL, see docs/LICENSE */
4 
5 include_once "Services/Cron/classes/class.ilCronJob.php";
6 
13 {
14  public function getId()
15  {
16  return "mem_notification";
17  }
18 
19  public function getTitle()
20  {
21  global $lng;
22 
23  return $lng->txt("enable_course_group_notifications");
24  }
25 
26  public function getDescription()
27  {
28  global $lng;
29 
30  return $lng->txt("enable_course_group_notifications_desc");
31  }
32 
33  public function getDefaultScheduleType()
34  {
35  return self::SCHEDULE_TYPE_DAILY;
36  }
37 
38  public function getDefaultScheduleValue()
39  {
40  return;
41  }
42 
43  public function hasAutoActivation()
44  {
45  return false;
46  }
47 
48  public function hasFlexibleSchedule()
49  {
50  return true;
51  }
52 
53  public function run()
54  {
55  global $lng, $ilDB;
56 
58  $status_details = null;
59 
60  $setting = new ilSetting("cron");
61  $last_run = $setting->get(get_class($this));
62 
63  // no last run?
64  if(!$last_run)
65  {
66  $last_run = date("Y-m-d H:i:s", strtotime("yesterday"));
67 
68  $status_details = "No previous run found - starting from yesterday.";
69  }
70  // migration: used to be date-only value
71  else if(strlen($last_run) == 10)
72  {
73  $last_run .= " 00:00:00";
74 
75  $status_details = "Switched from daily runs to open schedule.";
76  }
77 
78  include_once "Services/Membership/classes/class.ilMembershipNotifications.php";
80  if(sizeof($objects))
81  {
82  // gather news for each user over all objects
83 
84  $user_news_aggr = array();
85 
86  include_once "Services/News/classes/class.ilNewsItem.php";
87  foreach($objects as $ref_id => $user_ids)
88  {
89  // gather news per object
90  $news_item = new ilNewsItem();
91  if($news_item->checkNewsExistsForGroupCourse($ref_id, $last_run))
92  {
93  foreach($user_ids as $user_id)
94  {
95  // gather news for user
96  $user_news = $news_item->getNewsForRefId($ref_id,
97  false, false, $last_run, false, false, false, false,
98  $user_id);
99  if($user_news)
100  {
101  $user_news_aggr[$user_id][$ref_id] = $user_news;
102 
103  // #17928
104  ilCronManager::ping($this->getId());
105  }
106  }
107  }
108  }
109  unset($objects);
110 
111 
112  // send mails (1 max for each user)
113 
114  $old_lng = $lng;
117 
118  if(sizeof($user_news_aggr))
119  {
120  foreach($user_news_aggr as $user_id => $user_news)
121  {
122  $this->sendMail($user_id, $user_news, $last_run);
123 
124  // #17928
125  ilCronManager::ping($this->getId());
126  }
127 
128  // mails were sent - set cron job status accordingly
129  $status = ilCronJobResult::STATUS_OK;
130  }
131 
133  $lng = $old_lng;
134  }
135 
136  // save last run
137  $setting->set(get_class($this), date("Y-m-d H:i:s"));
138 
139  $result = new ilCronJobResult();
140  $result->setStatus($status);
141 
142  if($status_details)
143  {
144  $result->setMessage($status_details);
145  }
146 
147  return $result;
148  }
149 
159  protected function parseNewsItem($a_parent_ref_id, array &$a_filter_map, array $a_item, $a_is_sub = false)
160  {
161  global $lng;
162 
163  $wrong_parent = (array_key_exists($a_item["id"], $a_filter_map) &&
164  $a_parent_ref_id != $a_filter_map[$a_item["id"]]);
165 
166  // #18223
167  if($wrong_parent)
168  {
169  return;
170  }
171 
172  $item_obj_title = trim(ilObject::_lookupTitle($a_item["context_obj_id"]));
173  $item_obj_type = $a_item["context_obj_type"];
174 
175  // sub-items
176  $sub = null;
177  if($a_item["aggregation"])
178  {
179  $do_sub = true;
180  if($item_obj_type == "file" &&
181  sizeof($a_item["aggregation"]) == 1)
182  {
183  $do_sub = false;
184  }
185  if($do_sub)
186  {
187  $sub = array();
188  foreach($a_item["aggregation"] as $subitem)
189  {
190  $sub_res = $this->parseNewsItem($a_parent_ref_id, $a_filter_map, $subitem, true);
191  if($sub_res)
192  {
193  $sub[md5($sub_res)] = $sub_res;
194  }
195  }
196  }
197  }
198 
199  if(!$a_is_sub)
200  {
202  $a_item["context_obj_type"],
203  $a_item["title"],
204  $a_item["content_is_lang_var"],
205  $a_item["agg_ref_id"],
206  $a_item["aggregation"]
207  );
208  }
209  else
210  {
212  $a_item["context_obj_type"],
213  $a_item["title"],
214  $a_item["content_is_lang_var"]
215  );
216  }
217 
219  $a_item["context_obj_type"],
220  $a_item["content"],
221  $a_item["content_text_is_lang_var"]
222  );
223 
224  $title = trim($title);
225 
226  // #18067 / #18186
227  $content = ilUtil::shortenText(trim(strip_tags($content)), 200, true);
228 
229  $res = "";
230  switch($item_obj_type)
231  {
232  case "frm":
233  if(!$a_is_sub)
234  {
235  $res = $lng->txt("obj_".$item_obj_type).
236  ' "'.$item_obj_title.'": '.$title;
237  }
238  else
239  {
240  $res .= '"'.$title.'": "'.$content.'"';
241  }
242  break;
243 
244  case "file":
245  if(!is_array($a_item["aggregation"]) ||
246  sizeof($a_item["aggregation"]) == 1)
247  {
248  $res = $lng->txt("obj_".$item_obj_type).
249  ' "'.$item_obj_title.'" - '.$title;
250  }
251  else
252  {
253  // if files were removed from aggregation update summary count
254  $title = str_replace(
255  " ".sizeof($a_item["aggregation"])." ",
256  " ".sizeof($sub)." ",
257  $title
258  );
259  $res = $title;
260  }
261  break;
262 
263  default:
264  $res = $lng->txt("obj_".$item_obj_type).
265  ' "'.$item_obj_title.'"';
266  if($title)
267  {
268  $res .= ': "'.$title.'"';
269  }
270  if($content)
271  {
272  $res .= ' - '.$content;
273  }
274  break;
275  }
276 
277  $res = $a_is_sub
278  ? "- ".$res
279  : "# ".$res;
280 
281  if(sizeof($sub))
282  {
283  $res .= "\n".implode("\n", $sub);
284  }
285 
286  return trim($res);
287  }
288 
295  protected function filterDuplicateItems(array $a_objects)
296  {
297  global $tree;
298 
299  $parent_map = $news_map = $parsed_map = array();
300 
301  // gather news ref ids and news parent ref ids
302  foreach($a_objects as $parent_ref_id => $news)
303  {
304  foreach($news as $item)
305  {
306  $news_map[$item["id"]] = $item["ref_id"];
307  $parent_map[$item["id"]][$parent_ref_id] = $parent_ref_id;
308 
309  if($item["aggregation"])
310  {
311  foreach($item["aggregation"] as $subitem)
312  {
313  $news_map[$subitem["id"]] = $subitem["ref_id"];
314  $parent_map[$subitem["id"]][$parent_ref_id] = $parent_ref_id;
315  }
316  }
317  }
318  }
319  // if news has multiple parents find "lowest" parent in path
320  foreach($parent_map as $news_id => $parents)
321  {
322  if(sizeof($parents) > 1)
323  {
324  $path = $tree->getPathId($news_map[$news_id]);
325  $lookup = array_flip($path);
326 
327  $level = 0;
328  foreach($parents as $parent_ref_id)
329  {
330  $level = max($level, $lookup[$parent_ref_id]);
331  }
332 
333  $parsed_map[$news_id] = $path[$level];
334  }
335  }
336 
337  return $parsed_map;
338  }
339 
347  protected function sendMail($a_user_id, array $a_objects, $a_last_run)
348  {
349  global $lng, $ilUser, $ilClientIniFile, $tree;
350 
351  include_once "./Services/Notification/classes/class.ilSystemNotification.php";
352  $ntf = new ilSystemNotification();
353  $ntf->setLangModules(array("crs", "news"));
354  // no single object anymore
355  // $ntf->setRefId($a_ref_id);
356  // $ntf->setGotoLangId('url');
357  // $ntf->setSubjectLangId('crs_subject_course_group_notification');
358 
359  // user specific language
360  $lng = $ntf->getUserLanguage($a_user_id);
361 
362  include_once './Services/Locator/classes/class.ilLocatorGUI.php';
363  require_once "HTML/Template/ITX.php";
364  require_once "./Services/UICore/classes/class.ilTemplateHTMLITX.php";
365  require_once "./Services/UICore/classes/class.ilTemplate.php";
366  require_once "./Services/Link/classes/class.ilLink.php";
367 
368  $filter_map = $this->filterDuplicateItems($a_objects);
369 
370  $tmp = array();
371  foreach($a_objects as $parent_ref_id => $news)
372  {
373  $parent = array();
374 
375  // path
376  $path = array();
377  foreach($tree->getPathId($parent_ref_id) as $node)
378  {
379  $path[] = $node;
380  }
381  $path = implode("-", $path);
382 
383  $parent_obj_id = ilObject::_lookupObjId($parent_ref_id);
384  $parent_type = ilObject::_lookupType($parent_obj_id);
385 
386  $parent["title"] = $lng->txt("obj_".$parent_type).' "'.ilObject::_lookupTitle($parent_obj_id).'"';
387  $parent["url"] = " ".$lng->txt("crs_course_group_notification_link")." ".ilLink::_getStaticLink($parent_ref_id);
388 
389  // news summary
390  $parsed = array();
391  foreach($news as $item)
392  {
393  $parsed_item = $this->parseNewsItem($parent_ref_id, $filter_map, $item);
394  if($parsed_item)
395  {
396  $parsed[md5($parsed_item)] = $parsed_item;
397  }
398  }
399  // any news?
400  if(sizeof($parsed))
401  {
402  $parent["news"] = implode("\n", $parsed);
403  $tmp[$path] = $parent;
404  }
405  }
406 
407  // any objects?
408  if(!sizeof($tmp))
409  {
410  return;
411  }
412 
413  ksort($tmp);
414  $counter = 0;
415  $obj_index = array();
416  $txt = "";
417  foreach($tmp as $path => $item)
418  {
419  $counter++;
420 
421  $txt .= "(".$counter.") ".$item["title"]."\n".
422  $item["url"]."\n\n".
423  $item["news"]."\n\n";
424 
425  $obj_index[] = "(".$counter.") ".$item["title"];
426  }
427 
428  $ntf->setIntroductionLangId("crs_intro_course_group_notification_for");
429 
430  // index
431  $period = sprintf(
432  $lng->txt("crs_intro_course_group_notification_index"),
435  );
436  $ntf->addAdditionalInfo($period,
437  trim(implode("\n", $obj_index)),
438  true,
439  true);
440 
441  // object list
442  $ntf->addAdditionalInfo("",
443  trim($txt),
444  true);
445 
446  // :TODO: does it make sense to add client to subject?
447  $client = $ilClientIniFile->readVariable('client', 'name');
448  $subject = sprintf($lng->txt("crs_subject_course_group_notification"), $client);
449 
450  // #10044
451  $mail = new ilMail(ANONYMOUS_USER_ID);
452  $mail->enableSOAP(false); // #10410
453  $mail->sendMail(ilObjUser::_lookupLogin($a_user_id),
454  null,
455  null,
456  $subject,
457  $ntf->composeAndGetMessage($a_user_id, null, "read", true),
458  null,
459  array("system"));
460  }
461 
462  public function addToExternalSettingsForm($a_form_id, array &$a_fields, $a_is_active)
463  {
464  global $lng;
465 
466  switch($a_form_id)
467  {
470  $a_fields["enable_course_group_notifications"] = $a_is_active ?
471  $lng->txt("enabled") :
472  $lng->txt("disabled");
473  break;
474  }
475  }
476 
477  public function activationWasToggled($a_currently_active)
478  {
479  global $ilSetting;
480 
481  // propagate cron-job setting to object setting
482  $ilSetting->set("crsgrp_ntf", (bool)$a_currently_active);
483  }
484 }
485 
486 ?>
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.
static _lookupLogin($a_user_id)
lookup login
ILIAS Setting Class.
const IL_CAL_DATETIME
$result
Cron job application base class.
static shortenText($a_str, $a_len, $a_dots=false, $a_next_blank=false, $a_keep_extension=false)
shorten a string to given length.
static setUseRelativeDates($a_status)
set use relative dates
static _lookupTitle($a_id)
lookup object title
filterDuplicateItems(array $a_objects)
Filter duplicate news items from structure.
const IL_CAL_UNIX
parseNewsItem($a_parent_ref_id, array &$a_filter_map, array $a_item, $a_is_sub=false)
Convert news item to summary html.
static useRelativeDates()
check if relative dates are used
static determineNewsContent($a_context_obj_type, $a_content, $a_is_lang_var)
Determine new content.
Class Mail this class handles base functions for mail handling.
static _lookupObjId($a_id)
static formatDate(ilDateTime $date)
Format a date public.
Date and time handling
$txt
Definition: error.php:12
static _lookupType($a_id, $a_reference=false)
lookup object type
addToExternalSettingsForm($a_form_id, array &$a_fields, $a_is_active)
static ping($a_job_id)
Keep cron job alive.
global $ilUser
Definition: imgupload.php:15
$ref_id
Definition: sahs_server.php:39
global $ilSetting
Definition: privfeed.php:40
global $lng
Definition: privfeed.php:40
$path
Definition: index.php:22
global $ilDB
static getActiveUsersforAllObjects()
Get active notifications for all objects.
Cron job result data container.
Wrapper classes for system notifications.
sendMail($a_user_id, array $a_objects, $a_last_run)
Send news mail for 1 user and n objects.