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

post.php

Zuletzt modifiziert: 09.10.2024, 12:54 - Dateigröße: 11.70 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  * Post notifications class
 018  * This class handles notifications for replies to a topic
 019  */
 020   
 021  class post extends \phpbb\notification\type\base
 022  {
 023      /**
 024      * Get notification type name
 025      *
 026      * @return string
 027      */
 028      public function get_type()
 029      {
 030          return 'notification.type.post';
 031      }
 032   
 033      /**
 034      * Language key used to output the text
 035      *
 036      * @var string
 037      */
 038      protected $language_key = 'NOTIFICATION_POST';
 039   
 040      /**
 041      * Inherit notification read status from post.
 042      *
 043      * @var bool
 044      */
 045      protected $inherit_read_status = true;
 046   
 047      /**
 048      * Notification option data (for outputting to the user)
 049      *
 050      * @var bool|array False if the service should use it's default data
 051      *                     Array of data (including keys 'id', 'lang', and 'group')
 052      */
 053      static public $notification_option = array(
 054          'lang'    => 'NOTIFICATION_TYPE_POST',
 055          'group'    => 'NOTIFICATION_GROUP_POSTING',
 056      );
 057   
 058      /** @var \phpbb\user_loader */
 059      protected $user_loader;
 060   
 061      /** @var \phpbb\config\config */
 062      protected $config;
 063   
 064      public function set_config(\phpbb\config\config $config)
 065      {
 066          $this->config = $config;
 067      }
 068   
 069      public function set_user_loader(\phpbb\user_loader $user_loader)
 070      {
 071          $this->user_loader = $user_loader;
 072      }
 073   
 074      /**
 075      * Is available
 076      */
 077      public function is_available()
 078      {
 079          return $this->config['allow_topic_notify'];
 080      }
 081   
 082      /**
 083      * Get the id of the item
 084      *
 085      * @param array $post The data from the post
 086      * @return int The post id
 087      */
 088      static public function get_item_id($post)
 089      {
 090          return (int) $post['post_id'];
 091      }
 092   
 093      /**
 094      * Get the id of the parent
 095      *
 096      * @param array $post The data from the post
 097      * @return int The topic id
 098      */
 099      static public function get_item_parent_id($post)
 100      {
 101          return (int) $post['topic_id'];
 102      }
 103   
 104      /**
 105      * Find the users who want to receive notifications
 106      *
 107      * @param array $post Data from submit_post
 108      * @param array $options Options for finding users for notification
 109      *
 110      * @return array
 111      */
 112      public function find_users_for_notification($post, $options = array())
 113      {
 114          $options = array_merge(array(
 115              'ignore_users'        => array(),
 116          ), $options);
 117   
 118          $users = array();
 119   
 120          $sql = 'SELECT user_id
 121              FROM ' . TOPICS_WATCH_TABLE . '
 122              WHERE topic_id = ' . (int) $post['topic_id'] . '
 123                  AND notify_status = ' . NOTIFY_YES . '
 124                  AND user_id <> ' . (int) $post['poster_id'];
 125          $result = $this->db->sql_query($sql);
 126          while ($row = $this->db->sql_fetchrow($result))
 127          {
 128              $users[] = (int) $row['user_id'];
 129          }
 130          $this->db->sql_freeresult($result);
 131   
 132          $sql = 'SELECT user_id
 133              FROM ' . FORUMS_WATCH_TABLE . '
 134              WHERE forum_id = ' . (int) $post['forum_id'] . '
 135                  AND notify_status = ' . NOTIFY_YES . '
 136                  AND user_id <> ' . (int) $post['poster_id'];
 137          $result = $this->db->sql_query($sql);
 138          while ($row = $this->db->sql_fetchrow($result))
 139          {
 140              $users[] = (int) $row['user_id'];
 141          }
 142          $this->db->sql_freeresult($result);
 143   
 144          $notify_users = $this->get_authorised_recipients($users, $post['forum_id'], $options, true);
 145   
 146          if (empty($notify_users))
 147          {
 148              return array();
 149          }
 150   
 151          // Try to find the users who already have been notified about replies and have not read the topic since and just update their notifications
 152          $notified_users = $this->notification_manager->get_notified_users($this->get_type(), array(
 153              'item_parent_id'    => static::get_item_parent_id($post),
 154              'read'                => 0,
 155          ));
 156   
 157          foreach ($notified_users as $user => $notification_data)
 158          {
 159              unset($notify_users[$user]);
 160   
 161              /** @var post $notification */
 162              $notification = $this->notification_manager->get_item_type_class($this->get_type(), $notification_data);
 163              $update_responders = $notification->add_responders($post);
 164              if (!empty($update_responders))
 165              {
 166                  $this->notification_manager->update_notification($notification, $update_responders, array(
 167                      'item_parent_id'    => self::get_item_parent_id($post),
 168                      'read'                => 0,
 169                      'user_id'            => $user,
 170                  ));
 171              }
 172          }
 173   
 174          return $notify_users;
 175      }
 176   
 177      /**
 178      * Get the user's avatar
 179      */
 180      public function get_avatar()
 181      {
 182          return $this->user_loader->get_avatar($this->get_data('poster_id'), false, true);
 183      }
 184   
 185      /**
 186      * Get the HTML formatted title of this notification
 187      *
 188      * @return string
 189      */
 190      public function get_title()
 191      {
 192          $responders = $this->get_data('responders');
 193          $usernames = array();
 194   
 195          if (!is_array($responders))
 196          {
 197              $responders = array();
 198          }
 199   
 200          $responders = array_merge(array(array(
 201              'poster_id'        => $this->get_data('poster_id'),
 202              'username'        => $this->get_data('post_username'),
 203          )), $responders);
 204   
 205          $responders_cnt = sizeof($responders);
 206          $responders = $this->trim_user_ary($responders);
 207          $trimmed_responders_cnt = $responders_cnt - sizeof($responders);
 208   
 209          foreach ($responders as $responder)
 210          {
 211              if ($responder['username'])
 212              {
 213                  $usernames[] = $responder['username'];
 214              }
 215              else
 216              {
 217                  $usernames[] = $this->user_loader->get_username($responder['poster_id'], 'no_profile');
 218              }
 219          }
 220   
 221          if ($trimmed_responders_cnt > 20)
 222          {
 223              $usernames[] = $this->language->lang('NOTIFICATION_MANY_OTHERS');
 224          }
 225          else if ($trimmed_responders_cnt)
 226          {
 227              $usernames[] = $this->language->lang('NOTIFICATION_X_OTHERS', $trimmed_responders_cnt);
 228          }
 229   
 230          return $this->language->lang(
 231              $this->language_key,
 232              phpbb_generate_string_list($usernames, $this->user),
 233              $responders_cnt
 234          );
 235      }
 236   
 237      /**
 238      * Get the HTML formatted reference of the notification
 239      *
 240      * @return string
 241      */
 242      public function get_reference()
 243      {
 244          return $this->language->lang(
 245              'NOTIFICATION_REFERENCE',
 246              censor_text($this->get_data('topic_title'))
 247          );
 248      }
 249   
 250      /**
 251      * Get email template
 252      *
 253      * @return string|bool
 254      */
 255      public function get_email_template()
 256      {
 257          return 'topic_notify';
 258      }
 259   
 260      /**
 261      * Get email template variables
 262      *
 263      * @return array
 264      */
 265      public function get_email_template_variables()
 266      {
 267          if ($this->get_data('post_username'))
 268          {
 269              $username = $this->get_data('post_username');
 270          }
 271          else
 272          {
 273              $username = $this->user_loader->get_username($this->get_data('poster_id'), 'username');
 274          }
 275   
 276          return array(
 277              'AUTHOR_NAME'                => htmlspecialchars_decode($username),
 278              'POST_SUBJECT'                => htmlspecialchars_decode(censor_text($this->get_data('post_subject'))),
 279              'TOPIC_TITLE'                => htmlspecialchars_decode(censor_text($this->get_data('topic_title'))),
 280   
 281              'U_VIEW_POST'                => generate_board_url() . "/viewtopic.{$this->php_ext}?p={$this->item_id}#p{$this->item_id}",
 282              'U_NEWEST_POST'                => generate_board_url() . "/viewtopic.{$this->php_ext}?f={$this->get_data('forum_id')}&t={$this->item_parent_id}&e=1&view=unread#unread",
 283              'U_TOPIC'                    => generate_board_url() . "/viewtopic.{$this->php_ext}?f={$this->get_data('forum_id')}&t={$this->item_parent_id}",
 284              'U_VIEW_TOPIC'                => generate_board_url() . "/viewtopic.{$this->php_ext}?f={$this->get_data('forum_id')}&t={$this->item_parent_id}",
 285              'U_FORUM'                    => generate_board_url() . "/viewforum.{$this->php_ext}?f={$this->get_data('forum_id')}",
 286              'U_STOP_WATCHING_TOPIC'        => generate_board_url() . "/viewtopic.{$this->php_ext}?uid={$this->user_id}&f={$this->get_data('forum_id')}&t={$this->item_parent_id}&unwatch=topic",
 287          );
 288      }
 289   
 290      /**
 291      * Get the url to this item
 292      *
 293      * @return string URL
 294      */
 295      public function get_url()
 296      {
 297          return append_sid($this->phpbb_root_path . 'viewtopic.' . $this->php_ext, "p={$this->item_id}#p{$this->item_id}");
 298      }
 299   
 300      /**
 301      * {inheritDoc}
 302      */
 303      public function get_redirect_url()
 304      {
 305          return append_sid($this->phpbb_root_path . 'viewtopic.' . $this->php_ext, "t={$this->item_parent_id}&amp;view=unread#unread");
 306      }
 307   
 308      /**
 309      * Users needed to query before this notification can be displayed
 310      *
 311      * @return array Array of user_ids
 312      */
 313      public function users_to_query()
 314      {
 315          $responders = $this->get_data('responders');
 316          $users = array(
 317              $this->get_data('poster_id'),
 318          );
 319   
 320          if (is_array($responders))
 321          {
 322              foreach ($responders as $responder)
 323              {
 324                  $users[] = $responder['poster_id'];
 325              }
 326          }
 327   
 328          return $this->trim_user_ary($users);
 329      }
 330   
 331      /**
 332      * Trim the user array passed down to 3 users if the array contains
 333      * more than 4 users.
 334      *
 335      * @param array $users Array of users
 336      * @return array Trimmed array of user_ids
 337      */
 338      public function trim_user_ary($users)
 339      {
 340          if (sizeof($users) > 4)
 341          {
 342              array_splice($users, 3);
 343          }
 344          return $users;
 345      }
 346   
 347      /**
 348      * Pre create insert array function
 349      * This allows you to perform certain actions, like run a query
 350      * and load data, before create_insert_array() is run. The data
 351      * returned from this function will be sent to create_insert_array().
 352      *
 353      * @param array $post Post data from submit_post
 354      * @param array $notify_users Notify users list
 355      *         Formated from find_users_for_notification()
 356      * @return array Whatever you want to send to create_insert_array().
 357      */
 358      public function pre_create_insert_array($post, $notify_users)
 359      {
 360          if (!sizeof($notify_users) || !$this->inherit_read_status)
 361          {
 362              return array();
 363          }
 364   
 365          $tracking_data = array();
 366          $sql = 'SELECT user_id, mark_time FROM ' . TOPICS_TRACK_TABLE . '
 367              WHERE topic_id = ' . (int) $post['topic_id'] . '
 368                  AND ' . $this->db->sql_in_set('user_id', array_keys($notify_users));
 369          $result = $this->db->sql_query($sql);
 370          while ($row = $this->db->sql_fetchrow($result))
 371          {
 372              $tracking_data[$row['user_id']] = $row['mark_time'];
 373          }
 374          $this->db->sql_freeresult($result);
 375   
 376          return $tracking_data;
 377      }
 378   
 379      /**
 380      * {@inheritdoc}
 381      */
 382      public function create_insert_array($post, $pre_create_data = array())
 383      {
 384          $this->set_data('poster_id', $post['poster_id']);
 385   
 386          $this->set_data('topic_title', $post['topic_title']);
 387   
 388          $this->set_data('post_subject', $post['post_subject']);
 389   
 390          $this->set_data('post_username', (($post['poster_id'] == ANONYMOUS) ? $post['post_username'] : ''));
 391   
 392          $this->set_data('forum_id', $post['forum_id']);
 393   
 394          $this->set_data('forum_name', $post['forum_name']);
 395   
 396          $this->notification_time = $post['post_time'];
 397   
 398          // Topics can be "read" before they are public (while awaiting approval).
 399          // Make sure that if the user has read the topic, it's marked as read in the notification
 400          if ($this->inherit_read_status && isset($pre_create_data[$this->user_id]) && $pre_create_data[$this->user_id] >= $this->notification_time)
 401          {
 402              $this->notification_read = true;
 403          }
 404   
 405          parent::create_insert_array($post, $pre_create_data);
 406      }
 407   
 408      /**
 409      * Add responders to the notification
 410      *
 411      * @param mixed $post
 412      * @return array Array of responder data
 413      */
 414      public function add_responders($post)
 415      {
 416          // Do not add them as a responder if they were the original poster that created the notification
 417          if ($this->get_data('poster_id') == $post['poster_id'])
 418          {
 419              return array();
 420          }
 421   
 422          $responders = $this->get_data('responders');
 423   
 424          $responders = ($responders === null) ? array() : $responders;
 425   
 426          // Do not add more than 25 responders,
 427          // we trim the username list to "a, b, c and x others" anyway
 428          // so there is no use to add all of them anyway.
 429          if (sizeof($responders) > 25)
 430          {
 431              return array();
 432          }
 433   
 434          foreach ($responders as $responder)
 435          {
 436              // Do not add them as a responder multiple times
 437              if ($responder['poster_id'] == $post['poster_id'])
 438              {
 439                  return array();
 440              }
 441          }
 442   
 443          $responders[] = array(
 444              'poster_id'        => $post['poster_id'],
 445              'username'        => (($post['poster_id'] == ANONYMOUS) ? $post['post_username'] : ''),
 446          );
 447   
 448          $this->set_data('responders', $responders);
 449   
 450          $serialized_data = serialize($this->get_data(false));
 451   
 452          // If the data is longer then 4000 characters, it would cause a SQL error.
 453          // We don't add the username to the list if this is the case.
 454          if (utf8_strlen($serialized_data) >= 4000)
 455          {
 456              return array();
 457          }
 458   
 459          $data_array = array_merge(array(
 460              'post_time'        => $post['post_time'],
 461              'post_id'        => $post['post_id'],
 462              'topic_id'        => $post['topic_id']
 463          ), $this->get_data(false));
 464   
 465          return $data_array;
 466      }
 467  }
 468