aboutsummaryrefslogtreecommitdiffstats
path: root/phpBB
diff options
context:
space:
mode:
authorNathan Guse <nathaniel.guse@gmail.com>2012-09-14 14:55:14 -0500
committerNathan Guse <nathaniel.guse@gmail.com>2012-09-14 14:55:14 -0500
commit44aa773ce07d81d4585f3a24a728f9b445c4c098 (patch)
tree3caa90db934634a5c5f025f3a392ca91cbf2e946 /phpBB
parent207bbdf48cb05abfb611f238e4ba07131131c74d (diff)
downloadforums-44aa773ce07d81d4585f3a24a728f9b445c4c098.tar
forums-44aa773ce07d81d4585f3a24a728f9b445c4c098.tar.gz
forums-44aa773ce07d81d4585f3a24a728f9b445c4c098.tar.bz2
forums-44aa773ce07d81d4585f3a24a728f9b445c4c098.tar.xz
forums-44aa773ce07d81d4585f3a24a728f9b445c4c098.zip
[ticket/11103] Allow notification types to override update functionality
This is needed for quote editing because we need to check if the users are still all quoted or notify new quotes appropriately. PHPBB3-11103
Diffstat (limited to 'phpBB')
-rw-r--r--phpBB/includes/functions_posting.php2
-rw-r--r--phpBB/includes/notifications/service.php39
-rw-r--r--phpBB/includes/notifications/type/pm.php2
-rw-r--r--phpBB/includes/notifications/type/post.php2
-rw-r--r--phpBB/includes/notifications/type/quote.php55
-rw-r--r--phpBB/includes/notifications/type/topic.php2
6 files changed, 92 insertions, 10 deletions
diff --git a/phpBB/includes/functions_posting.php b/phpBB/includes/functions_posting.php
index ff0a59a4e3..26d9b81896 100644
--- a/phpBB/includes/functions_posting.php
+++ b/phpBB/includes/functions_posting.php
@@ -2256,7 +2256,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
$notifications->update_notifications('post', array_merge($data, array(
'post_username' => $username,
)));
- $notifications->add_notifications('quote', array_merge($data, array(
+ $notifications->update_notifications('quote', array_merge($data, array(
'post_username' => $username,
)));
break;
diff --git a/phpBB/includes/notifications/service.php b/phpBB/includes/notifications/service.php
index 0f7752446a..10af5b349b 100644
--- a/phpBB/includes/notifications/service.php
+++ b/phpBB/includes/notifications/service.php
@@ -110,7 +110,6 @@ class phpbb_notifications_service
* Add a notification
*
* @param string $item_type Type identifier
- * @param int $item_id Identifier within the type
* @param array $data Data specific for this type that will be inserted
*/
public function add_notifications($item_type, $data)
@@ -120,20 +119,38 @@ class phpbb_notifications_service
$item_id = $item_type_class_name::get_item_id($data);
// Update any existing notifications for this item
- $this->update_notifications($item_type, $item_id, $data);
-
- $notify_users = $user_ids = array();
- $notification_objects = $notification_methods = array();
- $new_rows = array();
+ $this->update_notifications($item_type, $data);
// find out which users want to receive this type of notification
$notify_users = $item_type_class_name::find_users_for_notification($this->phpbb_container, $data);
+ $this->add_notifications_for_users($item_type, $data, $notify_users);
+ }
+
+ /**
+ * Add a notification for specific users
+ *
+ * @param string $item_type Type identifier
+ * @param array $data Data specific for this type that will be inserted
+ * @param array $notify_users User list to notify
+ */
+ public function add_notifications_for_users($item_type, $data, $notify_users)
+ {
+ $item_type_class_name = $this->get_item_type_class_name($item_type);
+
+ $item_id = $item_type_class_name::get_item_id($data);
+
+ $user_ids = array();
+ $notification_objects = $notification_methods = array();
+ $new_rows = array();
+
// Never send notifications to the anonymous user or the current user!
unset($notify_users[ANONYMOUS], $notify_users[$this->phpbb_container->get('user')->data['user_id']]);
// Make sure not to send new notifications to users who've already been notified about this item
// This may happen when an item was added, but now new users are able to see the item
+ // todo Users should not receive notifications from multiple events from the same item (ex: for a topic reply with a quote including your username)
+ // Probably should be handled within each type?
$sql = 'SELECT user_id
FROM ' . NOTIFICATIONS_TABLE . "
WHERE item_type = '" . $this->db->sql_escape($item_type) . "'
@@ -202,6 +219,16 @@ class phpbb_notifications_service
{
$item_type_class_name = $this->get_item_type_class_name($item_type);
+ // Allow the notifications class to over-ride the update_notifications functionality
+ if (method_exists($item_type_class_name, 'update_notifications'))
+ {
+ // Return False to over-ride the rest of the update
+ if ($item_type_class_name::update_notifications($this->phpbb_container, $data) === false)
+ {
+ return;
+ }
+ }
+
$item_id = $item_type_class_name::get_item_id($data);
$notification = new $item_type_class_name($this->phpbb_container);
diff --git a/phpBB/includes/notifications/type/pm.php b/phpBB/includes/notifications/type/pm.php
index c78efcdd55..8ea1045641 100644
--- a/phpBB/includes/notifications/type/pm.php
+++ b/phpBB/includes/notifications/type/pm.php
@@ -41,7 +41,7 @@ class phpbb_notifications_type_pm extends phpbb_notifications_type_base
*/
public static function get_item_id($pm)
{
- return $pm['msg_id'];
+ return (int) $pm['msg_id'];
}
/**
diff --git a/phpBB/includes/notifications/type/post.php b/phpBB/includes/notifications/type/post.php
index 4fd4128168..d5759111cf 100644
--- a/phpBB/includes/notifications/type/post.php
+++ b/phpBB/includes/notifications/type/post.php
@@ -41,7 +41,7 @@ class phpbb_notifications_type_post extends phpbb_notifications_type_base
*/
public static function get_item_id($post)
{
- return $post['post_id'];
+ return (int) $post['post_id'];
}
/**
diff --git a/phpBB/includes/notifications/type/quote.php b/phpBB/includes/notifications/type/quote.php
index 8f93c67de1..e17769acea 100644
--- a/phpBB/includes/notifications/type/quote.php
+++ b/phpBB/includes/notifications/type/quote.php
@@ -146,4 +146,59 @@ class phpbb_notifications_type_quote extends phpbb_notifications_type_post
censor_text($this->get_data('topic_title'))
);
}
+
+ /**
+ * Update a notification
+ *
+ * @param ContainerBuilder $phpbb_container
+ * @param array $data Data specific for this type that will be updated
+ */
+ public static function update_notifications(ContainerBuilder $phpbb_container, $post)
+ {
+ $service = $phpbb_container->get('notifications');
+ $db = $phpbb_container->get('dbal.conn');
+
+ $old_notifications = array();
+ $sql = 'SELECT user_id
+ FROM ' . NOTIFICATIONS_TABLE . "
+ WHERE item_type = '" . self::get_item_type() . "'
+ AND item_id = " . self::get_item_id($post);
+ $result = $db->sql_query($sql);
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $old_notifications[] = $row['user_id'];
+ }
+ $db->sql_freeresult($result);
+
+ // Find the new users to notify
+ $notifications = self::find_users_for_notification($phpbb_container, $post);
+
+ // Find the notifications we must delete
+ $remove_notifications = array_diff($old_notifications, array_keys($notifications));
+
+ // Find the notifications we must add
+ $add_notifications = array();
+ foreach (array_diff(array_keys($notifications), $old_notifications) as $user_id)
+ {
+ $add_notifications[$user_id] = $notifications[$user_id];
+ }
+
+ var_dump($old_notifications, $notifications, $remove_notifications, $add_notifications);
+
+ // Add the necessary notifications
+ $service->add_notifications_for_users(self::get_item_type(), $post, $add_notifications);
+
+ // Remove the necessary notifications
+ if (!empty($remove_notifications))
+ {
+ $sql = 'DELETE FROM ' . NOTIFICATIONS_TABLE . "
+ WHERE item_type = '" . self::get_item_type() . "'
+ AND item_id = " . self::get_item_id($post) . '
+ AND ' . $db->sql_in_set('user_id', $remove_notifications);
+ $db->sql_query($sql);
+ }
+
+ // return true to continue with the update code in the notifications service (this will update the rest of the notifications)
+ return true;
+ }
}
diff --git a/phpBB/includes/notifications/type/topic.php b/phpBB/includes/notifications/type/topic.php
index 209d23b823..cb7bfdbb8f 100644
--- a/phpBB/includes/notifications/type/topic.php
+++ b/phpBB/includes/notifications/type/topic.php
@@ -41,7 +41,7 @@ class phpbb_notifications_type_topic extends phpbb_notifications_type_base
*/
public static function get_item_id($post)
{
- return $post['topic_id'];
+ return (int) $post['topic_id'];
}
/**