[], 'groups' => [], ]; if (empty($id_message)) { return $targets; } $ret = db_get_all_rows_sql( sprintf( 'SELECT id_user FROM tnotification_user nu WHERE nu.id_mensaje = %d', $id_message ) ); if (is_array($ret)) { foreach ($ret as $row) { array_push( $targets['users'], get_user_fullname($row['id_user']) ); } } $ret = db_get_all_rows_sql( sprintf( 'SELECT COALESCE(tg.nombre,ng.id_group) as "id_group" FROM tnotification_group ng LEFT JOIN tgrupo tg ON tg.id_grupo=ng.id_group WHERE ng.id_mensaje = %d', $id_message ) ); if (is_array($ret)) { foreach ($ret as $row) { if ($row['id_group'] == '0') { $row['id_group'] = ''.__('All').''; } array_push($targets['groups'], $row['id_group']); } } return $targets; } /** * Check if current user has grants to read this notification * * @param integer $id_message Target message. * * @return boolean true, read available. False if not. */ function check_notification_readable(int $id_message) { global $config; if (empty($id_message)) { return false; } $sql = sprintf( 'SELECT tm.*, utimestamp_read > 0 as "read" FROM tmensajes tm LEFT JOIN tnotification_user nu ON tm.id_mensaje=nu.id_mensaje AND tm.id_mensaje=%d LEFT JOIN (tnotification_group ng INNER JOIN tusuario_perfil up ON ng.id_group=up.id_grupo AND up.id_grupo=ng.id_group ) ON tm.id_mensaje=ng.id_mensaje WHERE utimestamp_erased is null AND (up.id_usuario="%s" OR nu.id_user="%s" OR ng.id_group=0)', $id_message, $config['id_user'], $config['id_user'] ); return (bool) db_get_value_sql($sql); } /** * Return all info from tnotification_source * * @return array with sources info */ function notifications_get_all_sources() { return mysql_db_get_all_rows_in_table('tnotification_source'); } /** * Return the user sources to be inserted into a select * * @param int $source_id Source database identificator * * @return array with the user id in keys and user id in value too */ function notifications_get_user_sources_for_select($source_id) { $users = db_get_all_rows_filter( 'tnotification_source_user', array('id_source' => $source_id), 'id_user' ); // If fails or no one is selected, return empty array if ($users === false) return array(); return index_array($users, 'id_user', 'id_user'); } /** * Return the groups sources to be inserted into a select * * @param int $source_id Source database identificator * * @return array with the group id in keys and group name in value */ function notifications_get_group_sources_for_select($source_id) { $groups = db_get_all_rows_filter( 'tnotification_source_group tnsg LEFT JOIN tgrupo tg ON tnsg.id_group = tg.id_grupo', array('id_source' => $source_id), array ('tnsg.id_group', 'IFNULL(tg.nombre, "All") AS name') ); // If fails or no one is selected, return empty array if ($groups === false) return array(); return index_array($groups, 'id_group', 'name'); } /** * Delete a set of groups from notification source * * @param int Source id * @param array Id of groups to be deleted * * @return bool True if success. False otherwise. */ function notifications_remove_group_from_source ($source_id, $groups) { // Source id is mandatory if (!isset($source_id)) return false; // Delete from database return db_process_sql_delete ( 'tnotification_source_group', array( 'id_group' => $groups, 'id_source' => $source_id ) ) !== false; } /** * Insert a set of groups to notification source * * @param int Source id * @param array Id of groups to be deleted * * @return bool True if success. False otherwise. */ function notifications_add_group_to_source ($source_id, $groups) { // Source id is mandatory if (!isset($source_id)) return false; // Insert into database all groups passed $res = true; foreach ($groups as $group) { $res = db_process_sql_insert( 'tnotification_source_group', array( 'id_group' => $group, 'id_source' => $source_id) ) !== false; } return $res; } /** * Print the notification ball to see unread messages * * @return string with HTML code of notification ball */ function notifications_print_ball() { $num_notifications = messages_get_count(); $class_status = $num_notifications == 0 ? 'notification-ball-no-messages' : 'notification-ball-new-messages'; return "
$num_notifications
"; } /** * Print notification configuration global * * @param array notification source data * * @return string with HTML of source configuration */ function notifications_print_global_source_configuration($source) { // Get some values to generate the title $id = notifications_desc_to_id($source['description']); $switch_values = array ( 'name' => "enable-" . $id, 'value' => $source['enabled'] ); // Search if group all is set and handle that situation $source_groups = notifications_get_group_sources_for_select($source['id']); $is_group_all = isset($source_groups["0"]); if($is_group_all) unset($source_groups["0"]); // Generate the title $html_title = "
"; $html_title .= html_print_switch($switch_values); $html_title .= "

{$source['description']}

"; $html_title .= "
"; // Generate the html for title $html_selectors = "
"; $html_selectors .= notifications_print_source_select_box(notifications_get_user_sources_for_select($source['id']), 'users', $is_group_all); $html_selectors .= notifications_print_source_select_box($source_groups, 'groups', $is_group_all); $html_selectors .= "
"; // Generate the checkboxes and time select $html_checkboxes = "
"; $html_checkboxes .= " "; $html_checkboxes .= html_print_checkbox("all-$id", 1, $is_group_all, true, false, 'notifications_disable_source(event)'); $html_checkboxes .= __('Notify all users'); $html_checkboxes .= "
"; $html_checkboxes .= html_print_checkbox("mail-$id", 1, $source['also_mail'], true); $html_checkboxes .= __('Also email users with notification content'); $html_checkboxes .= "
"; $html_checkboxes .= html_print_checkbox("user-$id", 1, $source['user_editable'], true); $html_checkboxes .= __('Users cannot modify notification preferences'); $html_checkboxes .= " "; $html_checkboxes .= "
"; // Generate the select with the time $html_select_pospone = __('Users can postpone notifications up to'); $html_select_pospone .= html_print_select ( array( SECONDS_5MINUTES => __('5 minutes'), SECONDS_15MINUTES => __('15 minutes'), SECONDS_12HOURS => __('12 hours'), SECONDS_1DAY => __('1 day'), SECONDS_1WEEK => __('1 week'), SECONDS_15DAYS => __('15 days'), SECONDS_1MONTH => __('1 month'), NOTIFICATIONS_POSTPONE_FOREVER => __('forever')), "postpone-{$id}", $source['max_postpone_time'], '', '', 0, true ); // Return all html return $html_title . $html_selectors . $html_checkboxes . $html_select_pospone; } /** * Print select boxes of notified users or groups * * @param array $info_selec All info required for build the selector * @param string $id users|groups * @param bool $disabled Disable the selectors * * @return string HTML with the generated selector */ function notifications_print_source_select_box($info_selec, $id, $disabled) { $title = $id == "users" ? __('Notified users') : __('Notified groups'); $add_title = $id == "users" ? __('Add users') : __('Add groups'); $delete_title = $id == "users" ? __('Delete users') : __('Delete groups'); // Generate the HTML $html_select = "
"; $html_select .= "
"; $html_select .= "

$title

"; // Put a true if empty sources to avoid to sow the 'None' value $html_select .= html_print_select(empty($info_selec) ? true : $info_selec, "multi-{$id}[]", 0, false, '', '', true, true, true,'', $disabled); $html_select .= "
"; $html_select .= "
"; $html_select .= html_print_image('images/input_add.png', true, array('title' => $add_title)); $html_select .= html_print_image('images/input_delete.png', true, array('title' => $delete_title)); $html_select .= "
"; $html_select .= "
"; return $html_select; }