Verzeichnisstruktur phpBB-3.1.0


Veröffentlicht
27.10.2014

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.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

(Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

base.php

Zuletzt modifiziert: 09.10.2024, 12:54 - Dateigröße: 14.24 KiB


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