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