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.
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.13 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\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 . '&amp;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 . '&amp;hash=' . $mark_hash . '&amp;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