2012-09-08 10:49:58 -05:00
< ? php
/**
*
* @ package notifications
* @ copyright ( c ) 2012 phpBB Group
* @ license http :// opensource . org / licenses / gpl - 2.0 . php GNU General Public License v2
*
*/
/**
* @ ignore
*/
if ( ! defined ( 'IN_PHPBB' ))
{
exit ;
}
/**
* Notifications service class
* @ package notifications
*/
2012-10-04 13:39:54 -05:00
class phpbb_notification_manager
2012-09-08 10:49:58 -05:00
{
2012-11-20 18:14:48 -06:00
/** @var array */
protected $notification_types = null ;
/** @var array */
protected $notification_methods = null ;
2012-11-09 07:40:08 -06:00
/** @var ContainerBuilder */
protected $phpbb_container = null ;
2012-10-18 18:45:43 -05:00
2012-11-20 18:14:48 -06:00
/** @var phpbb_user_loader */
protected $user_loader = null ;
2012-10-18 18:45:43 -05:00
2012-11-20 18:14:48 -06:00
/** @var dbal */
protected $db = null ;
2012-10-18 18:45:43 -05:00
/** @var phpbb_user */
protected $user = null ;
/** @var string */
protected $phpbb_root_path = null ;
/** @var string */
protected $php_ext = null ;
2012-09-08 10:49:58 -05:00
2012-11-09 08:48:41 -06:00
/** @var string */
protected $notifications_table = null ;
/** @var string */
protected $user_notifications_table = null ;
2012-11-20 18:14:48 -06:00
public function __construct ( $notification_types , $notification_methods , $phpbb_container , phpbb_user_loader $user_loader , dbal $db , $user , $phpbb_root_path , $php_ext , $notifications_table , $user_notifications_table )
2012-09-08 10:49:58 -05:00
{
2012-11-20 18:14:48 -06:00
$this -> notification_types = $notification_types ;
$this -> notification_methods = $notification_methods ;
2012-11-09 07:40:08 -06:00
$this -> phpbb_container = $phpbb_container ;
2012-11-20 18:14:48 -06:00
$this -> user_loader = $user_loader ;
2012-10-04 14:27:43 -05:00
$this -> db = $db ;
$this -> user = $user ;
2012-11-09 08:48:41 -06:00
2012-10-04 14:27:43 -05:00
$this -> phpbb_root_path = $phpbb_root_path ;
$this -> php_ext = $php_ext ;
2012-11-09 08:48:41 -06:00
$this -> notifications_table = $notifications_table ;
$this -> user_notifications_table = $user_notifications_table ;
2012-09-08 10:49:58 -05:00
}
/**
* Load the user ' s notifications
*
* @ param array $options Optional options to control what notifications are loaded
2012-09-20 10:36:11 -05:00
* notification_id Notification id to load ( or array of notification ids )
* user_id User id to load notifications for ( Default : $user -> data [ 'user_id' ])
* order_by Order by ( Default : time )
* order_dir Order direction ( Default : DESC )
* limit Number of notifications to load ( Default : 5 )
* start Notifications offset ( Default : 0 )
2012-11-20 23:12:37 -06:00
* all_unread Load all unread notifications ? If set to true , count_unread is set to true ( Default : false )
* count_unread Count all unread notifications ? ( Default : false )
* count_total Count all notifications ? ( Default : false )
* @ return array Array of information based on the request with keys :
* 'notifications' array of notification type objects
* 'unread_count' number of unread notifications the user has if count_unread is true in the options
* 'total_count' number of notifications the user has if count_total is true in the options
2012-09-08 10:49:58 -05:00
*/
2012-11-20 23:12:37 -06:00
public function load_notifications ( array $options = array ())
2012-09-08 10:49:58 -05:00
{
// Merge default options
$options = array_merge ( array (
2012-09-20 10:36:11 -05:00
'notification_id' => false ,
2012-10-04 14:27:43 -05:00
'user_id' => $this -> user -> data [ 'user_id' ],
2012-09-20 10:36:11 -05:00
'order_by' => 'time' ,
'order_dir' => 'DESC' ,
'limit' => 0 ,
'start' => 0 ,
'all_unread' => false ,
'count_unread' => false ,
2012-10-13 20:02:38 -05:00
'count_total' => false ,
2012-09-08 10:49:58 -05:00
), $options );
2012-10-18 18:45:43 -05:00
// If all_unread, count_unread must be true
2012-09-20 10:36:11 -05:00
$options [ 'count_unread' ] = ( $options [ 'all_unread' ]) ? true : $options [ 'count_unread' ];
2012-09-15 11:59:30 -05:00
// Anonymous users and bots never receive notifications
2012-10-04 14:27:43 -05:00
if ( $options [ 'user_id' ] == $this -> user -> data [ 'user_id' ] && ( $this -> user -> data [ 'user_id' ] == ANONYMOUS || $this -> user -> data [ 'user_type' ] == USER_IGNORE ))
2012-09-15 11:59:30 -05:00
{
2012-09-15 13:51:02 -05:00
return array (
'notifications' => array (),
'unread_count' => 0 ,
2012-10-13 20:02:38 -05:00
'total_count' => 0 ,
2012-09-15 13:51:02 -05:00
);
2012-09-15 11:59:30 -05:00
}
2012-09-08 10:49:58 -05:00
$notifications = $user_ids = array ();
2012-09-12 22:29:48 -05:00
$load_special = array ();
2012-10-13 20:02:38 -05:00
$total_count = $unread_count = 0 ;
2012-09-08 10:49:58 -05:00
2012-09-20 10:36:11 -05:00
if ( $options [ 'count_unread' ])
{
// Get the total number of unread notifications
2012-11-09 07:45:23 -06:00
$sql = ' SELECT COUNT ( * ) AS unread_count
2012-11-09 08:48:41 -06:00
FROM ' . $this->notifications_table . '
2012-09-20 10:36:11 -05:00
WHERE user_id = ' . (int) $options[' user_id '] . '
2012-10-13 23:24:30 -05:00
AND unread = 1
2012-10-19 15:49:49 -05:00
AND is_enabled = 1 ' ;
2012-09-20 10:36:11 -05:00
$result = $this -> db -> sql_query ( $sql );
2012-11-09 07:45:23 -06:00
$unread_count = ( int ) $this -> db -> sql_fetchfield ( 'unread_count' , $result );
2012-10-13 20:02:38 -05:00
$this -> db -> sql_freeresult ( $result );
}
if ( $options [ 'count_total' ])
{
// Get the total number of notifications
2012-11-09 07:45:23 -06:00
$sql = ' SELECT COUNT ( * ) AS total_count
2012-11-09 08:48:41 -06:00
FROM ' . $this->notifications_table . '
2012-10-13 23:24:30 -05:00
WHERE user_id = ' . (int) $options[' user_id '] . '
2012-10-19 15:49:49 -05:00
AND is_enabled = 1 ' ;
2012-10-13 20:02:38 -05:00
$result = $this -> db -> sql_query ( $sql );
2012-11-09 07:45:23 -06:00
$total_count = ( int ) $this -> db -> sql_fetchfield ( 'total_count' , $result );
2012-09-20 10:36:11 -05:00
$this -> db -> sql_freeresult ( $result );
}
2012-09-14 18:30:12 -05:00
2012-10-20 20:54:18 -05:00
if ( ! $options [ 'count_total' ] || $total_count )
2012-09-14 18:30:12 -05:00
{
2012-10-20 20:54:18 -05:00
$rowset = array ();
2012-09-14 18:30:12 -05:00
2012-10-20 20:54:18 -05:00
// Get the main notifications
2012-09-14 18:30:12 -05:00
$sql = ' SELECT *
2012-11-09 08:48:41 -06:00
FROM ' . $this->notifications_table . '
2012-10-20 20:54:18 -05:00
WHERE user_id = ' . (int) $options[' user_id ' ] .
(( $options [ 'notification_id' ]) ? (( is_array ( $options [ 'notification_id' ])) ? ' AND ' . $this -> db -> sql_in_set ( 'notification_id' , $options [ 'notification_id' ]) : ' AND notification_id = ' . ( int ) $options [ 'notification_id' ]) : '' ) . '
AND is_enabled = 1
2012-10-13 23:24:30 -05:00
ORDER BY ' . $this->db->sql_escape($options[' order_by ']) . ' ' . $this->db->sql_escape($options[' order_dir ' ]);
2012-09-14 18:30:12 -05:00
$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 );
2012-09-08 10:49:58 -05:00
2012-10-20 20:54:18 -05:00
// Get all unread notifications
if ( $unread_count && $options [ 'all_unread' ] && ! empty ( $rowset ))
2012-09-12 22:29:48 -05:00
{
2012-10-20 20:54:18 -05:00
$sql = ' SELECT *
2012-11-09 08:48:41 -06:00
FROM ' . $this->notifications_table . '
2012-10-20 20:54:18 -05:00
WHERE user_id = ' . (int) $options[' user_id '] . '
AND unread = 1
AND ' . $this->db->sql_in_set(' notification_id ', array_keys($rowset), true) . '
AND is_enabled = 1
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 );
2012-09-12 22:29:48 -05:00
}
2012-10-20 20:54:18 -05:00
foreach ( $rowset as $row )
{
$notification = $this -> get_item_type_class ( $row [ 'item_type' ], $row );
2012-09-08 10:49:58 -05:00
2012-10-20 20:54:18 -05:00
// Array of user_ids to query all at once
$user_ids = array_merge ( $user_ids , $notification -> users_to_query ());
2012-09-08 10:49:58 -05:00
2012-10-20 20:54:18 -05:00
// Some notification types also require querying additional tables themselves
if ( ! isset ( $load_special [ $row [ 'item_type' ]]))
{
$load_special [ $row [ 'item_type' ]] = array ();
}
$load_special [ $row [ 'item_type' ]] = array_merge ( $load_special [ $row [ 'item_type' ]], $notification -> get_load_special ());
$notifications [ $row [ 'notification_id' ]] = $notification ;
}
2012-11-20 18:14:48 -06:00
$this -> user_loader -> load_users ( $user_ids );
2012-09-12 22:29:48 -05:00
2012-10-20 20:54:18 -05:00
// Allow each type to load its own special items
foreach ( $load_special as $item_type => $data )
{
$item_class = $this -> get_item_type_class ( $item_type );
2012-10-04 14:27:43 -05:00
2012-10-20 20:54:18 -05:00
$item_class -> load_special ( $data , $notifications );
}
2012-09-12 22:29:48 -05:00
}
2012-09-14 18:30:12 -05:00
return array (
'notifications' => $notifications ,
2012-10-13 20:02:38 -05:00
'unread_count' => $unread_count ,
'total_count' => $total_count ,
2012-09-14 18:30:12 -05:00
);
2012-09-08 10:49:58 -05:00
}
2012-09-14 15:59:13 -05:00
/**
* Mark notifications read
*
2012-10-13 20:02:38 -05:00
* @ param bool | string | array $item_type Type identifier or array of item types ( only acceptable if the $data is identical for the specified types ) . False to mark read for all item types
2012-09-14 15:59:13 -05:00
* @ param bool | int | array $item_id Item id or array of item ids . False to mark read for all item ids
* @ param bool | int | array $user_id User id or array of user ids . False to mark read for all user ids
* @ param bool | int $time Time at which to mark all notifications prior to as read . False to mark all as read . ( Default : False )
*/
public function mark_notifications_read ( $item_type , $item_id , $user_id , $time = false )
{
2012-09-14 16:54:20 -05:00
if ( is_array ( $item_type ))
{
foreach ( $item_type as $type )
{
$this -> mark_notifications_read ( $type , $item_id , $user_id , $time );
}
return ;
}
2012-10-29 18:15:01 -05:00
$time = ( $time !== false ) ? $time : time ();
2012-09-14 15:59:13 -05:00
2012-11-09 08:48:41 -06:00
$sql = 'UPDATE ' . $this -> notifications_table . "
2012-09-14 15:59:13 -05:00
SET unread = 0
2012-10-13 20:02:38 -05:00
WHERE time <= " . $time .
(( $item_type !== false ) ? ' AND ' . ( is_array ( $item_type ) ? $this -> db -> sql_in_set ( 'item_type' , $item_type ) : " item_type = ' " . $this -> db -> sql_escape ( $item_type ) . " ' " ) : '' ) .
2012-09-14 15:59:13 -05:00
(( $item_id !== false ) ? ' AND ' . ( is_array ( $item_id ) ? $this -> db -> sql_in_set ( 'item_id' , $item_id ) : 'item_id = ' . ( int ) $item_id ) : '' ) .
(( $user_id !== false ) ? ' AND ' . ( is_array ( $user_id ) ? $this -> db -> sql_in_set ( 'user_id' , $user_id ) : 'user_id = ' . ( int ) $user_id ) : '' );
$this -> db -> sql_query ( $sql );
}
/**
* Mark notifications read from a parent identifier
*
2012-09-14 16:54:20 -05:00
* @ param string | array $item_type Type identifier or array of item types ( only acceptable if the $data is identical for the specified types )
2012-09-14 15:59:13 -05:00
* @ param bool | int | array $item_parent_id Item parent id or array of item parent ids . False to mark read for all item parent ids
* @ param bool | int | array $user_id User id or array of user ids . False to mark read for all user ids
* @ param bool | int $time Time at which to mark all notifications prior to as read . False to mark all as read . ( Default : False )
*/
public function mark_notifications_read_by_parent ( $item_type , $item_parent_id , $user_id , $time = false )
{
2012-09-14 16:54:20 -05:00
if ( is_array ( $item_type ))
{
foreach ( $item_type as $type )
{
2012-09-14 18:05:13 -05:00
$this -> mark_notifications_read_by_parent ( $type , $item_parent_id , $user_id , $time );
2012-09-14 16:54:20 -05:00
}
return ;
}
2012-10-29 18:20:07 -05:00
$time = ( $time !== false ) ? $time : time ();
2012-09-14 15:59:13 -05:00
2012-11-09 08:48:41 -06:00
$sql = 'UPDATE ' . $this -> notifications_table . "
2012-09-14 15:59:13 -05:00
SET unread = 0
WHERE item_type = '" . $this->db->sql_escape($item_type) . "'
AND time <= " . $time .
(( $item_parent_id !== false ) ? ' AND ' . ( is_array ( $item_parent_id ) ? $this -> db -> sql_in_set ( 'item_parent_id' , $item_parent_id ) : 'item_parent_id = ' . ( int ) $item_parent_id ) : '' ) .
(( $user_id !== false ) ? ' AND ' . ( is_array ( $user_id ) ? $this -> db -> sql_in_set ( 'user_id' , $user_id ) : 'user_id = ' . ( int ) $user_id ) : '' );
$this -> db -> sql_query ( $sql );
}
2012-09-20 10:36:11 -05:00
/**
* Mark notifications read
*
* @ param int | array $notification_id Notification id or array of notification ids .
* @ param bool | int $time Time at which to mark all notifications prior to as read . False to mark all as read . ( Default : False )
*/
public function mark_notifications_read_by_id ( $notification_id , $time = false )
{
2012-10-29 18:20:07 -05:00
$time = ( $time !== false ) ? $time : time ();
2012-09-20 10:36:11 -05:00
2012-11-09 08:48:41 -06:00
$sql = 'UPDATE ' . $this -> notifications_table . "
2012-09-20 10:36:11 -05:00
SET unread = 0
WHERE time <= " . $time . '
AND ' . ((is_array($notification_id)) ? $this->db->sql_in_set(' notification_id ', $notification_id) : ' notification_id = ' . ( int ) $notification_id );
$this -> db -> sql_query ( $sql );
}
2012-09-08 11:40:02 -05:00
/**
* Add a notification
*
2012-09-14 16:54:20 -05:00
* @ param string | array $item_type Type identifier or array of item types ( only acceptable if the $data is identical for the specified types )
2012-09-27 20:11:28 -05:00
* Note : If you send an array of types , any user who could receive multiple notifications from this single item will only receive
* a single notification . If they MUST receive multiple notifications , call this function multiple times instead of sending an array
2012-09-08 11:40:02 -05:00
* @ param array $data Data specific for this type that will be inserted
2012-11-20 23:12:37 -06:00
* @ param array $options Optional options to control what notifications are loaded
* ignore_users array of data to specify which users should not receive certain types of notifications
* @ return array Information about what users were notified and how they were notified
2012-09-08 11:40:02 -05:00
*/
2012-11-20 23:12:37 -06:00
public function add_notifications ( $item_type , $data , array $options = array ())
2012-09-08 10:49:58 -05:00
{
2012-09-27 20:05:06 -05:00
$options = array_merge ( array (
'ignore_users' => array (),
), $options );
2012-09-14 16:54:20 -05:00
if ( is_array ( $item_type ))
{
2012-09-27 20:05:06 -05:00
$notified_users = array ();
$temp_options = $options ;
2012-09-14 16:54:20 -05:00
foreach ( $item_type as $type )
{
2012-09-27 20:05:06 -05:00
$temp_options [ 'ignore_users' ] = $options [ 'ignore_users' ] + $notified_users ;
$notified_users += $this -> add_notifications ( $type , $data , $temp_options );
2012-09-14 16:54:20 -05:00
}
2012-09-27 20:05:06 -05:00
return $notified_users ;
2012-09-14 16:54:20 -05:00
}
2012-11-20 18:14:48 -06:00
$item_id = $this -> get_item_type_class ( $item_type ) -> get_item_id ( $data );
2012-09-08 12:28:58 -05:00
2012-09-08 10:49:58 -05:00
// find out which users want to receive this type of notification
2012-10-20 20:54:18 -05:00
$notify_users = $this -> get_item_type_class ( $item_type ) -> find_users_for_notification ( $data , $options );
2012-09-08 10:49:58 -05:00
2012-09-14 14:55:14 -05:00
$this -> add_notifications_for_users ( $item_type , $data , $notify_users );
2012-09-27 20:05:06 -05:00
return $notify_users ;
2012-09-14 14:55:14 -05:00
}
/**
* Add a notification for specific users
*
2012-09-14 16:54:20 -05:00
* @ param string | array $item_type Type identifier or array of item types ( only acceptable if the $data is identical for the specified types )
2012-09-14 14:55:14 -05:00
* @ 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 )
{
2012-09-14 16:54:20 -05:00
if ( is_array ( $item_type ))
{
foreach ( $item_type as $type )
{
2012-09-15 14:33:15 -05:00
$this -> add_notifications_for_users ( $type , $data , $notify_users );
2012-09-14 16:54:20 -05:00
}
return ;
}
2012-11-20 18:14:48 -06:00
$item_id = $this -> get_item_type_class ( $item_type ) -> get_item_id ( $data );
2012-09-14 14:55:14 -05:00
$user_ids = array ();
$notification_objects = $notification_methods = array ();
$new_rows = array ();
2012-09-15 13:51:02 -05:00
// Never send notifications to the anonymous user!
unset ( $notify_users [ ANONYMOUS ]);
2012-09-09 10:19:46 -05:00
2012-09-08 12:28:58 -05:00
// 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
2012-09-09 17:23:32 -05:00
$sql = ' SELECT user_id
2012-11-09 08:48:41 -06:00
FROM ' . $this -> notifications_table . "
2012-09-08 12:28:58 -05:00
WHERE item_type = '" . $this->db->sql_escape($item_type) . "'
2012-10-13 23:24:30 -05:00
AND item_id = " . (int) $item_id . '
2012-10-19 15:49:49 -05:00
AND is_enabled = 1 ' ;
2012-09-08 12:28:58 -05:00
$result = $this -> db -> sql_query ( $sql );
while ( $row = $this -> db -> sql_fetchrow ( $result ))
{
unset ( $notify_users [ $row [ 'user_id' ]]);
}
$this -> db -> sql_freeresult ( $result );
2012-09-08 16:02:32 -05:00
if ( ! sizeof ( $notify_users ))
{
return ;
}
2012-10-12 16:54:42 -05:00
// Allow notifications to perform actions before creating the insert array (such as run a query to cache some data needed for all notifications)
2012-10-20 20:54:18 -05:00
$notification = $this -> get_item_type_class ( $item_type );
2012-10-12 16:54:42 -05:00
$pre_create_data = $notification -> pre_create_insert_array ( $data , $notify_users );
unset ( $notification );
2012-09-08 11:40:02 -05:00
// Go through each user so we can insert a row in the DB and then notify them by their desired means
foreach ( $notify_users as $user => $methods )
{
2012-10-20 20:54:18 -05:00
$notification = $this -> get_item_type_class ( $item_type );
2012-09-08 10:49:58 -05:00
2012-09-08 11:40:02 -05:00
$notification -> user_id = ( int ) $user ;
2012-09-08 10:49:58 -05:00
2012-09-09 10:19:46 -05:00
// Store the creation array in our new rows that will be inserted later
2012-10-12 16:54:42 -05:00
$new_rows [] = $notification -> create_insert_array ( $data , $pre_create_data );
2012-09-08 10:49:58 -05:00
2012-09-09 10:19:46 -05:00
// Users are needed to send notifications
$user_ids = array_merge ( $user_ids , $notification -> users_to_query ());
2012-09-08 11:40:02 -05:00
foreach ( $methods as $method )
2012-09-08 10:49:58 -05:00
{
2012-09-08 11:40:02 -05:00
// setup the notification methods and add the notification to the queue
2012-09-09 14:55:40 -05:00
if ( $method ) // blank means we just insert it as a notification, but do not notify them by any other means
2012-09-08 10:49:58 -05:00
{
2012-09-08 16:12:20 -05:00
if ( ! isset ( $notification_methods [ $method ]))
2012-09-08 11:40:02 -05:00
{
2012-10-20 20:54:18 -05:00
$notification_methods [ $method ] = $this -> get_method_class ( $method );
2012-09-08 11:40:02 -05:00
}
2012-09-09 10:19:46 -05:00
2012-09-08 16:12:20 -05:00
$notification_methods [ $method ] -> add_to_queue ( $notification );
2012-09-08 11:40:02 -05:00
}
2012-09-08 10:49:58 -05:00
}
}
// insert into the db
2012-11-09 08:48:41 -06:00
$this -> db -> sql_multi_insert ( $this -> notifications_table , $new_rows );
2012-09-08 10:49:58 -05:00
2012-09-09 10:19:46 -05:00
// We need to load all of the users to send notifications
2012-11-20 18:14:48 -06:00
$this -> user_loader -> load_users ( $user_ids );
2012-09-09 10:19:46 -05:00
2012-09-08 10:49:58 -05:00
// run the queue for each method to send notifications
2012-09-08 11:40:02 -05:00
foreach ( $notification_methods as $method )
2012-09-08 10:49:58 -05:00
{
2012-09-09 10:36:22 -05:00
$method -> notify ();
2012-09-08 10:49:58 -05:00
}
}
2012-09-08 11:40:02 -05:00
/**
* Update a notification
*
2012-09-14 16:54:20 -05:00
* @ param string | array $item_type Type identifier or array of item types ( only acceptable if the $data is identical for the specified types )
2012-09-08 11:40:02 -05:00
* @ param array $data Data specific for this type that will be updated
*/
2012-09-09 10:19:46 -05:00
public function update_notifications ( $item_type , $data )
2012-09-08 10:49:58 -05:00
{
2012-09-14 16:54:20 -05:00
if ( is_array ( $item_type ))
{
foreach ( $item_type as $type )
{
2012-09-15 14:33:15 -05:00
$this -> update_notifications ( $type , $data );
2012-09-14 16:54:20 -05:00
}
return ;
}
2012-10-20 20:54:18 -05:00
$notification = $this -> get_item_type_class ( $item_type );
2012-09-08 10:49:58 -05:00
2012-09-14 14:55:14 -05:00
// Allow the notifications class to over-ride the update_notifications functionality
2012-10-20 20:54:18 -05:00
if ( method_exists ( $notification , 'update_notifications' ))
2012-09-14 14:55:14 -05:00
{
// Return False to over-ride the rest of the update
2012-10-20 20:54:18 -05:00
if ( $notification -> update_notifications ( $data ) === false )
2012-09-14 14:55:14 -05:00
{
return ;
}
}
2012-11-20 18:14:48 -06:00
$item_id = $notification -> get_item_id ( $data );
2012-09-08 11:40:02 -05:00
$update_array = $notification -> create_update_array ( $data );
2012-09-08 10:49:58 -05:00
2012-11-09 08:48:41 -06:00
$sql = 'UPDATE ' . $this -> notifications_table . '
2012-09-08 11:40:02 -05:00
SET ' . $this->db->sql_build_array(' UPDATE ' , $update_array ) . "
2012-09-08 12:28:58 -05:00
WHERE item_type = '" . $this->db->sql_escape($item_type) . "'
AND item_id = " . (int) $item_id ;
$this -> db -> sql_query ( $sql );
}
/**
* Delete a notification
*
2012-09-15 14:33:15 -05:00
* @ param string | array $item_type Type identifier or array of item types ( only acceptable if the $item_id is identical for the specified types )
2012-09-09 10:19:46 -05:00
* @ param int | array $item_id Identifier within the type ( or array of ids )
2012-09-08 12:28:58 -05:00
* @ param array $data Data specific for this type that will be updated
*/
public function delete_notifications ( $item_type , $item_id )
{
2012-09-15 14:33:15 -05:00
if ( is_array ( $item_type ))
{
foreach ( $item_type as $type )
{
$this -> delete_notifications ( $type , $item_id );
}
return ;
}
2012-11-09 08:48:41 -06:00
$sql = 'DELETE FROM ' . $this -> notifications_table . "
2012-09-08 12:28:58 -05:00
WHERE item_type = '" . $this->db->sql_escape($item_type) . "'
2012-09-09 10:19:46 -05:00
AND " . (is_array( $item_id ) ? $this->db ->sql_in_set('item_id', $item_id ) : 'item_id = ' . (int) $item_id );
2012-09-08 11:40:02 -05:00
$this -> db -> sql_query ( $sql );
}
2012-09-08 10:49:58 -05:00
2012-09-26 21:48:59 -05:00
/**
* Get all of the subscription types
*
* @ return array Array of item types
*/
public function get_subscription_types ()
{
$subscription_types = array ();
2012-11-20 18:14:48 -06:00
foreach ( $this -> notification_types as $type_name => $data )
2012-09-26 21:48:59 -05:00
{
2012-11-09 07:40:08 -06:00
$type = $this -> get_item_type_class ( $type_name );
2012-10-04 14:27:43 -05:00
2012-11-09 07:40:08 -06:00
if ( $type instanceof phpbb_notification_type_interface && $type -> is_available ())
2012-09-26 21:48:59 -05:00
{
2012-10-13 23:52:49 -05:00
$options = array_merge ( array (
2012-11-09 07:40:08 -06:00
'id' => $type -> get_type (),
'lang' => 'NOTIFICATION_TYPE_' . strtoupper ( $type -> get_type ()),
2012-10-13 23:52:49 -05:00
'group' => 'NOTIFICATION_GROUP_MISCELLANEOUS' ,
2012-11-09 07:40:08 -06:00
), (( $type :: $notification_option !== false ) ? $type :: $notification_option : array ()));
2012-10-13 23:52:49 -05:00
$subscription_types [ $options [ 'group' ]][ $options [ 'id' ]] = $options ;
2012-09-26 21:48:59 -05:00
}
}
2012-10-13 23:52:49 -05:00
// Move Miscellaneous to the very last section
if ( isset ( $subscription_types [ 'NOTIFICATION_GROUP_MISCELLANEOUS' ]))
{
$miscellaneous = $subscription_types [ 'NOTIFICATION_GROUP_MISCELLANEOUS' ];
unset ( $subscription_types [ 'NOTIFICATION_GROUP_MISCELLANEOUS' ]);
$subscription_types [ 'NOTIFICATION_GROUP_MISCELLANEOUS' ] = $miscellaneous ;
}
2012-09-26 21:48:59 -05:00
return $subscription_types ;
}
/**
* Get all of the subscription methods
*
* @ return array Array of methods
*/
public function get_subscription_methods ()
{
2012-09-26 22:39:12 -05:00
$subscription_methods = array ();
2012-11-20 18:14:48 -06:00
foreach ( $this -> notification_methods as $method_name => $data )
2012-09-26 22:39:12 -05:00
{
2012-11-09 07:40:08 -06:00
$method = $this -> get_method_class ( $method_name );
2012-09-26 22:39:12 -05:00
2012-10-18 19:20:54 -05:00
if ( $method instanceof phpbb_notification_method_interface && $method -> is_available ())
2012-09-26 22:39:12 -05:00
{
2012-11-09 07:40:08 -06:00
$subscription_methods [ $method_name ] = array (
'id' => $method -> get_type (),
'lang' => 'NOTIFICATION_METHOD_' . strtoupper ( $method -> get_type ()),
);
2012-09-26 22:39:12 -05:00
}
}
return $subscription_methods ;
2012-09-26 21:48:59 -05:00
}
2012-09-27 18:25:37 -05:00
/**
2012-10-29 18:09:20 -05:00
* Get global subscriptions ( item_id = 0 )
2012-09-27 18:25:37 -05:00
*
* @ param bool | int $user_id The user_id to add the subscription for ( bool false for current user )
*
* @ return array Subscriptions
*/
2012-10-29 18:09:20 -05:00
public function get_global_subscriptions ( $user_id = false )
2012-09-27 18:25:37 -05:00
{
2012-10-04 14:27:43 -05:00
$user_id = ( $user_id === false ) ? $this -> user -> data [ 'user_id' ] : $user_id ;
2012-09-27 18:25:37 -05:00
$subscriptions = array ();
2012-10-29 18:09:20 -05:00
foreach ( $this -> get_subscription_types () as $group_name => $types )
2012-09-27 18:25:37 -05:00
{
2012-10-29 18:09:20 -05:00
foreach ( $types as $id => $type )
2012-09-27 18:25:37 -05:00
{
2012-10-29 18:09:20 -05:00
$sql = ' SELECT method , notify
2012-11-09 08:48:41 -06:00
FROM ' . $this->user_notifications_table . '
2012-10-29 18:09:20 -05:00
WHERE user_id = ' . ( int ) $user_id . "
AND item_type = '" . $this->db->sql_escape($id) . "'
AND item_id = 0 " ;
$result = $this -> db -> sql_query ( $sql );
$row = $this -> db -> sql_fetchrow ( $result );
if ( ! $row )
2012-09-27 18:25:37 -05:00
{
2012-10-29 18:09:20 -05:00
// No rows at all, default to ''
$subscriptions [ $id ] = array ( '' );
2012-09-27 18:25:37 -05:00
}
2012-10-29 18:09:20 -05:00
else
{
do
{
if ( ! $row [ 'notify' ])
{
continue ;
}
2012-09-27 18:25:37 -05:00
2012-10-29 18:09:20 -05:00
if ( ! isset ( $subscriptions [ $id ]))
{
$subscriptions [ $id ] = array ();
}
$subscriptions [ $id ][] = $row [ 'method' ];
}
while ( $row = $this -> db -> sql_fetchrow ( $result ));
}
$this -> db -> sql_freeresult ( $result );
2012-09-27 18:25:37 -05:00
}
}
return $subscriptions ;
}
2012-09-25 10:35:50 -05:00
/**
* Add a subscription
*
* @ param string $item_type Type identifier of the subscription
* @ param int $item_id The id of the item
* @ param string $method The method of the notification e . g . '' , 'email' , or 'jabber'
* @ param bool | int $user_id The user_id to add the subscription for ( bool false for current user )
*/
2012-09-27 18:25:37 -05:00
public function add_subscription ( $item_type , $item_id = 0 , $method = '' , $user_id = false )
2012-09-09 17:20:39 -05:00
{
2012-10-29 18:09:20 -05:00
if ( $method !== '' )
{
$this -> add_subscription ( $item_type , $item_type , '' , $user_id );
}
2012-10-04 14:27:43 -05:00
$user_id = ( $user_id === false ) ? $this -> user -> data [ 'user_id' ] : $user_id ;
2012-09-25 10:35:50 -05:00
2012-10-29 18:09:20 -05:00
$sql = ' SELECT notify
2012-11-09 08:48:41 -06:00
FROM ' . $this -> user_notifications_table . "
2012-10-29 18:09:20 -05:00
WHERE item_type = '" . $this->db->sql_escape($item_type) . "'
AND item_id = " . (int) $item_id . '
AND user_id = ' . ( int ) $user_id . "
AND method = '" . $this->db->sql_escape($method) . "' " ;
2012-09-09 17:20:39 -05:00
$this -> db -> sql_query ( $sql );
2012-10-29 18:09:20 -05:00
$current = $this -> db -> sql_fetchfield ( 'notify' );
$this -> db -> sql_freeresult ();
if ( $current === false )
{
2012-11-09 08:48:41 -06:00
$sql = 'INSERT INTO ' . $this -> user_notifications_table . ' ' .
2012-10-29 18:09:20 -05:00
$this -> db -> sql_build_array ( 'INSERT' , array (
'item_type' => $item_type ,
'item_id' => ( int ) $item_id ,
'user_id' => ( int ) $user_id ,
'method' => $method ,
'notify' => 1 ,
));
$this -> db -> sql_query ( $sql );
}
else if ( ! $current )
{
2012-11-09 08:48:41 -06:00
$sql = 'UPDATE ' . $this -> user_notifications_table . "
2012-10-29 18:09:20 -05:00
SET notify = 1
WHERE item_type = '" . $this->db->sql_escape($item_type) . "'
AND item_id = " . (int) $item_id . '
AND user_id = ' . ( int ) $user_id . "
AND method = '" . $this->db->sql_escape($method) . "' " ;
$this -> db -> sql_query ( $sql );
}
2012-09-09 17:20:39 -05:00
}
2012-09-25 10:35:50 -05:00
/**
* Delete a subscription
*
* @ param string $item_type Type identifier of the subscription
* @ param int $item_id The id of the item
* @ param string $method The method of the notification e . g . '' , 'email' , or 'jabber'
* @ param bool | int $user_id The user_id to add the subscription for ( bool false for current user )
*/
2012-09-27 18:25:37 -05:00
public function delete_subscription ( $item_type , $item_id = 0 , $method = '' , $user_id = false )
2012-09-25 10:35:50 -05:00
{
2012-10-04 14:27:43 -05:00
$user_id = ( $user_id === false ) ? $this -> user -> data [ 'user_id' ] : $user_id ;
2012-09-25 10:35:50 -05:00
2012-10-29 18:09:20 -05:00
// If no method, make sure that no other notification methods for this item are selected before deleting
if ( $method === '' )
{
2012-11-09 07:45:23 -06:00
$sql = ' SELECT COUNT ( * ) as num_notifications
2012-11-09 08:48:41 -06:00
FROM ' . $this -> user_notifications_table . "
2012-10-29 18:09:20 -05:00
WHERE item_type = '" . $this->db->sql_escape($item_type) . "'
AND item_id = " . (int) $item_id . '
AND user_id = ' . ( int ) $user_id . "
AND method <> ''
AND notify = 1 " ;
$this -> db -> sql_query ( $sql );
2012-11-09 07:45:23 -06:00
$num_notifications = $this -> db -> sql_fetchfield ( 'num_notifications' );
2012-10-29 18:09:20 -05:00
$this -> db -> sql_freeresult ();
2012-11-09 07:45:23 -06:00
if ( $num_notifications )
2012-10-29 18:09:20 -05:00
{
return ;
}
}
2012-11-09 08:48:41 -06:00
$sql = 'UPDATE ' . $this -> user_notifications_table . "
2012-10-29 18:09:20 -05:00
SET notify = 0
2012-09-25 10:35:50 -05:00
WHERE item_type = '" . $this->db->sql_escape($item_type) . "'
AND item_id = " . (int) $item_id . '
AND user_id = ' . ( int ) $user_id . "
AND method = '" . $this->db->sql_escape($method) . "' " ;
$this -> db -> sql_query ( $sql );
2012-10-29 18:09:20 -05:00
if ( ! $this -> db -> sql_affectedrows ())
{
2012-11-09 08:48:41 -06:00
$sql = 'INSERT INTO ' . $this -> user_notifications_table . ' ' .
2012-10-29 18:09:20 -05:00
$this -> db -> sql_build_array ( 'INSERT' , array (
'item_type' => $item_type ,
'item_id' => ( int ) $item_id ,
'user_id' => ( int ) $user_id ,
'method' => $method ,
'notify' => 0 ,
));
$this -> db -> sql_query ( $sql );
}
2012-09-25 10:35:50 -05:00
}
2012-09-09 17:20:39 -05:00
2012-10-29 23:34:51 -05:00
/**
* Disable all notifications of a certain type
2012-11-09 07:48:18 -06:00
*
* This should be called when an extension which has notification types
* is disabled so that all those notifications are hidden and do not
* cause errors
2012-10-29 23:34:51 -05:00
*
* @ param string $item_type
*/
public function disable_notifications ( $item_type )
{
2012-11-09 08:48:41 -06:00
$sql = 'UPDATE ' . $this -> notifications_table . "
2012-10-29 23:34:51 -05:00
SET is_enabled = 0
WHERE item_type = '" . $this->db->sql_escape($item_type) . "' " ;
$this -> db -> sql_query ( $sql );
}
/**
* Enable all notifications of a certain type
2012-11-09 07:48:18 -06:00
*
* This should be called when an extension which has notification types
* that was disabled is re - enabled so that all those notifications that
* were hidden are shown again
2012-10-29 23:34:51 -05:00
*
* @ param string $item_type
*/
public function enable_notifications ( $item_type )
{
2012-11-09 08:48:41 -06:00
$sql = 'UPDATE ' . $this -> notifications_table . "
2012-10-29 23:34:51 -05:00
SET is_enabled = 1
WHERE item_type = '" . $this->db->sql_escape($item_type) . "' " ;
$this -> db -> sql_query ( $sql );
}
2012-09-09 10:19:46 -05:00
/**
2012-11-20 18:14:48 -06:00
* Helper to get the notifications item type class and set it up
2012-09-09 10:19:46 -05:00
*/
2012-11-20 18:14:48 -06:00
public function get_item_type_class ( $item_type , $data = array ())
2012-09-09 10:19:46 -05:00
{
2012-11-20 18:14:48 -06:00
$item = $this -> load_object ( 'notification.type.' . $item_type );
2012-09-09 10:19:46 -05:00
2012-11-20 18:14:48 -06:00
$item -> set_initial_data ( $data );
2012-09-09 10:19:46 -05:00
2012-11-20 18:14:48 -06:00
return $item ;
2012-09-09 10:19:46 -05:00
}
/**
2012-11-20 18:14:48 -06:00
* Helper to get the notifications method class and set it up
2012-09-09 10:19:46 -05:00
*/
2012-11-20 18:14:48 -06:00
public function get_method_class ( $method_name )
2012-09-09 10:19:46 -05:00
{
2012-11-20 18:14:48 -06:00
return $this -> load_object ( 'notification.method.' . $method_name );
2012-09-09 10:19:46 -05:00
}
2012-10-04 14:27:43 -05:00
/**
2012-11-20 18:14:48 -06:00
* Helper to load objects ( notification types / methods )
2012-10-04 14:27:43 -05:00
*/
2012-11-20 18:14:48 -06:00
protected function load_object ( $object_name )
2012-10-04 14:27:43 -05:00
{
2012-11-20 18:14:48 -06:00
// Here we cannot just use ContainerBuilder->get(name)
// The reason for this is because get handles services
// which are initialized once and shared. Here we need
// separate new objects because we pass around objects
// that store row data in each object, which would lead
// to over-writing of data if we used get()
2012-10-04 14:27:43 -05:00
2012-11-20 18:14:48 -06:00
$parameterBag = $this -> phpbb_container -> getParameterBag ();
$definition = $this -> phpbb_container -> getDefinition ( $object_name );
$arguments = $this -> phpbb_container -> resolveServices (
$parameterBag -> unescapeValue ( $parameterBag -> resolveValue ( $definition -> getArguments ()))
);
$r = new \ReflectionClass ( $parameterBag -> resolveValue ( $definition -> getClass ()));
2012-10-04 14:27:43 -05:00
2012-11-20 18:14:48 -06:00
$object = null === $r -> getConstructor () ? $r -> newInstance () : $r -> newInstanceArgs ( $arguments );
2012-10-04 14:27:43 -05:00
2012-11-20 18:14:48 -06:00
$object -> set_notification_manager ( $this );
return $object ;
2012-09-26 21:48:59 -05:00
}
2012-09-08 10:49:58 -05:00
}