[ Index ]

PHP Cross Reference of phpBB-3.2.11-deutsch

title

Body

[close]

/phpbb/notification/type/ -> post.php (source)

   1  <?php
   2  /**
   3  *
   4  * This file is part of the phpBB Forum Software package.
   5  *
   6  * @copyright (c) phpBB Limited <https://www.phpbb.com>
   7  * @license GNU General Public License, version 2 (GPL-2.0)
   8  *
   9  * For full copyright and license information, please see
  10  * the docs/CREDITS.txt file.
  11  *
  12  */
  13  
  14  namespace phpbb\notification\type;
  15  
  16  /**
  17  * Post notifications class
  18  * This class handles notifications for replies to a topic
  19  */
  20  
  21  class post extends \phpbb\notification\type\base
  22  {
  23      /**
  24      * Get notification type name
  25      *
  26      * @return string
  27      */
  28  	public function get_type()
  29      {
  30          return 'notification.type.post';
  31      }
  32  
  33      /**
  34      * Language key used to output the text
  35      *
  36      * @var string
  37      */
  38      protected $language_key = 'NOTIFICATION_POST';
  39  
  40      /**
  41      * Inherit notification read status from post.
  42      *
  43      * @var bool
  44      */
  45      protected $inherit_read_status = true;
  46  
  47      /**
  48      * Notification option data (for outputting to the user)
  49      *
  50      * @var bool|array False if the service should use it's default data
  51      *                     Array of data (including keys 'id', 'lang', and 'group')
  52      */
  53      static public $notification_option = array(
  54          'lang'    => 'NOTIFICATION_TYPE_POST',
  55          'group'    => 'NOTIFICATION_GROUP_POSTING',
  56      );
  57  
  58      /** @var \phpbb\user_loader */
  59      protected $user_loader;
  60  
  61      /** @var \phpbb\config\config */
  62      protected $config;
  63  
  64  	public function set_config(\phpbb\config\config $config)
  65      {
  66          $this->config = $config;
  67      }
  68  
  69  	public function set_user_loader(\phpbb\user_loader $user_loader)
  70      {
  71          $this->user_loader = $user_loader;
  72      }
  73  
  74      /**
  75      * Is available
  76      */
  77  	public function is_available()
  78      {
  79          return $this->config['allow_topic_notify'];
  80      }
  81  
  82      /**
  83      * Get the id of the item
  84      *
  85      * @param array $post The data from the post
  86      * @return int The post id
  87      */
  88  	static public function get_item_id($post)
  89      {
  90          return (int) $post['post_id'];
  91      }
  92  
  93      /**
  94      * Get the id of the parent
  95      *
  96      * @param array $post The data from the post
  97      * @return int The topic id
  98      */
  99  	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 = count($responders);
 206          $responders = $this->trim_user_ary($responders);
 207          $trimmed_responders_cnt = $responders_cnt - count($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 (count($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 (!count($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 (count($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  }


Generated: Wed Nov 11 20:33:01 2020 Cross-referenced by PHPXref 0.7.1