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