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

post.php

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