ILIAS  release_5-0 Revision 5.0.0-1144-gc4397b1f87
class.ilForumCronNotification.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 include_once "Services/Cron/classes/class.ilCronJob.php";
5 
12 {
16  protected $settings;
17 
21  public function __construct()
22  {
23  $this->settings = new ilSetting('frma');
24  }
25 
26  public function getId()
27  {
28  return "frm_notification";
29  }
30 
31  public function getTitle()
32  {
33  global $lng;
34 
35  return $lng->txt("cron_forum_notification");
36  }
37 
38  public function getDescription()
39  {
40  global $lng;
41 
42  return $lng->txt("cron_forum_notification_crob_desc");
43  }
44 
45  public function getDefaultScheduleType()
46  {
47  return self::SCHEDULE_TYPE_IN_HOURS;
48  }
49 
50  public function getDefaultScheduleValue()
51  {
52  return 1;
53  }
54 
55  public function hasAutoActivation()
56  {
57  return false;
58  }
59 
60  public function hasFlexibleSchedule()
61  {
62  return true;
63  }
64 
68  public function hasCustomSettings()
69  {
70  return true;
71  }
72 
73  public function run()
74  {
75  global $ilDB, $ilLog, $ilSetting, $lng;
76 
78 
79  $lng->loadLanguageModule('forum');
80 
81  if(!($last_run_datetime = $ilSetting->get('cron_forum_notification_last_date')))
82  {
83  $last_run_datetime = null;
84  }
85 
86  $numRows = 0;
87  $types = array();
88  $values = array();
89 
90  if($last_run_datetime != null &&
91  checkDate(date('m', strtotime($last_run_datetime)), date('d', strtotime($last_run_datetime)), date('Y', strtotime($last_run_datetime))))
92  {
93  $threshold = max(strtotime($last_run_datetime), strtotime('-' . (int)$this->settings->get('max_notification_age', 30) . ' days', time()));
94  }
95  else
96  {
97  $threshold = strtotime('-' . (int)$this->settings->get('max_notification_age', 30) . ' days', time());
98  }
99 
100  $date_condition = ' frm_posts.pos_date >= %s AND ';
101  $types[] = 'timestamp';
102  $values[] = date('Y-m-d H:i:s', $threshold);
103 
104  $cj_start_date = date('Y-m-d H:i:s');
105 
106  /*** FORUMS ***/
107  $res = $ilDB->queryf('
108  SELECT frm_threads.thr_subject thr_subject,
109  frm_data.top_name top_name,
110  frm_data.top_frm_fk obj_id,
111  frm_notification.user_id user_id,
112  frm_posts.*
113  FROM frm_notification, frm_posts, frm_threads, frm_data
114  WHERE '.$date_condition.' frm_posts.pos_thr_fk = frm_threads.thr_pk
115  AND frm_threads.thr_top_fk = frm_data.top_pk
116  AND frm_data.top_frm_fk = frm_notification.frm_id
117  ORDER BY frm_posts.pos_date ASC',
118  $types,
119  $values
120  );
121 
122  $numRows += $this->sendMails($res);
123 
124  /*** THREADS ***/
125  $res = $ilDB->queryf('
126  SELECT frm_threads.thr_subject thr_subject,
127  frm_data.top_name top_name,
128  frm_data.top_frm_fk obj_id,
129  frm_notification.user_id user_id,
130  frm_posts.*
131  FROM frm_notification, frm_posts, frm_threads, frm_data
132  WHERE '.$date_condition.' frm_posts.pos_thr_fk = frm_threads.thr_pk
133  AND frm_threads.thr_pk = frm_notification.thread_id
134  AND frm_data.top_pk = frm_threads.thr_top_fk
135  ORDER BY frm_posts.pos_date ASC',
136  $types,
137  $values
138  );
139 
140  $numRows += $this->sendMails($res);
141 
142  $ilSetting->set('cron_forum_notification_last_date', $cj_start_date);
143 
144  $mess = 'Send '.$numRows.' messages.';
145  $ilLog->write(__METHOD__.': '.$mess);
146 
147  $result = new ilCronJobResult();
148  if($numRows)
149  {
150  $status = ilCronJobResult::STATUS_OK;
151  $result->setMessage($mess);
152  };
153  $result->setStatus($status);
154  return $result;
155  }
156 
157  protected function sendMails($res)
158  {
159  global $ilAccess, $ilDB, $lng;
160 
161  static $cache = array();
162  static $attachments_cache = array();
163 
164  include_once 'Modules/Forum/classes/class.ilObjForum.php';
165  include_once 'Services/Mail/classes/class.ilMail.php';
166  include_once 'Services/User/classes/class.ilObjUser.php';
167  include_once 'Services/Language/classes/class.ilLanguage.php';
168 
169  $forumObj = new ilObjForum();
170  $frm = $forumObj->Forum;
171 
172  $numRows = 0;
173  $mail_obj = new ilMail(ANONYMOUS_USER_ID);
174  $mail_obj->enableSOAP(false);
175  while($row = $ilDB->fetchAssoc($res))
176  {
177  // don not send a notification to the post author
178  if($row['pos_display_user_id'] != $row['user_id'])
179  {
180  // GET AUTHOR OF NEW POST
181  if($row['pos_display_user_id'])
182  {
183  $row['pos_usr_name'] = ilObjUser::_lookupLogin($row['pos_display_user_id']);
184  }
185  else if(strlen($row['pos_usr_alias']))
186  {
187  $row['pos_usr_name'] = $row['pos_usr_alias'].' ('.$lng->txt('frm_pseudonym').')';
188  }
189 
190  if($row['pos_usr_name'] == '')
191  {
192  $row['pos_usr_name'] = $lng->txt('forums_anonymous');
193  }
194 
195  // get all references of obj_id
196  if(!isset($cache[$row['obj_id']]))
197  $cache[$row['obj_id']] = ilObject::_getAllReferences($row['obj_id']);
198 
199  // check for attachments
200  $has_attachments = false;
201  if(!isset($attachments_cache[$row['obj_id']][$row['pos_pk']]))
202  {
203  $fileDataForum = new ilFileDataForum($row['obj_id'], $row['pos_pk']);
204  $filesOfPost = $fileDataForum->getFilesOfPost();
205  foreach($filesOfPost as $attachment)
206  {
207  $attachments_cache[$row['obj_id']][$row['pos_pk']][] = $attachment['name'];
208  $has_attachments = true;
209  }
210  }
211  else
212  {
213  $has_attachments = true;
214  }
215 
216  // do rbac check before sending notification
217  $send_mail = false;
218  foreach((array)$cache[$row['obj_id']] as $ref_id)
219  {
220  if($ilAccess->checkAccessOfUser($row['user_id'], 'read', '', $ref_id))
221  {
222  $row['ref_id'] = $ref_id;
223  $send_mail = true;
224  break;
225  }
226  }
227  $attached_files = array();
228  if($has_attachments == true)
229  {
230  $attached_files = $attachments_cache[$row['obj_id']][$row['pos_pk']];
231  }
232 
233  if($send_mail)
234  {
235  $frm->setLanguage(ilForum::_getLanguageInstanceByUsrId($row['user_id']));
236  $mail_obj->sendMail(
237  ilObjUser::_lookupLogin($row['user_id']), '', '',
238  $frm->formatNotificationSubject($row),
239  $frm->formatNotification($row, 1, $attached_files, $row['user_id']),
240  array(), array(
241  'normal'
242  ));
243  $numRows++;
244  }
245  }
246  }
247 
248  return $numRows;
249  }
250 
251  public function addToExternalSettingsForm($a_form_id, array &$a_fields, $a_is_active)
252  {
256  global $lng;
257 
258  switch($a_form_id)
259  {
261  $a_fields['cron_forum_notification'] = $a_is_active ?
262  $lng->txt('enabled') :
263  $lng->txt('disabled');
264  break;
265  }
266  }
267 
268  public function activationWasToggled($a_currently_active)
269  {
270  global $ilSetting;
271 
272  // propagate cron-job setting to object setting
273  if((bool)$a_currently_active)
274  {
275  $ilSetting->set('forum_notification', 2);
276  }
277  else
278  {
279  $ilSetting->set('forum_notification', 1);
280  }
281  }
282 
286  public function addCustomSettingsToForm(ilPropertyFormGUI $a_form)
287  {
291  global $lng;
292 
293  $lng->loadLanguageModule('forum');
294 
295  $max_notification_age = new ilNumberInputGUI($lng->txt('frm_max_notification_age'), 'max_notification_age');
296  $max_notification_age->setSize(5);
297  $max_notification_age->setSuffix($lng->txt('frm_max_notification_age_unit'));
298  $max_notification_age->setRequired(true);
299  $max_notification_age->allowDecimals(false);
300  $max_notification_age->setMinValue(1);
301  $max_notification_age->setInfo($lng->txt('frm_max_notification_age_info'));
302  $max_notification_age->setValue($this->settings->get('max_notification_age', 30));
303 
304  $a_form->addItem($max_notification_age);
305  }
306 
310  public function saveCustomSettings(ilPropertyFormGUI $a_form)
311  {
312  $this->settings->set('max_notification_age', $a_form->getInput('max_notification_age'));
313  return true;
314  }
315 }
ILIAS Setting Class.
$result
This class represents a property form user interface.
addToExternalSettingsForm($a_form_id, array &$a_fields, $a_is_active)
Add external settings to form.
Cron job application base class.
addItem($a_item)
Add Item (Property, SectionHeader).
static _getAllReferences($a_id)
get all reference ids of object
addCustomSettingsToForm(ilPropertyFormGUI $a_form)
Add custom settings to form.
This class represents a number property in a property form.
Class Mail this class handles base functions for mail handling.
_lookupLogin($a_user_id)
lookup login
saveCustomSettings(ilPropertyFormGUI $a_form)
getInput($a_post_var, $ensureValidation=true)
Returns the value of a HTTP-POST variable, identified by the passed id.
setSize($a_size)
Set Size.
$ref_id
Definition: sahs_server.php:39
global $ilSetting
Definition: privfeed.php:40
global $lng
Definition: privfeed.php:40
This class handles all operations on files for the forum object.
global $ilDB
Cron job result data container.
static _getLanguageInstanceByUsrId($usr_id)
Get the ilLanguage instance for the passed user id.
Class ilObjForum.