ILIAS  release_5-0 Revision 5.0.0-1144-gc4397b1f870
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
4include_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 {
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 {
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}
$result
Cron job result data container.
Cron job application base class.
addToExternalSettingsForm($a_form_id, array &$a_fields, $a_is_active)
Add external settings to form.
const SCHEDULE_TYPE_IN_HOURS
addCustomSettingsToForm(ilPropertyFormGUI $a_form)
Add custom settings to form.
This class handles all operations on files for the forum object.
activationWasToggled($a_currently_active)
Cron job status was changed.
saveCustomSettings(ilPropertyFormGUI $a_form)
getDefaultScheduleValue()
Get schedule value.
hasAutoActivation()
Is to be activated on "installation".
hasFlexibleSchedule()
Can the schedule be configured?
static _getLanguageInstanceByUsrId($usr_id)
Get the ilLanguage instance for the passed user id.
Class Mail this class handles base functions for mail handling.
This class represents a number property in a property form.
Class ilObjForum.
_lookupLogin($a_user_id)
lookup login
static _getAllReferences($a_id)
get all reference ids of object
This class represents a property form user interface.
addItem($a_item)
Add Item (Property, SectionHeader).
getInput($a_post_var, $ensureValidation=true)
Returns the value of a HTTP-POST variable, identified by the passed id.
ILIAS Setting Class.
global $lng
Definition: privfeed.php:40
global $ilSetting
Definition: privfeed.php:40
$ref_id
Definition: sahs_server.php:39
global $ilDB