From ce3188d5c6a8dc2e4ebf188faef235a1b3b5c5b1 Mon Sep 17 00:00:00 2001 From: rabuzarus <> Date: Wed, 3 Aug 2016 12:44:04 +0200 Subject: [PATCH] notifications - move intros to NotificationsManager & make json output work --- include/NotificationsManager.php | 338 ++++++++++++++++++++------- mod/notifications.php | 383 ++++++++++++++----------------- 2 files changed, 421 insertions(+), 300 deletions(-) diff --git a/include/NotificationsManager.php b/include/NotificationsManager.php index 362e3f5326..fef48d5d43 100644 --- a/include/NotificationsManager.php +++ b/include/NotificationsManager.php @@ -1,6 +1,8 @@ value: filter query by columns values * @param string $order optional Space separated list of column to sort by. prepend name with "+" to sort ASC, "-" to sort DESC. Default to "-date" @@ -89,7 +92,7 @@ class NotificationsManager { } /** - * @brief get one note for local_user() by $id value + * @brief Get one note for local_user() by $id value * * @param int $id * @return array note values or null if not found @@ -196,7 +199,7 @@ class NotificationsManager { * string 'when' => Relative date of the notification * bool 'seen' => Is the notification marked as "seen" */ - private function format($notifs, $ident = "") { + private function formatNotifs($notifs, $ident = "") { $notif = array(); $arr = array(); @@ -335,9 +338,9 @@ class NotificationsManager { /** * @brief Total number of network notifications - * @param int $seen + * @param int|string $seen * If 0 only include notifications into the query - * which arn't marked as "seen" into + * which aren't marked as "seen" * @return int Number of network notifications */ private function networkTotal($seen = 0) { @@ -361,17 +364,21 @@ class NotificationsManager { /** * @brief Get network notifications * - * @param type $seen + * @param int|string $seen * If 0 only include notifications into the query - * which arn't marked as "seen" into + * which aren't marked as "seen" * @param int $start Start the query at this point * @param int $limit Maximum number of query results * - * @return array Query output + * @return array with + * string 'ident' => Notification identifier + * int 'total' => Total number of available network notifications + * array 'notifications' => Network notifications */ - public function networkNotifs($seen = 0, $start = 0, $limit = 20) { + public function networkNotifs($seen = 0, $start = 0, $limit = 80) { $ident = 'network'; $total = $this->networkTotal($seen); + $notifs = array(); if($seen === 0) $sql_seen = " AND `item`.`unseen` = 1 "; @@ -380,33 +387,33 @@ class NotificationsManager { $r = q("SELECT `item`.`id`,`item`.`parent`, `item`.`verb`, `item`.`author-name`, `item`.`unseen`, `item`.`author-link`, `item`.`author-avatar`, `item`.`created`, `item`.`object` AS `object`, `pitem`.`author-name` AS `pname`, `pitem`.`author-link` AS `plink`, `pitem`.`guid` AS `pguid` - FROM `item` INNER JOIN `item` AS `pitem` ON `pitem`.`id`=`item`.`parent` - WHERE `item`.`visible` = 1 AND `pitem`.`parent` != 0 AND + FROM `item` INNER JOIN `item` AS `pitem` ON `pitem`.`id`=`item`.`parent` + WHERE `item`.`visible` = 1 AND `pitem`.`parent` != 0 AND `item`.`deleted` = 0 AND `item`.`uid` = %d AND `item`.`wall` = 0 $sql_seen - ORDER BY `item`.`created` DESC LIMIT %d, %d ", - intval(local_user()), - intval($start), - intval($limit) + ORDER BY `item`.`created` DESC LIMIT %d, %d ", + intval(local_user()), + intval($start), + intval($limit) ); - if(dbm::is_result($r)) { - $notifs = $this->format($r, $ident); - $arr = array ( - 'notifications' => $notifs, - 'ident' => $ident, - 'total' => $total, - ); + if(dbm::is_result($r)) + $notifs = $this->formatNotifs($r, $ident); - return $arr; - } + $arr = array ( + 'notifications' => $notifs, + 'ident' => $ident, + 'total' => $total, + ); + + return $arr; } /** * @brief Total number of system notifications - * @param int $seen + * @param int|string $seen * If 0 only include notifications into the query - * which arn't marked as "seen" into + * which aren't marked as "seen" * @return int Number of system notifications */ private function systemTotal($seen = 0) { @@ -426,17 +433,21 @@ class NotificationsManager { /** * @brief Get system notifications * - * @param type $seen + * @param int|string $seen * If 0 only include notifications into the query - * which arn't marked as "seen" into + * which aren't marked as "seen" * @param int $start Start the query at this point * @param int $limit Maximum number of query results * - * @return array Query output + * @return array with + * string 'ident' => Notification identifier + * int 'total' => Total number of available system notifications + * array 'notifications' => System notifications */ - public function systemNotifs($seen = 0, $start = 0, $limit = 20) { + public function systemNotifs($seen = 0, $start = 0, $limit = 80) { $ident = 'system'; $total = $this->systemTotal($seen); + $notifs = array(); if($seen === 0) $sql_seen = " AND `seen` = 0 "; @@ -448,16 +459,16 @@ class NotificationsManager { intval($limit) ); - if(dbm::is_result($r)) { - $notifs = $this->format($r, $ident); - $arr = array ( - 'notifications' => $notifs, - 'ident' => $ident, - 'total' => $total, - ); + if(dbm::is_result($r)) + $notifs = $this->formatNotifs($r, $ident); - return $arr; - } + $arr = array ( + 'notifications' => $notifs, + 'ident' => $ident, + 'total' => $total, + ); + + return $arr; } /** @@ -481,9 +492,9 @@ class NotificationsManager { /** * @brief Total number of personal notifications - * @param int $seen + * @param int|string $seen * If 0 only include notifications into the query - * which arn't marked as "seen" into + * which aren't marked as "seen" * @return int Number of personal notifications */ private function personalTotal($seen = 0) { @@ -510,18 +521,22 @@ class NotificationsManager { /** * @brief Get personal notifications * - * @param type $seen + * @param int|string $seen * If 0 only include notifications into the query - * which arn't marked as "seen" into + * which aren't marked as "seen" * @param int $start Start the query at this point * @param int $limit Maximum number of query results * - * @return array Query output + * @return array with + * string 'ident' => Notification identifier + * int 'total' => Total number of available personal notifications + * array 'notifications' => Personal notifications */ - public function personalNotifs($seen = 0, $start = 0, $limit = 20) { + public function personalNotifs($seen = 0, $start = 0, $limit = 80) { $ident = 'personal'; - $total = 0; + $total = $this->personalTotal($seen); $sql_extra .= $this->_personal_sql_extra(); + $notifs = array(); if($seen === 0) $sql_seen = " AND `item`.`unseen` = 1 "; @@ -529,34 +544,34 @@ class NotificationsManager { $r = q("SELECT `item`.`id`,`item`.`parent`, `item`.`verb`, `item`.`author-name`, `item`.`unseen`, `item`.`author-link`, `item`.`author-avatar`, `item`.`created`, `item`.`object` AS `object`, `pitem`.`author-name` AS `pname`, `pitem`.`author-link` AS `plink`, `pitem`.`guid` AS `pguid`, - FROM `item` INNER JOIN `item` AS `pitem` ON `pitem`.`id`=`item`.`parent` - WHERE `item`.`visible` = 1 + FROM `item` INNER JOIN `item` AS `pitem` ON `pitem`.`id`=`item`.`parent` + WHERE `item`.`visible` = 1 $sql_extra $sql_seen AND `item`.`deleted` = 0 AND `item`.`uid` = %d AND `item`.`wall` = 0 - ORDER BY `item`.`created` DESC LIMIT %d, %d " , - intval(local_user()), - intval($start), - intval($limit) + ORDER BY `item`.`created` DESC LIMIT %d, %d " , + intval(local_user()), + intval($start), + intval($limit) ); - if(dbm::is_result($r)) { - $notifs = $this->format($r, $ident); - $arr = array ( - 'notifications' => $notifs, - 'ident' => $ident, - 'total' => $total, - ); + if(dbm::is_result($r)) + $notifs = $this->formatNotifs($r, $ident); + + $arr = array ( + 'notifications' => $notifs, + 'ident' => $ident, + 'total' => $total, + ); - return $arr; - } + return $arr; } /** * @brief Total number of home notifications - * @param int $seen + * @param int|string $seen * If 0 only include notifications into the query - * which arn't marked as "seen" into + * which aren't marked as "seen" * @return int Number of home notifications */ private function homeTotal($seen = 0) { @@ -579,45 +594,200 @@ class NotificationsManager { /** * @brief Get home notifications * - * @param type $seen + * @param int|string $seen * If 0 only include notifications into the query - * which arn't marked as "seen" into + * which aren't marked as "seen" * @param int $start Start the query at this point * @param int $limit Maximum number of query results * - * @return array Query output + * @return array with + * string 'ident' => Notification identifier + * int 'total' => Total number of available home notifications + * array 'notifications' => Home notifications */ - public function homeNotifs($seen = 0, $start = 0, $limit = 20) { + public function homeNotifs($seen = 0, $start = 0, $limit = 80) { $ident = 'home'; $total = $this->homeTotal($seen); + $notifs = array(); if($seen === 0) $sql_seen = " AND `item`.`unseen` = 1 "; - $total = $this->homeTotal($seen); - $r = q("SELECT `item`.`id`,`item`.`parent`, `item`.`verb`, `item`.`author-name`, `item`.`unseen`, `item`.`author-link`, `item`.`author-avatar`, `item`.`created`, `item`.`object` as `object`, `pitem`.`author-name` as `pname`, `pitem`.`author-link` as `plink`, `pitem`.`guid` as `pguid` - FROM `item` INNER JOIN `item` as `pitem` ON `pitem`.`id`=`item`.`parent` - WHERE `item`.`visible` = 1 AND + FROM `item` INNER JOIN `item` as `pitem` ON `pitem`.`id`=`item`.`parent` + WHERE `item`.`visible` = 1 AND `item`.`deleted` = 0 AND `item`.`uid` = %d AND `item`.`wall` = 1 $sql_seen - ORDER BY `item`.`created` DESC LIMIT %d, %d ", - intval(local_user()), - intval($start), - intval($limit) + ORDER BY `item`.`created` DESC LIMIT %d, %d ", + intval(local_user()), + intval($start), + intval($limit) ); - if(dbm::is_result($r)) { - $notifs = $this->format($r, $ident); - $arr = array ( - 'notifications' => $notifs, - 'ident' => $ident, - 'total' => $total, - ); + if(dbm::is_result($r)) + $notifs = $this->formatNotifs($r, $ident); - return $arr; + $arr = array ( + 'notifications' => $notifs, + 'ident' => $ident, + 'total' => $total, + ); + + return $arr; + } + + /** + * @brief Total number of introductions + * @param int $all + * If 0 only include introductions into the query + * which aren't marked as ignored + * @return int Number of introductions + */ + private function introTotal($all) { + if($all === 0) + $sql_extra = " AND `ignore` = 0 "; + + $r = q("SELECT COUNT(*) AS `total` FROM `intro` + WHERE `intro`.`uid` = %d $sql_extra AND `intro`.`blocked` = 0 ", + intval($_SESSION['uid']) + ); + + if(dbm::is_result($r)) + return $r[0]['total']; + + return 0; + } + + /** + * @brief Get introductions + * + * @param int $all + * If 0 only include introductions into the query + * which aren't marked as ignored + * @param int $start Start the query at this point + * @param int $limit Maximum number of query results + * + * @return array with + * string 'ident' => Notification identifier + * int 'total' => Total number of available introductions + * array 'notifications' => Introductions + */ + public function introNotifs($all = 0, $start = 0, $limit = 80) { + $ident = 'introductions'; + $total = $this->introTotal($seen); + $notifs = array(); + + if($all === 0) + $sql_extra = " AND `ignore` = 0 "; + + /// @todo Fetch contact details by "get_contact_details_by_url" instead of queries to contact, fcontact and gcontact + $r = q("SELECT `intro`.`id` AS `intro_id`, `intro`.*, `contact`.*, `fcontact`.`name` AS `fname`,`fcontact`.`url` AS `furl`,`fcontact`.`photo` AS `fphoto`,`fcontact`.`request` AS `frequest`, + `gcontact`.`location` AS `glocation`, `gcontact`.`about` AS `gabout`, + `gcontact`.`keywords` AS `gkeywords`, `gcontact`.`gender` AS `ggender`, + `gcontact`.`network` AS `gnetwork` + FROM `intro` + LEFT JOIN `contact` ON `contact`.`id` = `intro`.`contact-id` + LEFT JOIN `gcontact` ON `gcontact`.`nurl` = `contact`.`nurl` + LEFT JOIN `fcontact` ON `intro`.`fid` = `fcontact`.`id` + WHERE `intro`.`uid` = %d $sql_extra AND `intro`.`blocked` = 0 + LIMIT %d, %d", + intval($_SESSION['uid']), + intval($start), + intval($limit) + ); + + if(dbm::is_result($r)) + $notifs = $this->formatIntros($r); + + $arr = array ( + 'ident' => $ident, + 'total' => $total, + 'notifications' => $notifs, + ); + + return $arr; + } + + /** + * @brief Format the notification query in an usable array + * + * @param array $intros The array from the db query + * @return array with the introductions + */ + private function formatIntros($intros) { + $knowyou = ''; + + foreach($intros as $it) { + // There are two kind of introduction. Contacts suggested by other contacts and normal connection requests. + // We have to distinguish between these two because they use different data. + + // Contact suggestions + if($it['fid']) { + + $return_addr = bin2hex($this->a->user['nickname'] . '@' . $this->a->get_hostname() . (($this->a->path) ? '/' . $this->a->path : '')); + + $intro = array( + 'label' => 'friend_suggestion', + 'notify_type' => t('Friend Suggestion'), + 'intro_id' => $it['intro_id'], + 'madeby' => $it['name'], + 'contact_id' => $it['contact-id'], + 'photo' => ((x($it,'fphoto')) ? proxy_url($it['fphoto'], false, PROXY_SIZE_SMALL) : "images/person-175.jpg"), + 'name' => $it['fname'], + 'url' => zrl($it['furl']), + 'hidden' => $it['hidden'] == 1, + 'post_newfriend' => (intval(get_pconfig(local_user(),'system','post_newfriend')) ? '1' : 0), + + 'knowyou' => $knowyou, + 'note' => $it['note'], + 'request' => $it['frequest'] . '?addr=' . $return_addr, + + ); + + // Normal connection requests + } else { + + // Probe the contact url to get missing data + $ret = probe_url($it["url"]); + + if ($it['gnetwork'] == "") + $it['gnetwork'] = $ret["network"]; + + // Don't show these data until you are connected. Diaspora is doing the same. + if($it['gnetwork'] === NETWORK_DIASPORA) { + $it['glocation'] = ""; + $it['gabout'] = ""; + $it['ggender'] = ""; + } + $intro = array( + 'label' => (($it['network'] !== NETWORK_OSTATUS) ? 'friend_request' : 'follower'), + 'notify_type' => (($it['network'] !== NETWORK_OSTATUS) ? t('Friend/Connect Request') : t('New Follower')), + 'dfrn_id' => $it['issued-id'], + 'uid' => $_SESSION['uid'], + 'intro_id' => $it['intro_id'], + 'contact_id' => $it['contact-id'], + 'photo' => ((x($it,'photo')) ? proxy_url($it['photo'], false, PROXY_SIZE_SMALL) : "images/person-175.jpg"), + 'name' => $it['name'], + 'location' => bbcode($it['glocation'], false, false), + 'about' => bbcode($it['gabout'], false, false), + 'keywords' => $it['gkeywords'], + 'gender' => $it['ggender'], + 'hidden' => $it['hidden'] == 1, + 'post_newfriend' => (intval(get_pconfig(local_user(),'system','post_newfriend')) ? '1' : 0), + 'url' => $it['url'], + 'zrl' => zrl($it['url']), + 'addr' => $ret['addr'], + 'network' => $it['gnetwork'], + 'knowyou' => $it['knowyou'], + 'note' => $it['note'], + ); + } + + $arr[] = $intro; } + + return $arr; } } diff --git a/mod/notifications.php b/mod/notifications.php index a22703ba95..fd7f0c33de 100644 --- a/mod/notifications.php +++ b/mod/notifications.php @@ -1,8 +1,13 @@ getTabs(); $notif_content = array(); + + // Notification results per page $perpage = 20; $startrec = ($page * $perpage) - $perpage; + // Get introductions if( (($a->argc > 1) && ($a->argv[1] == 'intros')) || (($a->argc == 1))) { nav_set_selected('introductions'); + $notif_header = t('Notifications'); if(($a->argc > 2) && ($a->argv[2] == 'all')) - $sql_extra = ''; + $all = 1; else - $sql_extra = " AND `ignore` = 0 "; + $all = 0; - $notif_header = t('Notifications'); - $notif_tpl = get_markup_template('notifications.tpl'); + $notifs = $nm->introNotifs($all, $startrec, $perpage); + + // Get the network notifications + } else if (($a->argc > 1) && ($a->argv[1] == 'network')) { + + $notif_header = t('Network Notifications'); + $notifs = $nm->networkNotifs($show, $startrec, $perpage); + + // Get the system notifications + } else if (($a->argc > 1) && ($a->argv[1] == 'system')) { + + $notif_header = t('System Notifications'); + $notifs = $nm->systemNotifs($show, $startrec, $perpage); + + // Get the personal notifications + } else if (($a->argc > 1) && ($a->argv[1] == 'personal')) { + + $notif_header = t('Personal Notifications'); + $notifs = $nm->personalNotifs($show, $startrec, $perpage); + + // Get the home notifications + } else if (($a->argc > 1) && ($a->argv[1] == 'home')) { + + $notif_header = t('Home Notifications'); + $notifs = $nm->homeNotifs($show, $startrec, $perpage); + + } + // Set the pager + $a->set_pager_total($notifs['total']); + $a->set_pager_itemspage($perpage); + + // Add additional informations (needed for json output) + $notifs['items_page'] = $a->pager['itemspage']; + $notifs['page'] = $a->pager['page']; + + // Json output + if(intval($json) === 1) + json_return_and_die($notifs); + + $notif_tpl = get_markup_template('notifications.tpl'); + + // Process the data for template creation + if($notifs['ident'] === 'introductions') { + + $sugg = get_markup_template('suggestions.tpl'); + $tpl = get_markup_template("intros.tpl"); + + // The link to switch between ignored and normal connection requests $notif_show_lnk = array( - 'href' => ((strlen($sql_extra)) ? 'notifications/intros/all' : 'notifications/intros' ), - 'text' => ((strlen($sql_extra)) ? t('Show Ignored Requests') : t('Hide Ignored Requests')), - 'id' => "notifications-show-hide-link", + 'href' => ($all === 0 ? 'notifications/intros/all' : 'notifications/intros' ), + 'text' => ($all === 0 ? t('Show Ignored Requests') : t('Hide Ignored Requests')) ); - $r = q("SELECT COUNT(*) AS `total` FROM `intro` - WHERE `intro`.`uid` = %d $sql_extra AND `intro`.`blocked` = 0 ", - intval($_SESSION['uid']) - ); - if(dbm::is_result($r)) { - $a->set_pager_total($r[0]['total']); - $a->set_pager_itemspage($perpage); - } - - /// @todo Fetch contact details by "get_contact_details_by_url" instead of queries to contact, fcontact and gcontact - - $r = q("SELECT `intro`.`id` AS `intro_id`, `intro`.*, `contact`.*, `fcontact`.`name` AS `fname`,`fcontact`.`url` AS `furl`,`fcontact`.`photo` AS `fphoto`,`fcontact`.`request` AS `frequest`, - `gcontact`.`location` AS `glocation`, `gcontact`.`about` AS `gabout`, - `gcontact`.`keywords` AS `gkeywords`, `gcontact`.`gender` AS `ggender`, - `gcontact`.`network` AS `gnetwork` - FROM `intro` - LEFT JOIN `contact` ON `contact`.`id` = `intro`.`contact-id` - LEFT JOIN `gcontact` ON `gcontact`.`nurl` = `contact`.`nurl` - LEFT JOIN `fcontact` ON `intro`.`fid` = `fcontact`.`id` - WHERE `intro`.`uid` = %d $sql_extra AND `intro`.`blocked` = 0 ", - intval($_SESSION['uid'])); - - if(dbm::is_result($r)) { - - $sugg = get_markup_template('suggestions.tpl'); - $tpl = get_markup_template("intros.tpl"); - - foreach($r as $rr) { - - if($rr['fid']) { - - $return_addr = bin2hex($a->user['nickname'] . '@' . $a->get_hostname() . (($a->path) ? '/' . $a->path : '')); + // Loop through all introduction notifications.This creates an array with the output html for each + // introduction + foreach ($notifs['notifications'] as $it) { + // There are two kind of introduction. Contacts suggested by other contacts and normal connection requests. + // We have to distinguish between these two because they use different data. + switch ($it['label']) { + case 'friend_suggestion': $notif_content[] = replace_macros($sugg, array( '$str_notifytype' => t('Notification type: '), - '$notify_type' => t('Friend Suggestion'), - '$intro_id' => $rr['intro_id'], - '$madeby' => sprintf( t('suggested by %s'),$rr['name']), - '$contact_id' => $rr['contact-id'], - '$photo' => ((x($rr,'fphoto')) ? proxy_url($rr['fphoto'], false, PROXY_SIZE_SMALL) : "images/person-175.jpg"), - '$fullname' => $rr['fname'], - '$url' => zrl($rr['furl']), - '$hidden' => array('hidden', t('Hide this contact from others'), ($rr['hidden'] == 1), ''), - '$activity' => array('activity', t('Post a new friend activity'), (intval(get_pconfig(local_user(),'system','post_newfriend')) ? '1' : 0), t('if applicable')), + '$notify_type' => $it['notify_type'], + '$intro_id' => $it['intro_id'], + '$madeby' => sprintf( t('suggested by %s'),$it['madeby']), + '$contact_id' => $it['contact-id'], + '$photo' => $it['photo'], + '$fullname' => $it['name'], + '$url' => $it['url'], + '$hidden' => array('hidden', t('Hide this contact from others'), ($it['hidden'] == 1), ''), + '$activity' => array('activity', t('Post a new friend activity'), $it['post_newfriend'], t('if applicable')), - '$knowyou' => $knowyou, + '$knowyou' => $it['knowyou'], '$approve' => t('Approve'), - '$note' => $rr['note'], - '$request' => $rr['frequest'] . '?addr=' . $return_addr, + '$note' => $it['note'], + '$request' => $it['request'], '$ignore' => t('Ignore'), '$discard' => t('Discard'), - )); + break; - continue; + // Normal connection requests + default: + $friend_selected = (($it['network'] !== NETWORK_OSTATUS) ? ' checked="checked" ' : ' disabled '); + $fan_selected = (($it['network'] === NETWORK_OSTATUS) ? ' checked="checked" disabled ' : ''); + $dfrn_tpl = get_markup_template('netfriend.tpl'); - } - $friend_selected = (($rr['network'] !== NETWORK_OSTATUS) ? ' checked="checked" ' : ' disabled '); - $fan_selected = (($rr['network'] === NETWORK_OSTATUS) ? ' checked="checked" disabled ' : ''); - $dfrn_tpl = get_markup_template('netfriend.tpl'); + $knowyou = ''; + $dfrn_text = ''; - $knowyou = ''; - $dfrn_text = ''; - - if($rr['network'] === NETWORK_DFRN || $rr['network'] === NETWORK_DIASPORA) { - if($rr['network'] === NETWORK_DFRN) { - $lbl_knowyou = t('Claims to be known to you: '); - $knowyou = (($rr['knowyou']) ? t('yes') : t('no')); - $helptext = t('Shall your connection be bidirectional or not? "Friend" implies that you allow to read and you subscribe to their posts. "Fan/Admirer" means that you allow to read but you do not want to read theirs. Approve as: '); - } else { - $knowyou = ''; - $helptext = t('Shall your connection be bidirectional or not? "Friend" implies that you allow to read and you subscribe to their posts. "Sharer" means that you allow to read but you do not want to read theirs. Approve as: '); + if($it['network'] === NETWORK_DFRN || $it['network'] === NETWORK_DIASPORA) { + if($it['network'] === NETWORK_DFRN) { + $lbl_knowyou = t('Claims to be known to you: '); + $knowyou = (($it['knowyou']) ? t('yes') : t('no')); + $helptext = t('Shall your connection be bidirectional or not? "Friend" implies that you allow to read and you subscribe to their posts. "Fan/Admirer" means that you allow to read but you do not want to read theirs. Approve as: '); + } else { + $knowyou = ''; + $helptext = t('Shall your connection be bidirectional or not? "Friend" implies that you allow to read and you subscribe to their posts. "Sharer" means that you allow to read but you do not want to read theirs. Approve as: '); + } } $dfrn_text = replace_macros($dfrn_tpl,array( - '$intro_id' => $rr['intro_id'], + '$intro_id' => $it['intro_id'], '$friend_selected' => $friend_selected, '$fan_selected' => $fan_selected, '$approve_as' => $helptext, '$as_friend' => t('Friend'), - '$as_fan' => (($rr['network'] == NETWORK_DIASPORA) ? t('Sharer') : t('Fan/Admirer')) + '$as_fan' => (($it['network'] == NETWORK_DIASPORA) ? t('Sharer') : t('Fan/Admirer')) )); - } - $header = $rr["name"]; + $header = $it["name"]; - $ret = probe_url($rr["url"]); + if ($it["addr"] != "") + $header .= " <".$it["addr"].">"; - if ($rr['gnetwork'] == "") - $rr['gnetwork'] = $ret["network"]; + $header .= " (".network_to_name($it['network'], $it['url']).")"; - if ($ret["addr"] != "") - $header .= " <".$ret["addr"].">"; + $notif_content[] = replace_macros($tpl, array( + '$header' => htmlentities($header), + '$str_notifytype' => t('Notification type: '), + '$notify_type' => $it['notify_type'], + '$dfrn_text' => $dfrn_text, + '$dfrn_id' => $it['dfrn_id'], + '$uid' => $it['uid'], + '$intro_id' => $it['intro_id'], + '$contact_id' => $it['contact_id'], + '$photo' => $it['photo'], + '$fullname' => $it['name'], + '$location' => $it['location'], + '$lbl_location' => t('Location:'), + '$about' => $it['about'], + '$lbl_about' => t('About:'), + '$keywords' => $it['keywords'], + '$lbl_keywords' => t('Tags:'), + '$gender' => $it['gender'], + '$lbl_gender' => t('Gender:'), + '$hidden' => array('hidden', t('Hide this contact from others'), ($it['hidden'] == 1), ''), + '$activity' => array('activity', t('Post a new friend activity'), $it['post_newfriend'], t('if applicable')), + '$url' => $it['url'], + '$zrl' => $it['zrl'], + '$lbl_url' => t('Profile URL'), + '$addr' => $it['addr'], + '$lbl_knowyou' => $lbl_knowyou, + '$lbl_network' => t('Network:'), + '$network' => network_to_name($it['network'], $it['url']), + '$knowyou' => $knowyou, + '$approve' => t('Approve'), + '$note' => $it['note'], + '$ignore' => t('Ignore'), + '$discard' => t('Discard'), - $header .= " (".network_to_name($rr['gnetwork'], $rr['url']).")"; - - // Don't show these data until you are connected. Diaspora is doing the same. - if($rr['gnetwork'] === NETWORK_DIASPORA) { - $rr['glocation'] = ""; - $rr['gabout'] = ""; - $rr['ggender'] = ""; - } - - $notif_content[] = replace_macros($tpl, array( - '$header' => htmlentities($header), - '$str_notifytype' => t('Notification type: '), - '$notify_type' => (($rr['network'] !== NETWORK_OSTATUS) ? t('Friend/Connect Request') : t('New Follower')), - '$dfrn_text' => $dfrn_text, - '$dfrn_id' => $rr['issued-id'], - '$uid' => $_SESSION['uid'], - '$intro_id' => $rr['intro_id'], - '$contact_id' => $rr['contact-id'], - '$photo' => ((x($rr,'photo')) ? proxy_url($rr['photo'], false, PROXY_SIZE_SMALL) : "images/person-175.jpg"), - '$fullname' => $rr['name'], - '$location' => bbcode($rr['glocation'], false, false), - '$location_label' => t('Location:'), - '$about' => bbcode($rr['gabout'], false, false), - '$about_label' => t('About:'), - '$keywords' => $rr['gkeywords'], - '$keywords_label' => t('Tags:'), - '$gender' => $rr['ggender'], - '$gender_label' => t('Gender:'), - '$hidden' => array('hidden', t('Hide this contact from others'), ($rr['hidden'] == 1), ''), - '$activity' => array('activity', t('Post a new friend activity'), (intval(get_pconfig(local_user(),'system','post_newfriend')) ? '1' : 0), t('if applicable')), - '$url' => $rr['url'], - '$zrl' => zrl($rr['url']), - '$url_label' => t('Profile URL'), - '$addr' => $rr['addr'], - '$lbl_knowyou' => $lbl_knowyou, - '$lbl_network' => t('Network:'), - '$network' => network_to_name($rr['gnetwork'], $rr['url']), - '$knowyou' => $knowyou, - '$approve' => t('Approve'), - '$note' => $rr['note'], - '$ignore' => t('Ignore'), - '$discard' => t('Discard'), - - )); + )); + break; } } - else + + if($notifs['total'] == 0) info( t('No introductions.') . EOL); - } else if (($a->argc > 1) && ($a->argv[1] == 'network')) { - - $notif_header = t('Network Notifications'); - $notif_tpl = get_markup_template('notifications.tpl'); - - $notifs = $nm->networkNotifs($show, $startrec, $perpage); - - $notif_show_lnk = array( - 'href' => ($show ? 'notifications/network' : 'notifications/network?show=all' ), - 'text' => ($show ? t('Show unread') : t('Show all')), - ); - - if(!dbm::is_result($notifs)) { - if($show) - $notif_show_lnk = array(); - - $notif_nocontent = t('No more network notifications.'); - } - - } else if (($a->argc > 1) && ($a->argv[1] == 'system')) { - - $notif_header = t('System Notifications'); - $notif_tpl = get_markup_template('notifications.tpl'); - - $notifs = $nm->systemNotifs($show, $startrec, $perpage); - - $notif_show_lnk = array( - 'href' => ($show ? 'notifications/system' : 'notifications/system?show=all' ), - 'text' => ($show ? t('Show unread') : t('Show all')), - ); - - if(!dbm::is_result($notifs)) { - if($show) - $notif_show_lnk = array(); - - $notif_nocontent = t('No more system notifications.'); - } - - } else if (($a->argc > 1) && ($a->argv[1] == 'personal')) { - - $notif_header = t('Personal Notifications'); - $notif_tpl = get_markup_template('notifications.tpl'); - - $notifs = $nm->personalNotifs($show, $startrec, $perpage); - - $notif_show_lnk = array( - 'href' => ($show ? 'notifications/personal' : 'notifications/personal?show=all' ), - 'text' => ($show ? t('Show unread') : t('Show all')), - ); - - if(!dbm::is_result($notifs)) { - if($show) - $notif_show_lnk = array(); - - $notif_nocontent = t('No more personal notifications.'); - } - - } else if (($a->argc > 1) && ($a->argv[1] == 'home')) { - - $notif_header = t('Home Notifications'); - $notif_tpl = get_markup_template('notifications.tpl'); - - $notifs = $nm->homeNotifs($show, $startrec, $perpage); - - $notif_show_lnk = array( - 'href' => ($show ? 'notifications/home' : 'notifications/home?show=all' ), - 'text' => ($show ? t('Show unread') : t('Show all')), - ); - - if(!dbm::is_result($notifs)) { - if($show) - $notif_show_lnk = array(); - - $notif_nocontent = t('No more home notifications.'); - } - - } - - if(count($notifs['notifications']) > 0 ) { - // set the pager - $a->set_pager_total($notifs['total']); - $a->set_pager_itemspage($perpage); - - // add additional informations (needed for json output) - $notifs['items_page'] = $a->pager['itemspage']; - $notifs['page'] = $a->pager['page']; + // Normal notifications (no introductions) + } else { // The template files we need in different cases for formatting the content $tpl_item_like = 'notifications_likes_item.tpl'; @@ -342,11 +276,15 @@ function notifications_content(&$a) { $tpl_item_post = 'notifications_posts_item.tpl'; $tpl_item_notify = 'notify.tpl'; + // Loop trough ever notification This creates an array with the output html for each + // notification and apply the correct template according to the notificationtype (label). foreach ($notifs['notifications'] as $it) { - $tplname = 'tpl_item_'.$it['label']; - $templ = get_markup_template($$tplname); - $notif_content[] = replace_macros($templ,array( + // We use the notification label to get the correct template file + $tpl_var_name = 'tpl_item_'.$it['label']; + $tpl_notif = get_markup_template($$tpl_var_name); + + $notif_content[] = replace_macros($tpl_notif,array( '$item_label' => $it['label'], '$item_link' => $it['link'], '$item_image' => $it['image'], @@ -356,8 +294,21 @@ function notifications_content(&$a) { )); } + // It doesn't make sense to show the Show unread / Show all link visible if the user is on the + // "Show all" page and there are no notifications. So we will hide it. + if($show == 0 || intval($show) && $notifs['total'] > 0) { + $notif_show_lnk = array( + 'href' => ($show ? 'notifications/'.$notifs['ident'] : 'notifications/'.$notifs['ident'].'?show=all' ), + 'text' => ($show ? t('Show unread') : t('Show all')), + ); + } + + // Output if there aren't any notifications available + if($notifs['total'] == 0) + $notif_nocontent = sprintf( t('No more %s notifications.'), $notifs['ident']); } + $o .= replace_macros($notif_tpl, array( '$notif_header' => $notif_header, '$tabs' => $tabs,