Verzeichnisstruktur phpBB-3.2.0
- Veröffentlicht
- 06.01.2017
So funktioniert es
|
Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück |
Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
base.php
001 <?php
002 /**
003 *
004 * This file is part of the phpBB Forum Software package.
005 *
006 * @copyright (c) phpBB Limited <https://www.phpbb.com>
007 * @license GNU General Public License, version 2 (GPL-2.0)
008 *
009 * For full copyright and license information, please see
010 * the docs/CREDITS.txt file.
011 *
012 */
013
014 namespace phpbb\notification\type;
015
016 /**
017 * Base notifications class
018 */
019 abstract class base implements \phpbb\notification\type\type_interface
020 {
021 /** @var \phpbb\notification\manager */
022 protected $notification_manager;
023
024 /** @var \phpbb\db\driver\driver_interface */
025 protected $db;
026
027 /** @var \phpbb\language\language */
028 protected $language;
029
030 /** @var \phpbb\user */
031 protected $user;
032
033 /** @var \phpbb\auth\auth */
034 protected $auth;
035
036 /** @var string */
037 protected $phpbb_root_path;
038
039 /** @var string */
040 protected $php_ext;
041
042 /** @var string */
043 protected $user_notifications_table;
044
045 /**
046 * Notification option data (for outputting to the user)
047 *
048 * @var bool|array False if the service should use its default data
049 * Array of data (including keys 'id', 'lang', and 'group')
050 */
051 static public $notification_option = false;
052
053 /**
054 * The notification_type_id, set upon creation of the class
055 * This is the notification_type_id from the notification_types table
056 *
057 * @var int
058 */
059 protected $notification_type_id;
060
061 /**
062 * Identification data
063 * notification_type_id - ID of the item type (auto generated, from notification types table)
064 * item_id - ID of the item (e.g. post_id, msg_id)
065 * item_parent_id - Parent item id (ex: for topic => forum_id, for post => topic_id, etc)
066 * user_id
067 * notification_read
068 * notification_time
069 * notification_data (special serialized field that each notification type can use to store stuff)
070 *
071 * @var array $data Notification row from the database
072 * This must be private, all interaction should use __get(), __set(), get_data(), set_data()
073 */
074 private $data = array();
075
076 /**
077 * Notification Type Base Constructor
078 *
079 * @param \phpbb\db\driver\driver_interface $db
080 * @param \phpbb\language\language $language
081 * @param \phpbb\user $user
082 * @param \phpbb\auth\auth $auth
083 * @param string $phpbb_root_path
084 * @param string $php_ext
085 * @param string $user_notifications_table
086 */
087 public function __construct(\phpbb\db\driver\driver_interface $db, \phpbb\language\language $language, \phpbb\user $user, \phpbb\auth\auth $auth, $phpbb_root_path, $php_ext, $user_notifications_table)
088 {
089 $this->db = $db;
090 $this->language = $language;
091 $this->user = $user;
092 $this->auth = $auth;
093
094 $this->phpbb_root_path = $phpbb_root_path;
095 $this->php_ext = $php_ext;
096
097 $this->user_notifications_table = $user_notifications_table;
098 }
099
100 /**
101 * Set notification manager (required)
102 *
103 * @param \phpbb\notification\manager $notification_manager
104 */
105 public function set_notification_manager(\phpbb\notification\manager $notification_manager)
106 {
107 $this->notification_manager = $notification_manager;
108
109 $this->notification_type_id = $this->notification_manager->get_notification_type_id($this->get_type());
110 }
111
112 /**
113 * Set initial data from the database
114 *
115 * @param array $data Row directly from the database
116 */
117 public function set_initial_data($data = array())
118 {
119 // The row from the database (unless this is a new notification we're going to add)
120 $this->data = $data;
121 $this->data['notification_data'] = (isset($this->data['notification_data'])) ? unserialize($this->data['notification_data']) : array();
122 }
123
124 /**
125 * Magic method to get data from this notification
126 *
127 * @param mixed $name
128 * @return mixed
129 */
130 public function __get($name)
131 {
132 return (!isset($this->data[$name])) ? null : $this->data[$name];
133 }
134
135
136 /**
137 * Magic method to set data on this notification
138 *
139 * @param mixed $name
140 * @param mixed $value
141 *
142 * @return null
143 */
144 public function __set($name, $value)
145 {
146 $this->data[$name] = $value;
147 }
148
149
150 /**
151 * Magic method to get a string of this notification
152 *
153 * Primarily for testing
154 *
155 * @return mixed
156 */
157 public function __toString()
158 {
159 return (!empty($this->data)) ? var_export($this->data, true) : $this->get_type();
160 }
161
162 /**
163 * Get special data (only important for the classes that extend this)
164 *
165 * @param string $name Name of the variable to get
166 * @return mixed
167 */
168 protected function get_data($name)
169 {
170 return ($name === false) ? $this->data['notification_data'] : ((isset($this->data['notification_data'][$name])) ? $this->data['notification_data'][$name] : null);
171 }
172
173 /**
174 * Set special data (only important for the classes that extend this)
175 *
176 * @param string $name Name of the variable to set
177 * @param mixed $value Value to set to the variable
178 * @return mixed
179 */
180 protected function set_data($name, $value)
181 {
182 $this->data['notification_data'][$name] = $value;
183 }
184
185 /**
186 * {@inheritdoc}
187 */
188 public function create_insert_array($type_data, $pre_create_data = array())
189 {
190 // Defaults
191 $this->data = array_merge(array(
192 'item_id' => static::get_item_id($type_data),
193 'notification_type_id' => $this->notification_type_id,
194 'item_parent_id' => static::get_item_parent_id($type_data),
195
196 'notification_time' => time(),
197 'notification_read' => false,
198
199 'notification_data' => array(),
200 ), $this->data);
201 }
202
203 /**
204 * {@inheritdoc}
205 */
206 public function get_insert_array()
207 {
208 $data = $this->data;
209
210 $data['notification_data'] = serialize($data['notification_data']);
211
212 return $data;
213 }
214
215 /**
216 * Function for preparing the data for update in an SQL query
217 * (The service handles insertion)
218 *
219 * @param array $type_data Data unique to this notification type
220 * @return array Array of data ready to be updated in the database
221 */
222 public function create_update_array($type_data)
223 {
224 $this->create_insert_array($type_data);
225 $data = $this->get_insert_array();
226
227 // Unset data unique to each row
228 unset(
229 $data['notification_time'], // Also unsetting time, since it always tries to change the time to current (if you actually need to change the time, over-ride this function)
230 $data['notification_id'],
231 $data['notification_read'],
232 $data['user_id']
233 );
234
235 return $data;
236 }
237
238 /**
239 * Mark this item read
240 *
241 * @param bool $return True to return a string containing the SQL code to update this item, False to execute it (Default: False)
242 * @return string|null If $return is False, nothing will be returned, else the sql code to update this item
243 */
244 public function mark_read($return = false)
245 {
246 return $this->mark(false, $return);
247 }
248
249 /**
250 * Mark this item unread
251 *
252 * @param bool $return True to return a string containing the SQL code to update this item, False to execute it (Default: False)
253 * @return string|null If $return is False, nothing will be returned, else the sql code to update this item
254 */
255 public function mark_unread($return = false)
256 {
257 return $this->mark(true, $return);
258 }
259
260 /**
261 * {inheritDoc}
262 */
263 public function get_redirect_url()
264 {
265 return $this->get_url();
266 }
267
268 /**
269 * Prepare to output the notification to the template
270 *
271 * @return array Template variables
272 */
273 public function prepare_for_display()
274 {
275 $mark_hash = generate_link_hash('mark_notification_read');
276
277 if ($this->get_url())
278 {
279 $u_mark_read = append_sid($this->phpbb_root_path . 'index.' . $this->php_ext, 'mark_notification=' . $this->notification_id . '&hash=' . $mark_hash);
280 }
281 else
282 {
283 $redirect = (($this->user->page['page_dir']) ? $this->user->page['page_dir'] . '/' : '') . $this->user->page['page_name'] . (($this->user->page['query_string']) ? '?' . $this->user->page['query_string'] : '');
284
285 $u_mark_read = append_sid($this->phpbb_root_path . 'index.' . $this->php_ext, 'mark_notification=' . $this->notification_id . '&hash=' . $mark_hash . '&redirect=' . urlencode($redirect));
286 }
287
288 return array(
289 'NOTIFICATION_ID' => $this->notification_id,
290 'STYLING' => $this->get_style_class(),
291 'AVATAR' => $this->get_avatar(),
292 'FORMATTED_TITLE' => $this->get_title(),
293 'REFERENCE' => $this->get_reference(),
294 'FORUM' => $this->get_forum(),
295 'REASON' => $this->get_reason(),
296 'URL' => $this->get_url(),
297 'TIME' => $this->user->format_date($this->notification_time),
298 'UNREAD' => !$this->notification_read,
299 'U_MARK_READ' => (!$this->notification_read) ? $u_mark_read : '',
300 );
301 }
302
303 /**
304 * -------------- Fall back functions -------------------
305 */
306
307 /**
308 * URL to unsubscribe to this notification (fall back)
309 *
310 * @param string|bool $method Method name to unsubscribe from (email|jabber|etc), False to unsubscribe from all notifications for this item
311 * @return false
312 */
313 public function get_unsubscribe_url($method = false)
314 {
315 return false;
316 }
317
318 /**
319 * Get the CSS style class of the notification (fall back)
320 *
321 * @return string
322 */
323 public function get_style_class()
324 {
325 return '';
326 }
327
328 /**
329 * Get the user's avatar (fall back)
330 *
331 * @return string
332 */
333 public function get_avatar()
334 {
335 return '';
336 }
337
338 /**
339 * Get the reference of the notifcation (fall back)
340 *
341 * @return string
342 */
343 public function get_reference()
344 {
345 return '';
346 }
347
348 /**
349 * Get the forum of the notification reference (fall back)
350 *
351 * @return string
352 */
353 public function get_forum()
354 {
355 return '';
356 }
357
358 /**
359 * Get the reason for the notifcation (fall back)
360 *
361 * @return string
362 */
363 public function get_reason()
364 {
365 return '';
366 }
367
368 /**
369 * Get the special items to load (fall back)
370 *
371 * @return array
372 */
373 public function get_load_special()
374 {
375 return array();
376 }
377
378 /**
379 * Load the special items (fall back)
380 *
381 * @param array $data
382 * @param array $notifications
383 */
384 public function load_special($data, $notifications)
385 {
386 return;
387 }
388
389 /**
390 * Is available (fall back)
391 *
392 * @return bool
393 */
394 public function is_available()
395 {
396 return true;
397 }
398
399 /**
400 * Pre create insert array function (fall back)
401 *
402 * @param array $type_data
403 * @param array $notify_users
404 * @return array
405 */
406 public function pre_create_insert_array($type_data, $notify_users)
407 {
408 return array();
409 }
410
411 /**
412 * -------------- Helper functions -------------------
413 */
414
415 /**
416 * Find the users who want to receive notifications (helper)
417 *
418 * @param array|bool $user_ids User IDs to check if they want to receive notifications
419 * (Bool False to check all users besides anonymous and bots (USER_IGNORE))
420 * @param array $options
421 * @return array
422 */
423 protected function check_user_notification_options($user_ids = false, $options = array())
424 {
425 $options = array_merge(array(
426 'ignore_users' => array(),
427 'item_type' => $this->get_type(),
428 'item_id' => 0, // Global by default
429 ), $options);
430
431 if ($user_ids === false)
432 {
433 $user_ids = array();
434
435 $sql = 'SELECT user_id
436 FROM ' . USERS_TABLE . '
437 WHERE user_id <> ' . ANONYMOUS . '
438 AND user_type <> ' . USER_IGNORE;
439 $result = $this->db->sql_query($sql);
440 while ($row = $this->db->sql_fetchrow($result))
441 {
442 $user_ids[] = $row['user_id'];
443 }
444 $this->db->sql_freeresult($result);
445 }
446
447 if (empty($user_ids))
448 {
449 return array();
450 }
451
452 $rowset = $output = array();
453
454 $sql = 'SELECT user_id, method, notify
455 FROM ' . $this->user_notifications_table . '
456 WHERE ' . $this->db->sql_in_set('user_id', $user_ids) . "
457 AND item_type = '" . $this->db->sql_escape($options['item_type']) . "'
458 AND item_id = " . (int) $options['item_id'];
459 $result = $this->db->sql_query($sql);
460
461 while ($row = $this->db->sql_fetchrow($result))
462 {
463 if (isset($options['ignore_users'][$row['user_id']]) && in_array($row['method'], $options['ignore_users'][$row['user_id']]))
464 {
465 continue;
466 }
467
468 if (!isset($rowset[$row['user_id']]))
469 {
470 $rowset[$row['user_id']] = array();
471 }
472 $rowset[$row['user_id']][$row['method']] = $row['notify'];
473
474 if (!isset($output[$row['user_id']]))
475 {
476 $output[$row['user_id']] = array();
477 }
478 if ($row['notify'])
479 {
480 $output[$row['user_id']][] = $row['method'];
481 }
482 }
483
484 $this->db->sql_freeresult($result);
485
486 $default_methods = $this->notification_manager->get_default_methods();
487
488 foreach ($user_ids as $user_id)
489 {
490 if (isset($options['ignore_users'][$user_id]))
491 {
492 continue;
493 }
494 if (!array_key_exists($user_id, $rowset))
495 {
496 // No rows at all for this user, use the default methods
497 $output[$user_id] = $default_methods;
498 }
499 else
500 {
501 foreach ($default_methods as $default_method)
502 {
503 if (!array_key_exists($default_method, $rowset[$user_id]))
504 {
505 // No user preference for this type recorded, but it should be enabled by default.
506 $output[$user_id][] = $default_method;
507 }
508 }
509 }
510 }
511
512 return $output;
513 }
514
515 /**
516 * Mark this item read/unread helper
517 *
518 * @param bool $unread Unread (True/False) (Default: False)
519 * @param bool $return True to return a string containing the SQL code to update this item, False to execute it (Default: False)
520 * @return string|null If $return is False, nothing will be returned, else the sql code to update this item
521 */
522 protected function mark($unread = true, $return = false)
523 {
524 $this->notification_read = (bool) !$unread;
525
526 if ($return)
527 {
528 $where = array(
529 'notification_type_id = ' . (int) $this->notification_type_id,
530 'item_id = ' . (int) $this->item_id,
531 'user_id = ' . (int) $this->user_id,
532 );
533
534 $where = implode(' AND ', $where);
535 return $where;
536 }
537 else
538 {
539 $this->notification_manager->mark_notifications($this->get_type(), (int) $this->item_id, (int) $this->user_id, false, $this->notification_read);
540 }
541
542 return null;
543 }
544
545 /**
546 * Get a list of users that are authorised to receive notifications
547 *
548 * @param array $users Array of users that have subscribed to a notification
549 * @param int $forum_id Forum ID of the forum
550 * @param array $options Array of notification options
551 * @param bool $sort Whether the users array should be sorted. Default: false
552 * @return array Array of users that are authorised recipients
553 */
554 protected function get_authorised_recipients($users, $forum_id, $options, $sort = false)
555 {
556 if (empty($users))
557 {
558 return array();
559 }
560
561 $users = array_unique($users);
562
563 if ($sort)
564 {
565 sort($users);
566 }
567
568 $auth_read = $this->auth->acl_get_list($users, 'f_read', $forum_id);
569
570 if (empty($auth_read))
571 {
572 return array();
573 }
574
575 return $this->check_user_notification_options($auth_read[$forum_id]['f_read'], $options);
576 }
577 }
578