aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--phpBB/develop/create_schema_files.php7
-rw-r--r--phpBB/includes/functions.php16
-rw-r--r--phpBB/includes/notifications/service.php44
-rw-r--r--phpBB/install/database_update.php7
-rw-r--r--phpBB/styles/prosilver/template/overall_header.html2
5 files changed, 56 insertions, 20 deletions
diff --git a/phpBB/develop/create_schema_files.php b/phpBB/develop/create_schema_files.php
index 0483ae009d..a1bef4a85a 100644
--- a/phpBB/develop/create_schema_files.php
+++ b/phpBB/develop/create_schema_files.php
@@ -1297,6 +1297,7 @@ function get_schema_struct()
$schema_data['phpbb_notifications'] = array(
'COLUMNS' => array(
+ 'notification_id' => array('UINT', NULL, 'auto_increment'),
'item_type' => array('VCHAR:25', ''),
'item_id' => array('UINT', 0),
'item_parent_id' => array('UINT', 0),
@@ -1305,11 +1306,7 @@ function get_schema_struct()
'time' => array('TIMESTAMP', 1),
'data' => array('TEXT_UNI', ''),
),
- 'PRIMARY_KEY' => array(
- 'item_type',
- 'item_id',
- 'user_id',
- ),
+ 'PRIMARY_KEY' => 'notification_id',
'KEYS' => array(
'item_type' => array('INDEX', 'item_type'),
'item_id' => array('INDEX', 'item_id'),
diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php
index b7243227bd..e26db56442 100644
--- a/phpBB/includes/functions.php
+++ b/phpBB/includes/functions.php
@@ -4994,6 +4994,14 @@ function page_header($page_title = '', $display_online_list = true, $item_id = 0
$timezone_name = $user->lang['timezones'][$timezone_name];
}
+ // Output the notifications
+ $phpbb_notifications = $phpbb_container->get('notifications');
+ $notifications = $phpbb_notifications->load_notifications();
+ foreach ($notifications['notifications'] as $notification)
+ {
+ $template->assign_block_vars('notifications', $notification->prepare_for_display());
+ }
+
// The following assigns all _common_ variables that may be used at any point in a template.
$template->assign_vars(array(
'SITENAME' => $config['sitename'],
@@ -5008,6 +5016,7 @@ function page_header($page_title = '', $display_online_list = true, $item_id = 0
'RECORD_USERS' => $l_online_record,
'PRIVATE_MESSAGE_INFO' => $l_privmsgs_text,
'PRIVATE_MESSAGE_INFO_UNREAD' => $l_privmsgs_text_unread,
+ 'NUM_UNREAD_NOTIFICATIONS' => $notifications['unread_count'],
'S_USER_NEW_PRIVMSG' => $user->data['user_new_privmsg'],
'S_USER_UNREAD_PRIVMSG' => $user->data['user_unread_privmsg'],
@@ -5119,13 +5128,6 @@ function page_header($page_title = '', $display_online_list = true, $item_id = 0
'A_COOKIE_SETTINGS' => addslashes('; path=' . $config['cookie_path'] . ((!$config['cookie_domain'] || $config['cookie_domain'] == 'localhost' || $config['cookie_domain'] == '127.0.0.1') ? '' : '; domain=' . $config['cookie_domain']) . ((!$config['cookie_secure']) ? '' : '; secure')),
));
- // Output the notifications
- $phpbb_notifications = $phpbb_container->get('notifications');
- foreach ($phpbb_notifications->load_notifications() as $notification)
- {
- $template->assign_block_vars('notifications', $notification->prepare_for_display());
- }
-
// application/xhtml+xml not used because of IE
header('Content-type: text/html; charset=UTF-8');
diff --git a/phpBB/includes/notifications/service.php b/phpBB/includes/notifications/service.php
index d2ff20333e..9f3fe8326f 100644
--- a/phpBB/includes/notifications/service.php
+++ b/phpBB/includes/notifications/service.php
@@ -50,6 +50,7 @@ class phpbb_notifications_service
* order_dir Order direction (Default: DESC)
* limit Number of notifications to load (Default: 5)
* start Notifications offset (Default: 0)
+ * all_unread Load all unread messages? (Default: true)
*/
public function load_notifications($options = array())
{
@@ -62,11 +63,24 @@ class phpbb_notifications_service
'order_dir' => 'DESC',
'limit' => 5,
'start' => 0,
+ 'all_unread' => true,
), $options);
$notifications = $user_ids = array();
$load_special = array();
+ // Get the total number of unread notifications
+ $sql = 'SELECT COUNT(*) AS count
+ FROM ' . NOTIFICATIONS_TABLE . '
+ WHERE user_id = ' . (int) $options['user_id'] . '
+ AND unread = 1';
+ $result = $this->db->sql_query($sql);
+ $count = $this->db->sql_fetchfield('count', $result);
+ $this->db->sql_freeresult($result);
+
+ $rowset = array();
+
+ // Get the main notifications
$sql = 'SELECT *
FROM ' . NOTIFICATIONS_TABLE . '
WHERE user_id = ' . (int) $options['user_id'] . '
@@ -75,6 +89,30 @@ class phpbb_notifications_service
while ($row = $this->db->sql_fetchrow($result))
{
+ $rowset[$row['notification_id']] = $row;
+ }
+ $this->db->sql_freeresult($result);
+
+ // Get all unread notifications
+ if ($options['all_unread'])
+ {
+ $sql = 'SELECT *
+ FROM ' . NOTIFICATIONS_TABLE . '
+ WHERE user_id = ' . (int) $options['user_id'] . '
+ AND unread = 1
+ AND ' . $this->db->sql_in_set('notification_id', array_keys($rowset), true) . '
+ ORDER BY ' . $this->db->sql_escape($options['order_by']) . ' ' . $this->db->sql_escape($options['order_dir']);
+ $result = $this->db->sql_query_limit($sql, $options['limit'], $options['start']);
+
+ while ($row = $this->db->sql_fetchrow($result))
+ {
+ $rowset[$row['notification_id']] = $row;
+ }
+ $this->db->sql_freeresult($result);
+ }
+
+ foreach ($rowset as $row)
+ {
$item_type_class_name = $this->get_item_type_class_name($row['item_type'], true);
$notification = new $item_type_class_name($this->phpbb_container, $row);
@@ -91,7 +129,6 @@ class phpbb_notifications_service
$notifications[] = $notification;
}
- $this->db->sql_freeresult($result);
$this->load_users($user_ids);
@@ -103,7 +140,10 @@ class phpbb_notifications_service
$item_type_class_name::load_special($this->phpbb_container, $data, $notifications);
}
- return $notifications;
+ return array(
+ 'notifications' => $notifications,
+ 'unread_count' => $count,
+ );
}
/**
diff --git a/phpBB/install/database_update.php b/phpBB/install/database_update.php
index 562871be57..5048403881 100644
--- a/phpBB/install/database_update.php
+++ b/phpBB/install/database_update.php
@@ -1127,6 +1127,7 @@ function database_update_info()
),
NOTIFICATIONS_TABLE => array(
'COLUMNS' => array(
+ 'notification_id' => array('UINT', NULL, 'auto_increment'),
'item_type' => array('VCHAR:25', ''),
'item_id' => array('UINT', 0),
'item_parent_id' => array('UINT', 0),
@@ -1135,11 +1136,7 @@ function database_update_info()
'time' => array('TIMESTAMP', 1),
'data' => array('TEXT_UNI', ''),
),
- 'PRIMARY_KEY' => array(
- 'item_type',
- 'item_id',
- 'user_id',
- ),
+ 'PRIMARY_KEY' => 'notification_id',
'KEYS' => array(
'item_type' => array('INDEX', 'item_type'),
'item_id' => array('INDEX', 'item_id'),
diff --git a/phpBB/styles/prosilver/template/overall_header.html b/phpBB/styles/prosilver/template/overall_header.html
index 8c0cc562ae..1805ca6b8a 100644
--- a/phpBB/styles/prosilver/template/overall_header.html
+++ b/phpBB/styles/prosilver/template/overall_header.html
@@ -5,7 +5,7 @@
<meta name="keywords" content="" />
<meta name="description" content="" />
{META}
-<title><!-- IF not S_VIEWTOPIC and not S_VIEWFORUM -->{SITENAME} - <!-- ENDIF --><!-- IF S_IN_MCP -->{L_MCP} - <!-- ELSEIF S_IN_UCP -->{L_UCP} - <!-- ENDIF -->{PAGE_TITLE}<!-- IF S_VIEWTOPIC or S_VIEWFORUM --> - {SITENAME}<!-- ENDIF --></title>
+<title><!-- IF NUM_UNREAD_NOTIFICATIONS -->({NUM_UNREAD_NOTIFICATIONS}) <!-- ENDIF --><!-- IF not S_VIEWTOPIC and not S_VIEWFORUM -->{SITENAME} - <!-- ENDIF --><!-- IF S_IN_MCP -->{L_MCP} - <!-- ELSEIF S_IN_UCP -->{L_UCP} - <!-- ENDIF -->{PAGE_TITLE}<!-- IF S_VIEWTOPIC or S_VIEWFORUM --> - {SITENAME}<!-- ENDIF --></title>
<!-- IF S_ENABLE_FEEDS -->
<!-- IF S_ENABLE_FEEDS_OVERALL --><link rel="alternate" type="application/atom+xml" title="{L_FEED} - {SITENAME}" href="{U_FEED}" /><!-- ENDIF -->