2012-09-08 10:49:58 -05:00
< ? php
/**
*
2014-05-27 20:18:06 +02:00
* This file is part of the phpBB Forum Software package .
*
* @ copyright ( c ) phpBB Limited < https :// www . phpbb . com >
* @ license GNU General Public License , version 2 ( GPL - 2.0 )
*
* For full copyright and license information , please see
* the docs / CREDITS . txt file .
2012-09-08 10:49:58 -05:00
*
*/
2013-09-10 14:01:09 +02:00
namespace phpbb\notification ;
2012-09-08 10:49:58 -05:00
/**
* Notifications service class
*/
2013-09-10 14:01:09 +02:00
class manager
2012-09-08 10:49:58 -05:00
{
2012-11-20 18:14:48 -06:00
/** @var array */
2013-01-15 12:10:07 -06:00
protected $notification_types ;
2012-11-20 18:14:48 -06:00
/** @var array */
2013-01-15 12:10:07 -06:00
protected $notification_methods ;
2012-11-20 18:14:48 -06:00
2012-11-09 07:40:08 -06:00
/** @var ContainerBuilder */
2013-01-15 12:10:07 -06:00
protected $phpbb_container ;
2012-10-18 18:45:43 -05:00
2013-09-10 14:01:09 +02:00
/** @var \phpbb\user_loader */
2013-01-15 12:10:07 -06:00
protected $user_loader ;
2012-10-18 18:45:43 -05:00
2013-11-13 23:58:21 -08:00
/** @var \phpbb\config\config */
protected $config ;
2014-03-17 13:29:35 +01:00
/** @var \phpbb\db\driver\driver_interface */
2013-01-15 12:10:07 -06:00
protected $db ;
2012-10-18 18:45:43 -05:00
2013-09-10 14:01:09 +02:00
/** @var \phpbb\cache\service */
2013-04-28 23:40:48 -05:00
protected $cache ;
2013-09-10 14:01:09 +02:00
/** @var \phpbb\user */
2013-01-15 12:10:07 -06:00
protected $user ;
2012-10-18 18:45:43 -05:00
/** @var string */
2013-01-15 12:10:07 -06:00
protected $phpbb_root_path ;
2012-10-18 18:45:43 -05:00
/** @var string */
2013-01-15 12:10:07 -06:00
protected $php_ext ;
2012-09-08 10:49:58 -05:00
2012-12-15 19:18:26 -06:00
/** @var string */
2013-01-15 12:10:07 -06:00
protected $notification_types_table ;
2012-12-15 19:18:26 -06:00
2012-11-09 08:48:41 -06:00
/** @var string */
2013-01-15 12:10:07 -06:00
protected $notifications_table ;
2012-11-09 08:48:41 -06:00
/** @var string */
2013-01-15 12:10:07 -06:00
protected $user_notifications_table ;
2012-11-09 08:48:41 -06:00
2013-01-15 12:10:07 -06:00
/**
* Notification Constructor
2013-07-27 20:37:50 -05:00
*
2013-01-15 12:10:07 -06:00
* @ param array $notification_types
* @ param array $notification_methods
* @ param ContainerBuilder $phpbb_container
2013-09-10 14:01:09 +02:00
* @ param \phpbb\user_loader $user_loader
2013-11-13 23:58:21 -08:00
* @ param \phpbb\config\config $config
2014-03-17 13:29:35 +01:00
* @ param \phpbb\db\driver\driver_interface $db
2013-09-10 14:01:09 +02:00
* @ param \phpbb\user $user
2013-01-15 12:10:07 -06:00
* @ param string $phpbb_root_path
* @ param string $php_ext
* @ param string $notification_types_table
* @ param string $notifications_table
* @ param string $user_notifications_table
2013-09-10 14:01:09 +02:00
* @ return \phpbb\notification\manager
2013-01-15 12:10:07 -06:00
*/
2014-03-17 13:29:35 +01:00
public function __construct ( $notification_types , $notification_methods , $phpbb_container , \phpbb\user_loader $user_loader , \phpbb\config\config $config , \phpbb\db\driver\driver_interface $db , \phpbb\cache\service $cache , $user , $phpbb_root_path , $php_ext , $notification_types_table , $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 ;
2013-11-13 23:58:21 -08:00
$this -> config = $config ;
2012-10-04 14:27:43 -05:00
$this -> db = $db ;
2013-04-28 23:40:48 -05:00
$this -> cache = $cache ;
2012-10-04 14:27:43 -05:00
$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
2012-12-15 19:18:26 -06:00
$this -> notification_types_table = $notification_types_table ;
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' ])
2013-01-15 12:10:07 -06:00
* order_by Order by ( Default : notification_time )
2012-09-20 10:36:11 -05:00
* 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-12-15 21:02:28 -06:00
'order_by' => 'notification_time' ,
2012-09-20 10:36:11 -05:00
'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-12-15 19:18:26 -06:00
$sql = ' SELECT COUNT ( n . notification_id ) AS unread_count
FROM ' . $this->notifications_table . ' n , ' . $this->notification_types_table . ' nt
WHERE n . user_id = ' . (int) $options[' user_id '] . '
2012-12-15 21:08:26 -06:00
AND n . notification_read = 0
2013-04-28 23:40:48 -05:00
AND nt . notification_type_id = n . notification_type_id
2012-12-15 19:18:26 -06:00
AND nt . notification_type_enabled = 1 ' ;
2012-09-20 10:36:11 -05:00
$result = $this -> db -> sql_query ( $sql );
2013-10-14 21:18:41 -05:00
$unread_count = ( int ) $this -> db -> sql_fetchfield ( 'unread_count' );
2012-10-13 20:02:38 -05:00
$this -> db -> sql_freeresult ( $result );
}
if ( $options [ 'count_total' ])
{
// Get the total number of notifications
2012-12-15 19:18:26 -06:00
$sql = ' SELECT COUNT ( n . notification_id ) AS total_count
FROM ' . $this->notifications_table . ' n , ' . $this->notification_types_table . ' nt
WHERE n . user_id = ' . (int) $options[' user_id '] . '
2013-04-28 23:40:48 -05:00
AND nt . notification_type_id = n . notification_type_id
2012-12-15 19:18:26 -06:00
AND nt . notification_type_enabled = 1 ' ;
2012-10-13 20:02:38 -05:00
$result = $this -> db -> sql_query ( $sql );
2013-10-14 21:18:41 -05:00
$total_count = ( int ) $this -> db -> sql_fetchfield ( 'total_count' );
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
2013-04-28 23:40:48 -05:00
$sql = ' SELECT n .* , nt . notification_type_name
2012-12-15 19:18:26 -06:00
FROM ' . $this->notifications_table . ' n , ' . $this->notification_types_table . ' nt
WHERE n . user_id = ' . (int) $options[' user_id ' ] .
(( $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' ]) : '' ) . '
2013-04-28 23:40:48 -05:00
AND nt . notification_type_id = n . notification_type_id
2012-12-15 19:18:26 -06:00
AND nt . notification_type_enabled = 1
ORDER BY n . ' . $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
{
2013-04-28 23:40:48 -05:00
$sql = ' SELECT n .* , nt . notification_type_name
2012-12-15 19:18:26 -06:00
FROM ' . $this->notifications_table . ' n , ' . $this->notification_types_table . ' nt
WHERE n . user_id = ' . (int) $options[' user_id '] . '
2012-12-15 21:08:26 -06:00
AND n . notification_read = 0
2012-12-15 19:18:26 -06:00
AND ' . $this->db->sql_in_set(' n . notification_id ', array_keys($rowset), true) . '
2013-04-28 23:40:48 -05:00
AND nt . notification_type_id = n . notification_type_id
2012-12-15 19:18:26 -06:00
AND nt . notification_type_enabled = 1
ORDER BY n . ' . $this->db->sql_escape($options[' order_by ']) . ' ' . $this->db->sql_escape($options[' order_dir ' ]);
2012-10-20 20:54:18 -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-12 22:29:48 -05:00
}
2012-10-20 20:54:18 -05:00
foreach ( $rowset as $row )
{
2013-04-28 23:40:48 -05:00
$notification = $this -> get_item_type_class ( $row [ 'notification_type_name' ], $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
2013-04-28 23:40:48 -05:00
if ( ! isset ( $load_special [ $row [ 'notification_type_name' ]]))
2012-10-20 20:54:18 -05:00
{
2013-04-28 23:40:48 -05:00
$load_special [ $row [ 'notification_type_name' ]] = array ();
2012-10-20 20:54:18 -05:00
}
2013-04-28 23:40:48 -05:00
$load_special [ $row [ 'notification_type_name' ]] = array_merge ( $load_special [ $row [ 'notification_type_name' ]], $notification -> get_load_special ());
2012-10-20 20:54:18 -05:00
$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
*
2013-04-28 23:40:48 -05:00
* @ param bool | string | array $notification_type_name 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 )
*/
2013-04-28 23:40:48 -05:00
public function mark_notifications_read ( $notification_type_name , $item_id , $user_id , $time = false )
2012-09-14 15:59:13 -05:00
{
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-12-15 21:08:26 -06:00
SET notification_read = 1
2013-02-28 15:25:18 -06:00
WHERE notification_time <= " . (int) $time .
2013-04-28 23:40:48 -05:00
(( $notification_type_name !== false ) ? ' AND ' .
2013-10-30 13:37:29 +01:00
( is_array ( $notification_type_name ) ? $this -> db -> sql_in_set ( 'notification_type_id' , $this -> get_notification_type_ids ( $notification_type_name )) : 'notification_type_id = ' . $this -> get_notification_type_id ( $notification_type_name )) : '' ) .
2013-03-26 17:07:20 -04:00
(( $user_id !== false ) ? ' AND ' . ( is_array ( $user_id ) ? $this -> db -> sql_in_set ( 'user_id' , $user_id ) : 'user_id = ' . ( int ) $user_id ) : '' ) .
2012-12-27 10:28:57 -06:00
(( $item_id !== false ) ? ' AND ' . ( is_array ( $item_id ) ? $this -> db -> sql_in_set ( 'item_id' , $item_id ) : 'item_id = ' . ( int ) $item_id ) : '' );
2012-09-14 15:59:13 -05:00
$this -> db -> sql_query ( $sql );
}
/**
* Mark notifications read from a parent identifier
*
2013-04-28 23:40:48 -05:00
* @ param string | array $notification_type_name 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 )
*/
2013-04-28 23:40:48 -05:00
public function mark_notifications_read_by_parent ( $notification_type_name , $item_parent_id , $user_id , $time = false )
2012-09-14 15:59:13 -05:00
{
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-12-15 21:08:26 -06:00
SET notification_read = 1
2013-04-28 23:40:48 -05:00
WHERE notification_time <= " . (int) $time .
(( $notification_type_name !== false ) ? ' AND ' .
2013-10-30 13:37:29 +01:00
( is_array ( $notification_type_name ) ? $this -> db -> sql_in_set ( 'notification_type_id' , $this -> get_notification_type_ids ( $notification_type_name )) : 'notification_type_id = ' . $this -> get_notification_type_id ( $notification_type_name )) : '' ) .
2012-09-14 15:59:13 -05:00
(( $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-12-15 21:08:26 -06:00
SET notification_read = 1
2013-02-28 15:25:18 -06:00
WHERE notification_time <= " . (int) $time . '
2012-09-20 10:36:11 -05:00
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
*
2013-04-28 23:40:48 -05:00
* @ param string | array $notification_type_name 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
*/
2013-04-28 23:40:48 -05:00
public function add_notifications ( $notification_type_name , $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 );
2013-04-28 23:40:48 -05:00
if ( is_array ( $notification_type_name ))
2012-09-14 16:54:20 -05:00
{
2012-09-27 20:05:06 -05:00
$notified_users = array ();
$temp_options = $options ;
2013-04-28 23:40:48 -05:00
foreach ( $notification_type_name as $type )
2012-09-14 16:54:20 -05:00
{
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
}
2013-04-28 23:40:48 -05:00
$item_id = $this -> get_item_type_class ( $notification_type_name ) -> 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
2013-04-28 23:40:48 -05:00
$notify_users = $this -> get_item_type_class ( $notification_type_name ) -> find_users_for_notification ( $data , $options );
2012-09-08 10:49:58 -05:00
2013-04-28 23:40:48 -05:00
$this -> add_notifications_for_users ( $notification_type_name , $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
*
2013-04-28 23:40:48 -05:00
* @ param string | array $notification_type_name 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
*/
2013-04-28 23:40:48 -05:00
public function add_notifications_for_users ( $notification_type_name , $data , $notify_users )
2012-09-14 14:55:14 -05:00
{
2013-04-28 23:40:48 -05:00
if ( is_array ( $notification_type_name ))
2012-09-14 16:54:20 -05:00
{
2013-04-28 23:40:48 -05:00
foreach ( $notification_type_name as $type )
2012-09-14 16:54:20 -05:00
{
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 ;
}
2013-04-28 23:40:48 -05:00
$notification_type_id = $this -> get_notification_type_id ( $notification_type_name );
2012-12-15 19:18:26 -06:00
2013-04-28 23:40:48 -05:00
$item_id = $this -> get_item_type_class ( $notification_type_name ) -> get_item_id ( $data );
2012-09-14 14:55:14 -05:00
$user_ids = array ();
$notification_objects = $notification_methods = 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
2013-09-16 05:00:18 +02:00
// Make sure not to send new notifications to users who've already been notified about this item
2013-09-16 04:45:58 +02:00
// This may happen when an item was added, but now new users are able to see the item
2012-12-15 19:18:26 -06:00
$sql = ' SELECT n . user_id
2013-04-28 23:40:48 -05:00
FROM ' . $this->notifications_table . ' n , ' . $this->notification_types_table . ' nt
WHERE n . notification_type_id = ' . (int) $notification_type_id . '
AND n . item_id = ' . (int) $item_id . '
AND nt . notification_type_id = n . notification_type_id
2012-12-15 19:18:26 -06:00
AND nt . notification_type_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)
2013-04-28 23:40:48 -05:00
$notification = $this -> get_item_type_class ( $notification_type_name );
2012-10-12 16:54:42 -05:00
$pre_create_data = $notification -> pre_create_insert_array ( $data , $notify_users );
unset ( $notification );
2013-09-10 14:01:09 +02:00
$insert_buffer = new \phpbb\db\sql_insert_buffer ( $this -> db , $this -> notifications_table );
2013-03-29 16:44:29 +01:00
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 )
{
2013-04-28 23:40:48 -05:00
$notification = $this -> get_item_type_class ( $notification_type_name );
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
2013-03-29 16:44:29 +01:00
// Insert notification row using buffer.
$insert_buffer -> insert ( $notification -> create_insert_array ( $data , $pre_create_data ));
2013-03-17 22:15:10 +01: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
}
}
2013-03-29 16:44:29 +01:00
$insert_buffer -> flush ();
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
*
2013-04-28 23:40:48 -05:00
* @ param string | array $notification_type_name 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
*/
2013-04-28 23:40:48 -05:00
public function update_notifications ( $notification_type_name , $data )
2012-09-08 10:49:58 -05:00
{
2013-04-28 23:40:48 -05:00
if ( is_array ( $notification_type_name ))
2012-09-14 16:54:20 -05:00
{
2013-04-28 23:40:48 -05:00
foreach ( $notification_type_name as $type )
2012-09-14 16:54:20 -05:00
{
2012-09-15 14:33:15 -05:00
$this -> update_notifications ( $type , $data );
2012-09-14 16:54:20 -05:00
}
return ;
}
2013-04-28 23:40:48 -05:00
$notification = $this -> get_item_type_class ( $notification_type_name );
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 ;
}
}
2013-04-28 23:40:48 -05:00
$notification_type_id = $this -> get_notification_type_id ( $notification_type_name );
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 . '
2013-04-28 23:40:48 -05:00
SET ' . $this->db->sql_build_array(' UPDATE ', $update_array) . '
WHERE notification_type_id = ' . (int) $notification_type_id . '
AND item_id = ' . ( int ) $item_id ;
2012-09-08 12:28:58 -05:00
$this -> db -> sql_query ( $sql );
}
/**
* Delete a notification
*
2013-04-28 23:40:48 -05:00
* @ param string | array $notification_type_name 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 )
2013-07-27 09:09:24 -05:00
* @ param mixed $parent_id Parent identifier within the type ( or array of ids ), used in combination with item_id if specified ( Default : false ; not checked )
2012-09-08 12:28:58 -05:00
*/
2013-07-26 10:26:52 -05:00
public function delete_notifications ( $notification_type_name , $item_id , $parent_id = false )
2012-09-08 12:28:58 -05:00
{
2013-04-28 23:40:48 -05:00
if ( is_array ( $notification_type_name ))
2012-09-15 14:33:15 -05:00
{
2013-04-28 23:40:48 -05:00
foreach ( $notification_type_name as $type )
2012-09-15 14:33:15 -05:00
{
2013-07-26 10:26:52 -05:00
$this -> delete_notifications ( $type , $item_id , $parent_id );
2012-09-15 14:33:15 -05:00
}
return ;
}
2013-04-28 23:40:48 -05:00
$notification_type_id = $this -> get_notification_type_id ( $notification_type_name );
$sql = 'DELETE FROM ' . $this -> notifications_table . '
WHERE notification_type_id = ' . (int) $notification_type_id . '
2013-07-26 10:26:52 -05:00
AND ' . (is_array($item_id) ? $this->db->sql_in_set(' item_id ', $item_id) : ' item_id = ' . ( int ) $item_id ) .
(( $parent_id !== false ) ? ' AND ' . (( is_array ( $parent_id ) ? $this -> db -> sql_in_set ( 'item_parent_id' , $parent_id ) : 'item_parent_id = ' . ( int ) $parent_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
2013-09-10 14:01:09 +02:00
if ( $type instanceof \phpbb\notification\type\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
2013-09-10 14:01:09 +02:00
if ( $method instanceof \phpbb\notification\method\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
}
2014-06-07 01:34:20 +05:30
2012-09-27 18:25:37 -05:00
/**
2014-06-07 01:34:20 +05:30
* Get user ' s notification data
2012-09-27 18:25:37 -05:00
*
2014-06-07 01:34:20 +05:30
* @ param int $user_id The user_id of the user to get the notifications for
2012-09-27 18:25:37 -05:00
*
2014-06-07 01:34:20 +05:30
* @ return array User ' s notification
2012-09-27 18:25:37 -05:00
*/
2014-06-07 01:34:20 +05:30
protected function get_user_notifications ( $user_id )
2012-09-27 18:25:37 -05:00
{
2014-06-01 13:38:27 +05:30
$sql = ' SELECT method , notify , item_type
FROM ' . $this->user_notifications_table . '
WHERE user_id = ' . (int) $user_id . '
AND item_id = 0 ' ;
$result = $this -> db -> sql_query ( $sql );
2014-06-07 01:34:20 +05:30
$user_notifications = array ();
2014-06-01 13:38:27 +05:30
while ( $row = $this -> db -> sql_fetchrow ( $result ))
{
2014-06-07 01:34:20 +05:30
$user_notifications [ $row [ 'item_type' ]][] = $row ;
2014-06-01 13:38:27 +05:30
}
$this -> db -> sql_freeresult ( $result );
2014-06-07 01:34:20 +05:30
return $user_notifications ;
}
/**
* Get global subscriptions ( item_id = 0 )
*
* @ param bool | int $user_id The user_id to add the subscription for ( bool false for current user )
*
* @ return array Subscriptions
*/
public function get_global_subscriptions ( $user_id = false )
{
$user_id = ( $user_id === false ) ? $this -> user -> data [ 'user_id' ] : $user_id ;
$subscriptions = array ();
$user_notifications = $this -> get_user_notifications ( $user_id );
2014-06-07 01:00:09 +05:30
foreach ( $this -> get_subscription_types () as $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
{
2014-06-01 13:38:27 +05:30
2014-06-07 01:34:20 +05:30
if ( empty ( $user_notifications [ $id ]))
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
{
2014-06-07 01:34:20 +05:30
foreach ( $user_notifications [ $id ] as $user_notification )
2012-10-29 18:09:20 -05:00
{
2014-06-07 01:34:20 +05:30
if ( ! $user_notification [ 'notify' ])
2012-10-29 18:09:20 -05:00
{
continue ;
}
2012-09-27 18:25:37 -05:00
2012-10-29 18:09:20 -05:00
if ( ! isset ( $subscriptions [ $id ]))
{
$subscriptions [ $id ] = array ();
}
2014-06-07 01:34:20 +05:30
$subscriptions [ $id ][] = $user_notification [ 'method' ];
2012-10-29 18:09:20 -05:00
}
}
2012-09-27 18:25:37 -05:00
}
}
return $subscriptions ;
}
2012-09-25 10:35:50 -05:00
/**
* Add a subscription
*
2013-04-29 21:22:07 -05:00
* @ param string $item_type Type identifier of the subscription
2012-09-25 10:35:50 -05:00
* @ 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 )
*/
2013-04-29 21:22:07 -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 !== '' )
{
2013-04-29 21:22:07 -05:00
// Make sure to subscribe them to the base subscription
$this -> add_subscription ( $item_type , $item_id , '' , $user_id );
2012-10-29 18:09:20 -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
$sql = ' SELECT notify
2013-04-29 21:22:07 -05:00
FROM ' . $this -> user_notifications_table . "
WHERE item_type = '" . $this->db->sql_escape($item_type) . "'
AND item_id = " . (int) $item_id . '
2012-10-29 18:09:20 -05:00
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 (
2013-04-29 21:22:07 -05:00
'item_type' => $item_type ,
2012-10-29 18:09:20 -05:00
'item_id' => ( int ) $item_id ,
'user_id' => ( int ) $user_id ,
'method' => $method ,
'notify' => 1 ,
));
$this -> db -> sql_query ( $sql );
}
else if ( ! $current )
{
2013-04-29 21:22:07 -05:00
$sql = 'UPDATE ' . $this -> user_notifications_table . "
2012-10-29 18:09:20 -05:00
SET notify = 1
2013-04-29 21:22:07 -05:00
WHERE item_type = '" . $this->db->sql_escape($item_type) . "'
AND item_id = " . (int) $item_id . '
2012-10-29 18:09:20 -05:00
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
*
2013-04-29 21:22:07 -05:00
* @ param string $item_type Type identifier of the subscription
2012-09-25 10:35:50 -05:00
* @ 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 )
*/
2013-04-29 21:22:07 -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
2013-04-29 21:22:07 -05:00
FROM ' . $this -> user_notifications_table . "
WHERE item_type = '" . $this->db->sql_escape($item_type) . "'
AND item_id = " . (int) $item_id . '
2012-10-29 18:09:20 -05:00
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 ;
}
}
2013-04-29 21:22:07 -05:00
$sql = 'UPDATE ' . $this -> user_notifications_table . "
2012-10-29 18:09:20 -05:00
SET notify = 0
2013-04-29 21:22:07 -05:00
WHERE item_type = '" . $this->db->sql_escape($item_type) . "'
AND item_id = " . (int) $item_id . '
2012-09-25 10:35:50 -05:00
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 (
2013-04-29 21:22:07 -05:00
'item_type' => $item_type ,
2012-10-29 18:09:20 -05:00
'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
*
2013-04-28 23:40:48 -05:00
* @ param string $notification_type_name Type identifier of the subscription
2012-10-29 23:34:51 -05:00
*/
2013-04-28 23:40:48 -05:00
public function disable_notifications ( $notification_type_name )
2012-10-29 23:34:51 -05:00
{
2012-12-15 19:18:26 -06:00
$sql = 'UPDATE ' . $this -> notification_types_table . "
SET notification_type_enabled = 0
2013-04-28 23:40:48 -05:00
WHERE notification_type_name = '" . $this->db->sql_escape($notification_type_name) . "' " ;
2012-10-29 23:34:51 -05:00
$this -> db -> sql_query ( $sql );
}
2012-12-15 18:25:26 -06:00
/**
* Purge all notifications of a certain type
*
* This should be called when an extension which has notification types
* is purged so that all those notifications are removed
*
2013-04-28 23:40:48 -05:00
* @ param string $notification_type_name Type identifier of the subscription
2012-12-15 18:25:26 -06:00
*/
2013-04-28 23:40:48 -05:00
public function purge_notifications ( $notification_type_name )
2012-12-15 18:25:26 -06:00
{
2014-05-14 02:32:12 +02:00
// If a notification is never used, its type will not be added to the database
// nor its id cached. If this method is called by an extension during the
// purge step, and that extension never used its notifications,
// get_notification_type_id() will throw an exception. However,
// because no notification type was added to the database,
// there is nothing to delete, so we can silently drop the exception.
2014-05-14 02:06:48 +02:00
try
{
$notification_type_id = $this -> get_notification_type_id ( $notification_type_name );
2013-04-28 23:40:48 -05:00
2014-05-14 02:06:48 +02:00
$sql = 'DELETE FROM ' . $this -> notifications_table . '
WHERE notification_type_id = ' . ( int ) $notification_type_id ;
$this -> db -> sql_query ( $sql );
2012-12-15 19:18:26 -06:00
2014-05-14 02:06:48 +02:00
$sql = 'DELETE FROM ' . $this -> notification_types_table . '
WHERE notification_type_id = ' . ( int ) $notification_type_id ;
$this -> db -> sql_query ( $sql );
2013-04-28 23:40:48 -05:00
2014-05-14 02:06:48 +02:00
$this -> cache -> destroy ( 'notification_type_ids' );
}
catch ( \phpbb\notification\exception $e )
{
// Continue
}
2012-12-15 18:25:26 -06:00
}
2012-10-29 23:34:51 -05:00
/**
* 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
*
2013-04-28 23:40:48 -05:00
* @ param string $notification_type_name Type identifier of the subscription
2012-10-29 23:34:51 -05:00
*/
2013-04-28 23:40:48 -05:00
public function enable_notifications ( $notification_type_name )
2012-10-29 23:34:51 -05:00
{
2012-12-15 19:18:26 -06:00
$sql = 'UPDATE ' . $this -> notification_types_table . "
SET notification_type_enabled = 1
2013-04-28 23:40:48 -05:00
WHERE notification_type_name = '" . $this->db->sql_escape($notification_type_name) . "' " ;
2012-10-29 23:34:51 -05:00
$this -> db -> sql_query ( $sql );
}
2012-12-15 18:35:17 -06:00
/**
* Delete all notifications older than a certain time
*
* @ param int $timestamp Unix timestamp to delete all notifications that were created before
2013-07-27 20:37:50 -05:00
* @ param bool $only_unread True ( default ) to only prune read notifications
2012-12-15 18:35:17 -06:00
*/
2013-07-27 20:37:50 -05:00
public function prune_notifications ( $timestamp , $only_read = true )
2012-12-15 18:35:17 -06:00
{
$sql = 'DELETE FROM ' . $this -> notifications_table . '
2013-07-27 20:37:50 -05:00
WHERE notification_time < ' . ( int ) $timestamp .
(( $only_read ) ? ' AND notification_read = 1' : '' );
2012-12-15 18:35:17 -06:00
$this -> db -> sql_query ( $sql );
2013-11-13 23:58:21 -08:00
$this -> config -> set ( 'read_notification_last_gc' , time (), false );
2012-12-15 18:35:17 -06:00
}
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
*/
2013-04-28 23:40:48 -05:00
public function get_item_type_class ( $notification_type_name , $data = array ())
2012-09-09 10:19:46 -05:00
{
2013-04-28 23:40:48 -05:00
$notification_type_name = ( strpos ( $notification_type_name , 'notification.type.' ) === 0 ) ? $notification_type_name : 'notification.type.' . $notification_type_name ;
2012-11-21 16:04:01 -06:00
2013-04-28 23:40:48 -05:00
$item = $this -> load_object ( $notification_type_name );
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-21 16:04:01 -06:00
$method_name = ( strpos ( $method_name , 'notification.method.' ) === 0 ) ? $method_name : 'notification.method.' . $method_name ;
return $this -> load_object ( $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
{
2013-01-15 12:29:20 -06:00
$object = $this -> phpbb_container -> get ( $object_name );
2013-07-27 20:37:50 -05:00
2013-01-15 12:29:20 -06:00
if ( method_exists ( $object , 'set_notification_manager' ))
{
$object -> set_notification_manager ( $this );
}
2013-07-27 20:37:50 -05:00
2013-01-15 12:29:20 -06:00
return $object ;
2012-09-26 21:48:59 -05:00
}
2013-04-28 23:40:48 -05:00
/**
* Get the notification type id from the name
*
* @ param string $notification_type_name The name
* @ return int the notification_type_id
*/
public function get_notification_type_id ( $notification_type_name )
{
$notification_type_ids = $this -> cache -> get ( 'notification_type_ids' );
if ( $notification_type_ids === false )
{
$notification_type_ids = array ();
$sql = ' SELECT notification_type_id , notification_type_name
FROM ' . $this -> notification_types_table ;
$result = $this -> db -> sql_query ( $sql );
while ( $row = $this -> db -> sql_fetchrow ( $result ))
{
$notification_type_ids [ $row [ 'notification_type_name' ]] = ( int ) $row [ 'notification_type_id' ];
}
$this -> db -> sql_freeresult ( $result );
$this -> cache -> put ( 'notification_type_ids' , $notification_type_ids );
}
if ( ! isset ( $notification_type_ids [ $notification_type_name ]))
{
2013-04-29 21:42:14 -05:00
if ( ! isset ( $this -> notification_types [ $notification_type_name ]) && ! isset ( $this -> notification_types [ 'notification.type.' . $notification_type_name ]))
{
2013-09-10 14:01:09 +02:00
throw new \phpbb\notification\exception ( $this -> user -> lang ( 'NOTIFICATION_TYPE_NOT_EXIST' , $notification_type_name ));
2013-04-29 21:42:14 -05:00
}
2013-04-28 23:40:48 -05:00
$sql = 'INSERT INTO ' . $this -> notification_types_table . ' ' . $this -> db -> sql_build_array ( 'INSERT' , array (
'notification_type_name' => $notification_type_name ,
'notification_type_enabled' => 1 ,
));
$this -> db -> sql_query ( $sql );
$notification_type_ids [ $notification_type_name ] = ( int ) $this -> db -> sql_nextid ();
$this -> cache -> put ( 'notification_type_ids' , $notification_type_ids );
}
return $notification_type_ids [ $notification_type_name ];
}
/**
* Get notification type ids ( as an array )
*
* @ param array $notification_type_names Array of strings
* @ return array Array of integers
*/
public function get_notification_type_ids ( array $notification_type_names )
{
$notification_type_ids = array ();
foreach ( $notification_type_names as $name )
{
$notification_type_ids [ $name ] = $this -> get_notification_type_id ( $name );
}
return $notification_type_ids ;
}
2012-09-08 10:49:58 -05:00
}