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

board.php

Zuletzt modifiziert: 09.10.2024, 12:54 - Dateigröße: 13.53 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\method;
015   
016  /**
017  * In Board notification method class
018  * This class handles in board notifications. This method is enabled by default.
019  *
020  * @package notifications
021  */
022  class board extends \phpbb\notification\method\base
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\user */
034      protected $user;
035   
036      /** @var \phpbb\config\config */
037      protected $config;
038   
039      /** @var string */
040      protected $notification_types_table;
041   
042      /** @var string */
043      protected $notifications_table;
044   
045      /**
046      * Notification Method Board Constructor
047      *
048      * @param \phpbb\user_loader $user_loader
049      * @param \phpbb\db\driver\driver_interface $db
050      * @param \phpbb\cache\driver\driver_interface $cache
051      * @param \phpbb\user $user
052      * @param \phpbb\config\config $config
053      * @param string $notification_types_table
054      * @param string $notifications_table
055      */
056      public function __construct(\phpbb\user_loader $user_loader, \phpbb\db\driver\driver_interface $db, \phpbb\cache\driver\driver_interface $cache, \phpbb\user $user, \phpbb\config\config $config, $notification_types_table, $notifications_table)
057      {
058          $this->user_loader = $user_loader;
059          $this->db = $db;
060          $this->cache = $cache;
061          $this->user = $user;
062          $this->config = $config;
063          $this->notification_types_table = $notification_types_table;
064          $this->notifications_table = $notifications_table;
065   
066      }
067   
068      /**
069      * {@inheritdoc}
070      */
071      public function add_to_queue(\phpbb\notification\type\type_interface $notification)
072      {
073          $this->queue[] = $notification;
074      }
075   
076      /**
077      * {@inheritdoc}
078      */
079      public function get_type()
080      {
081          return 'notification.method.board';
082      }
083   
084      /**
085      * {@inheritdoc}
086      */
087      public function is_available()
088      {
089          return $this->config['allow_board_notifications'];
090      }
091   
092      /**
093      * {@inheritdoc}
094      */
095      public function is_enabled_by_default()
096      {
097          return true;
098      }
099   
100      /**
101      * {@inheritdoc}
102      */
103      public function get_notified_users($notification_type_id, array $options)
104      {
105          $notified_users = array();
106          $sql = 'SELECT n.*
107              FROM ' . $this->notifications_table . ' n, ' . $this->notification_types_table . ' nt
108              WHERE n.notification_type_id = ' . (int) $notification_type_id .
109              (isset($options['item_id']) ? ' AND n.item_id = ' . (int) $options['item_id'] : '') .
110              (isset($options['item_parent_id']) ? ' AND n.item_parent_id = ' . (int) $options['item_parent_id'] : '') .
111              (isset($options['user_id']) ? ' AND n.user_id = ' . (int) $options['user_id'] : '') .
112              (isset($options['read']) ? ' AND n.notification_read = ' . (int) $options['read'] : '') .'
113                  AND nt.notification_type_id = n.notification_type_id
114                  AND nt.notification_type_enabled = 1';
115          $result = $this->db->sql_query($sql);
116          while ($row = $this->db->sql_fetchrow($result))
117          {
118              $notified_users[$row['user_id']] = $row;
119          }
120          $this->db->sql_freeresult($result);
121   
122          return $notified_users;
123      }
124   
125      /**
126      * {@inheritdoc}
127      */
128      public function load_notifications(array $options = array())
129      {
130          // Merge default options
131          $options = array_merge(array(
132              'notification_id'    => false,
133              'user_id'            => $this->user->data['user_id'],
134              'order_by'            => 'notification_time',
135              'order_dir'            => 'DESC',
136              'limit'                => 0,
137              'start'                => 0,
138              'all_unread'        => false,
139              'count_unread'        => false,
140              'count_total'        => false,
141          ), $options);
142   
143          // If all_unread, count_unread must be true
144          $options['count_unread'] = ($options['all_unread']) ? true : $options['count_unread'];
145   
146          // Anonymous users and bots never receive notifications
147          if ($options['user_id'] == $this->user->data['user_id'] && ($this->user->data['user_id'] == ANONYMOUS || $this->user->data['user_type'] == USER_IGNORE))
148          {
149              return array(
150                  'notifications'        => array(),
151                  'unread_count'        => 0,
152                  'total_count'        => 0,
153              );
154          }
155   
156          $notifications = $user_ids = array();
157          $load_special = array();
158          $total_count = $unread_count = 0;
159   
160          if ($options['count_unread'])
161          {
162              // Get the total number of unread notifications
163              $sql = 'SELECT COUNT(n.notification_id) AS unread_count
164                  FROM ' . $this->notifications_table . ' n, ' . $this->notification_types_table . ' nt
165                  WHERE n.user_id = ' . (int) $options['user_id'] . '
166                      AND n.notification_read = 0
167                      AND nt.notification_type_id = n.notification_type_id
168                      AND nt.notification_type_enabled = 1';
169              $result = $this->db->sql_query($sql);
170              $unread_count = (int) $this->db->sql_fetchfield('unread_count');
171              $this->db->sql_freeresult($result);
172          }
173   
174          if ($options['count_total'])
175          {
176              // Get the total number of notifications
177              $sql = 'SELECT COUNT(n.notification_id) AS total_count
178                  FROM ' . $this->notifications_table . ' n, ' . $this->notification_types_table . ' nt
179                  WHERE n.user_id = ' . (int) $options['user_id'] . '
180                      AND nt.notification_type_id = n.notification_type_id
181                      AND nt.notification_type_enabled = 1';
182              $result = $this->db->sql_query($sql);
183              $total_count = (int) $this->db->sql_fetchfield('total_count');
184              $this->db->sql_freeresult($result);
185          }
186   
187          if (!$options['count_total'] || $total_count)
188          {
189              $rowset = array();
190   
191              // Get the main notifications
192              $sql = 'SELECT n.*, nt.notification_type_name
193                  FROM ' . $this->notifications_table . ' n, ' . $this->notification_types_table . ' nt
194                  WHERE n.user_id = ' . (int) $options['user_id'] .
195                  (($options['notification_id']) ? ((is_array($options['notification_id'])) ? ' AND ' . $this->db->sql_in_set('n.notification_id', $options['notification_id']) : ' AND n.notification_id = ' . (int) $options['notification_id']) : '') . '
196                      AND nt.notification_type_id = n.notification_type_id
197                      AND nt.notification_type_enabled = 1
198                  ORDER BY n.' . $this->db->sql_escape($options['order_by']) . ' ' . $this->db->sql_escape($options['order_dir']);
199              $result = $this->db->sql_query_limit($sql, $options['limit'], $options['start']);
200   
201              while ($row = $this->db->sql_fetchrow($result))
202              {
203                  $rowset[$row['notification_id']] = $row;
204              }
205              $this->db->sql_freeresult($result);
206   
207              // Get all unread notifications
208              if ($unread_count && $options['all_unread'] && !empty($rowset))
209              {
210                  $sql = 'SELECT n.*, nt.notification_type_name
211                  FROM ' . $this->notifications_table . ' n, ' . $this->notification_types_table . ' nt
212                      WHERE n.user_id = ' . (int) $options['user_id'] . '
213                          AND n.notification_read = 0
214                          AND ' . $this->db->sql_in_set('n.notification_id', array_keys($rowset), true) . '
215                          AND nt.notification_type_id = n.notification_type_id
216                          AND nt.notification_type_enabled = 1
217                      ORDER BY n.' . $this->db->sql_escape($options['order_by']) . ' ' . $this->db->sql_escape($options['order_dir']);
218                  $result = $this->db->sql_query_limit($sql, $options['limit'], $options['start']);
219   
220                  while ($row = $this->db->sql_fetchrow($result))
221                  {
222                      $rowset[$row['notification_id']] = $row;
223                  }
224                  $this->db->sql_freeresult($result);
225              }
226   
227              foreach ($rowset as $row)
228              {
229                  $notification = $this->notification_manager->get_item_type_class($row['notification_type_name'], $row);
230   
231                  // Array of user_ids to query all at once
232                  $user_ids = array_merge($user_ids, $notification->users_to_query());
233   
234                  // Some notification types also require querying additional tables themselves
235                  if (!isset($load_special[$row['notification_type_name']]))
236                  {
237                      $load_special[$row['notification_type_name']] = array();
238                  }
239                  $load_special[$row['notification_type_name']] = array_merge($load_special[$row['notification_type_name']], $notification->get_load_special());
240   
241                  $notifications[$row['notification_id']] = $notification;
242              }
243   
244              $this->user_loader->load_users($user_ids);
245   
246              // Allow each type to load its own special items
247              foreach ($load_special as $item_type => $data)
248              {
249                  $item_class = $this->notification_manager->get_item_type_class($item_type);
250   
251                  $item_class->load_special($data, $notifications);
252              }
253          }
254   
255          return array(
256              'notifications'        => $notifications,
257              'unread_count'        => $unread_count,
258              'total_count'        => $total_count,
259          );
260      }
261   
262      /**
263      * {@inheritdoc}
264      */
265      public function notify()
266      {
267          $insert_buffer = new \phpbb\db\sql_insert_buffer($this->db, $this->notifications_table);
268   
269          /** @var \phpbb\notification\type\type_interface $notification */
270          foreach ($this->queue as $notification)
271          {
272              $data = $notification->get_insert_array();
273              $insert_buffer->insert($data);
274          }
275   
276          $insert_buffer->flush();
277   
278          // We're done, empty the queue
279          $this->empty_queue();
280      }
281   
282      /**
283      * {@inheritdoc}
284      */
285      public function update_notification($notification, array $data, array $options)
286      {
287          // Allow the notifications class to over-ride the update_notifications functionality
288          if (method_exists($notification, 'update_notifications'))
289          {
290              // Return False to over-ride the rest of the update
291              if ($notification->update_notifications($data) === false)
292              {
293                  return;
294              }
295          }
296   
297          $notification_type_id = $this->notification_manager->get_notification_type_id($notification->get_type());
298          $update_array = $notification->create_update_array($data);
299   
300          $sql = 'UPDATE ' . $this->notifications_table . '
301              SET ' . $this->db->sql_build_array('UPDATE', $update_array) . '
302              WHERE notification_type_id = ' . (int) $notification_type_id .
303              (isset($options['item_id']) ? ' AND item_id = ' . (int) $options['item_id'] : '') .
304              (isset($options['item_parent_id']) ? ' AND item_parent_id = ' . (int) $options['item_parent_id'] : '') .
305              (isset($options['user_id']) ? ' AND user_id = ' . (int) $options['user_id'] : '') .
306              (isset($options['read']) ? ' AND notification_read = ' . (int) $options['read'] : '');
307          $this->db->sql_query($sql);
308      }
309   
310      /**
311      * {@inheritdoc}
312      */
313      public function mark_notifications($notification_type_id, $item_id, $user_id, $time = false, $mark_read = true)
314      {
315          $time = ($time !== false) ? $time : time();
316   
317          $sql = 'UPDATE ' . $this->notifications_table . '
318              SET notification_read = ' . ($mark_read ? 1 : 0) . '
319              WHERE notification_time <= ' . (int) $time .
320              (($notification_type_id !== false) ? ' AND ' .
321                  (is_array($notification_type_id) ? $this->db->sql_in_set('notification_type_id', $notification_type_id) : 'notification_type_id = ' . $notification_type_id) : '') .
322              (($user_id !== false) ? ' AND ' . (is_array($user_id) ? $this->db->sql_in_set('user_id', $user_id) : 'user_id = ' . (int) $user_id) : '') .
323              (($item_id !== false) ? ' AND ' . (is_array($item_id) ? $this->db->sql_in_set('item_id', $item_id) : 'item_id = ' . (int) $item_id) : '');
324          $this->db->sql_query($sql);
325      }
326   
327      /**
328      * {@inheritdoc}
329      */
330      public function mark_notifications_by_parent($notification_type_id, $item_parent_id, $user_id, $time = false, $mark_read = true)
331      {
332          $time = ($time !== false) ? $time : time();
333   
334          $sql = 'UPDATE ' . $this->notifications_table . '
335              SET notification_read = ' . ($mark_read ? 1 : 0) . '
336              WHERE notification_time <= ' . (int) $time .
337              (($notification_type_id !== false) ? ' AND ' .
338                  (is_array($notification_type_id) ? $this->db->sql_in_set('notification_type_id', $notification_type_id) : 'notification_type_id = ' . $notification_type_id) : '') .
339              (($item_parent_id !== false) ? ' AND ' . (is_array($item_parent_id) ? $this->db->sql_in_set('item_parent_id', $item_parent_id, false, true) : 'item_parent_id = ' . (int) $item_parent_id) : '') .
340              (($user_id !== false) ? ' AND ' . (is_array($user_id) ? $this->db->sql_in_set('user_id', $user_id) : 'user_id = ' . (int) $user_id) : '');
341          $this->db->sql_query($sql);
342      }
343   
344      /**
345      * {@inheritdoc}
346      */
347      public function mark_notifications_by_id($notification_id, $time = false, $mark_read = true)
348      {
349          $time = ($time !== false) ? $time : time();
350   
351          $sql = 'UPDATE ' . $this->notifications_table . '
352              SET notification_read = ' . ($mark_read ? 1 : 0) . '
353              WHERE notification_time <= ' . (int) $time . '
354                  AND ' . ((is_array($notification_id)) ? $this->db->sql_in_set('notification_id', $notification_id) : 'notification_id = ' . (int) $notification_id);
355          $this->db->sql_query($sql);
356      }
357   
358      /**
359      * {@inheritdoc}
360      */
361      public function delete_notifications($notification_type_id, $item_id, $parent_id = false, $user_id = false)
362      {
363          $sql = 'DELETE FROM ' . $this->notifications_table . '
364              WHERE notification_type_id = ' . (int) $notification_type_id . '
365                  AND ' . (is_array($item_id) ? $this->db->sql_in_set('item_id', $item_id) : 'item_id = ' . (int) $item_id) .
366              (($parent_id !== false) ? ' AND ' . ((is_array($parent_id) ? $this->db->sql_in_set('item_parent_id', $parent_id) : 'item_parent_id = ' . (int) $parent_id)) : '') .
367              (($user_id !== false) ? ' AND ' . ((is_array($user_id) ? $this->db->sql_in_set('user_id', $user_id) : 'user_id = ' . (int) $user_id)) : '');
368          $this->db->sql_query($sql);
369      }
370   
371      /**
372      * {@inheritdoc}
373      */
374      public function prune_notifications($timestamp, $only_read = true)
375      {
376          $sql = 'DELETE FROM ' . $this->notifications_table . '
377              WHERE notification_time < ' . (int) $timestamp .
378              (($only_read) ? ' AND notification_read = 1' : '');
379          $this->db->sql_query($sql);
380   
381          $this->config->set('read_notification_last_gc', time(), false);
382      }
383   
384      /**
385      * {@inheritdoc}
386      */
387      public function purge_notifications($notification_type_id)
388      {
389          $sql = 'DELETE FROM ' . $this->notifications_table . '
390              WHERE notification_type_id = ' . (int) $notification_type_id;
391          $this->db->sql_query($sql);
392   
393          $sql = 'DELETE FROM ' . $this->notification_types_table . '
394              WHERE notification_type_id = ' . (int) $notification_type_id;
395          $this->db->sql_query($sql);
396   
397          $this->cache->destroy('notification_type_ids');
398      }
399  }
400