[ Index ] |
PHP Cross Reference of phpBB-3.3.14-deutsch |
[Summary view] [Print] [Text view]
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 $notify_users = $this->get_authorised_recipients($users, $post['forum_id'], $options, true); 133 134 if (empty($notify_users)) 135 { 136 return array(); 137 } 138 139 // Try to find the users who already have been notified about replies and have not read the topic since and just update their notifications 140 $notified_users = $this->notification_manager->get_notified_users($this->get_type(), array( 141 'item_parent_id' => static::get_item_parent_id($post), 142 'read' => 0, 143 )); 144 145 foreach ($notified_users as $user => $notification_data) 146 { 147 unset($notify_users[$user]); 148 149 /** @var post $notification */ 150 $notification = $this->notification_manager->get_item_type_class($this->get_type(), $notification_data); 151 $update_responders = $notification->add_responders($post); 152 if (!empty($update_responders)) 153 { 154 $this->notification_manager->update_notification($notification, $update_responders, array( 155 'item_parent_id' => self::get_item_parent_id($post), 156 'read' => 0, 157 'user_id' => $user, 158 )); 159 } 160 } 161 162 return $notify_users; 163 } 164 165 /** 166 * Get the user's avatar 167 */ 168 public function get_avatar() 169 { 170 return $this->user_loader->get_avatar($this->get_data('poster_id'), false, true); 171 } 172 173 /** 174 * Get the HTML formatted title of this notification 175 * 176 * @return string 177 */ 178 public function get_title() 179 { 180 $responders = $this->get_data('responders'); 181 $usernames = array(); 182 183 if (!is_array($responders)) 184 { 185 $responders = array(); 186 } 187 188 $responders = array_merge(array(array( 189 'poster_id' => $this->get_data('poster_id'), 190 'username' => $this->get_data('post_username'), 191 )), $responders); 192 193 $responders_cnt = count($responders); 194 $responders = $this->trim_user_ary($responders); 195 $trimmed_responders_cnt = $responders_cnt - count($responders); 196 197 foreach ($responders as $responder) 198 { 199 if ($responder['username']) 200 { 201 $usernames[] = $responder['username']; 202 } 203 else 204 { 205 $usernames[] = $this->user_loader->get_username($responder['poster_id'], 'no_profile'); 206 } 207 } 208 209 if ($trimmed_responders_cnt > 20) 210 { 211 $usernames[] = $this->language->lang('NOTIFICATION_MANY_OTHERS'); 212 } 213 else if ($trimmed_responders_cnt) 214 { 215 $usernames[] = $this->language->lang('NOTIFICATION_X_OTHERS', $trimmed_responders_cnt); 216 } 217 218 return $this->language->lang( 219 $this->language_key, 220 phpbb_generate_string_list($usernames, $this->user), 221 $responders_cnt 222 ); 223 } 224 225 /** 226 * Get the HTML formatted reference of the notification 227 * 228 * @return string 229 */ 230 public function get_reference() 231 { 232 return $this->language->lang( 233 'NOTIFICATION_REFERENCE', 234 censor_text($this->get_data('topic_title')) 235 ); 236 } 237 238 /** 239 * Get email template 240 * 241 * @return string|bool 242 */ 243 public function get_email_template() 244 { 245 return 'topic_notify'; 246 } 247 248 /** 249 * Get email template variables 250 * 251 * @return array 252 */ 253 public function get_email_template_variables() 254 { 255 if ($this->get_data('post_username')) 256 { 257 $username = $this->get_data('post_username'); 258 } 259 else 260 { 261 $username = $this->user_loader->get_username($this->get_data('poster_id'), 'username'); 262 } 263 264 return array( 265 'AUTHOR_NAME' => html_entity_decode($username, ENT_COMPAT), 266 'POST_SUBJECT' => html_entity_decode(censor_text($this->get_data('post_subject')), ENT_COMPAT), 267 'TOPIC_TITLE' => html_entity_decode(censor_text($this->get_data('topic_title')), ENT_COMPAT), 268 269 'U_VIEW_POST' => generate_board_url() . "/viewtopic.{$this->php_ext}?p={$this->item_id}#p{$this->item_id}", 270 'U_NEWEST_POST' => generate_board_url() . "/viewtopic.{$this->php_ext}?t={$this->item_parent_id}&e=1&view=unread#unread", 271 'U_TOPIC' => generate_board_url() . "/viewtopic.{$this->php_ext}?t={$this->item_parent_id}", 272 'U_VIEW_TOPIC' => generate_board_url() . "/viewtopic.{$this->php_ext}?t={$this->item_parent_id}", 273 'U_FORUM' => generate_board_url() . "/viewforum.{$this->php_ext}?f={$this->get_data('forum_id')}", 274 'U_STOP_WATCHING_TOPIC' => generate_board_url() . "/viewtopic.{$this->php_ext}?uid={$this->user_id}&t={$this->item_parent_id}&unwatch=topic", 275 ); 276 } 277 278 /** 279 * Get the url to this item 280 * 281 * @return string URL 282 */ 283 public function get_url() 284 { 285 return append_sid($this->phpbb_root_path . 'viewtopic.' . $this->php_ext, "p={$this->item_id}#p{$this->item_id}"); 286 } 287 288 /** 289 * {inheritDoc} 290 */ 291 public function get_redirect_url() 292 { 293 return append_sid($this->phpbb_root_path . 'viewtopic.' . $this->php_ext, "t={$this->item_parent_id}&view=unread#unread"); 294 } 295 296 /** 297 * Users needed to query before this notification can be displayed 298 * 299 * @return array Array of user_ids 300 */ 301 public function users_to_query() 302 { 303 $responders = $this->get_data('responders'); 304 $users = array( 305 $this->get_data('poster_id'), 306 ); 307 308 if (is_array($responders)) 309 { 310 foreach ($responders as $responder) 311 { 312 $users[] = $responder['poster_id']; 313 } 314 } 315 316 return $this->trim_user_ary($users); 317 } 318 319 /** 320 * Trim the user array passed down to 3 users if the array contains 321 * more than 4 users. 322 * 323 * @param array $users Array of users 324 * @return array Trimmed array of user_ids 325 */ 326 public function trim_user_ary($users) 327 { 328 if (count($users) > 4) 329 { 330 array_splice($users, 3); 331 } 332 return $users; 333 } 334 335 /** 336 * Pre create insert array function 337 * This allows you to perform certain actions, like run a query 338 * and load data, before create_insert_array() is run. The data 339 * returned from this function will be sent to create_insert_array(). 340 * 341 * @param array $post Post data from submit_post 342 * @param array $notify_users Notify users list 343 * Formatted from find_users_for_notification() 344 * @return array Whatever you want to send to create_insert_array(). 345 */ 346 public function pre_create_insert_array($post, $notify_users) 347 { 348 if (!count($notify_users) || !$this->inherit_read_status) 349 { 350 return array(); 351 } 352 353 $tracking_data = array(); 354 $sql = 'SELECT user_id, mark_time FROM ' . TOPICS_TRACK_TABLE . ' 355 WHERE topic_id = ' . (int) $post['topic_id'] . ' 356 AND ' . $this->db->sql_in_set('user_id', array_keys($notify_users)); 357 $result = $this->db->sql_query($sql); 358 while ($row = $this->db->sql_fetchrow($result)) 359 { 360 $tracking_data[$row['user_id']] = $row['mark_time']; 361 } 362 $this->db->sql_freeresult($result); 363 364 return $tracking_data; 365 } 366 367 /** 368 * {@inheritdoc} 369 */ 370 public function create_insert_array($post, $pre_create_data = array()) 371 { 372 $this->set_data('poster_id', $post['poster_id']); 373 374 $this->set_data('topic_title', $post['topic_title']); 375 376 $this->set_data('post_subject', $post['post_subject']); 377 378 $this->set_data('post_username', (($post['poster_id'] == ANONYMOUS) ? $post['post_username'] : '')); 379 380 $this->set_data('forum_id', $post['forum_id']); 381 382 $this->set_data('forum_name', $post['forum_name']); 383 384 $this->notification_time = $post['post_time']; 385 386 // Topics can be "read" before they are public (while awaiting approval). 387 // Make sure that if the user has read the topic, it's marked as read in the notification 388 if ($this->inherit_read_status && isset($pre_create_data[$this->user_id]) && $pre_create_data[$this->user_id] >= $this->notification_time) 389 { 390 $this->notification_read = true; 391 } 392 393 parent::create_insert_array($post, $pre_create_data); 394 } 395 396 /** 397 * Add responders to the notification 398 * 399 * @param mixed $post 400 * @return array Array of responder data 401 */ 402 public function add_responders($post) 403 { 404 // Do not add them as a responder if they were the original poster that created the notification 405 if ($this->get_data('poster_id') == $post['poster_id']) 406 { 407 return array(); 408 } 409 410 $responders = $this->get_data('responders'); 411 412 $responders = ($responders === null) ? array() : $responders; 413 414 // Do not add more than 25 responders, 415 // we trim the username list to "a, b, c and x others" anyway 416 // so there is no use to add all of them anyway. 417 if (count($responders) > 25) 418 { 419 return array(); 420 } 421 422 foreach ($responders as $responder) 423 { 424 // Do not add them as a responder multiple times 425 if ($responder['poster_id'] == $post['poster_id']) 426 { 427 return array(); 428 } 429 } 430 431 $responders[] = array( 432 'poster_id' => $post['poster_id'], 433 'username' => (($post['poster_id'] == ANONYMOUS) ? $post['post_username'] : ''), 434 ); 435 436 $this->set_data('responders', $responders); 437 438 $serialized_data = serialize($this->get_data(false)); 439 440 // If the data is longer then 4000 characters, it would cause a SQL error. 441 // We don't add the username to the list if this is the case. 442 if (utf8_strlen($serialized_data) >= 4000) 443 { 444 return array(); 445 } 446 447 $data_array = array_merge(array( 448 'poster_id' => $post['poster_id'], 449 'topic_title' => $post['topic_title'], 450 'post_subject' => $post['post_subject'], 451 'post_username' => $post['post_username'], 452 'forum_id' => $post['forum_id'], 453 'forum_name' => $post['forum_name'], 454 'post_time' => $post['post_time'], 455 'post_id' => $post['post_id'], 456 'topic_id' => $post['topic_id'] 457 ), $this->get_data(false)); 458 459 return $data_array; 460 } 461 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Mon Nov 25 19:05:08 2024 | Cross-referenced by PHPXref 0.7.1 |