X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FContent%2FConversation.php;h=04cdab4785e50b0e5efefbdddb322fe8b015e963;hb=65b86fe0d556829c09e8c8f5c707b868ad37dfe1;hp=1dca3216439b4930e07690d21061c2c4956188ff;hpb=26fa5e8b3fd91a6cc8cebfd895d0080660aa28f5;p=friendica.git diff --git a/src/Content/Conversation.php b/src/Content/Conversation.php index 1dca321643..04cdab4785 100644 --- a/src/Content/Conversation.php +++ b/src/Content/Conversation.php @@ -1,6 +1,6 @@ activity = $activity; $this->item = $item; @@ -111,6 +109,8 @@ class Conversation */ public function builtinActivityPuller(array $activity, array &$conv_responses) { + $thread_parent = $activity['thr-parent-row'] ?? []; + foreach ($conv_responses as $mode => $v) { $sparkle = ''; @@ -139,10 +139,10 @@ class Conversation if (!empty($activity['verb']) && $this->activity->match($activity['verb'], $verb) && ($activity['gravity'] != GRAVITY_PARENT)) { $author = [ - 'uid' => 0, - 'id' => $activity['author-id'], + 'uid' => 0, + 'id' => $activity['author-id'], 'network' => $activity['author-network'], - 'url' => $activity['author-link'] + 'url' => $activity['author-link'] ]; $url = Contact::magicLinkByContact($author); if (strpos($url, 'redir/') === 0) { @@ -155,16 +155,15 @@ class Conversation $activity['thr-parent-id'] = $activity['parent-uri-id']; } - // Skip when the causer of the parent is the same than the author of the announce - if (($verb == Activity::ANNOUNCE) && Post::exists(['uri-id' => $activity['thr-parent-id'], - 'uid' => $activity['uid'], 'causer-id' => $activity['author-id'], 'gravity' => GRAVITY_PARENT])) { + // Skip when the causer of the parent is the same as the author of the announce + if (($verb == Activity::ANNOUNCE) && !empty($thread_parent['causer-id'] && ($thread_parent['causer-id'] == $activity['author-id']))) { continue; } if (!isset($conv_responses[$mode][$activity['thr-parent-id']])) { $conv_responses[$mode][$activity['thr-parent-id']] = [ 'links' => [], - 'self' => 0, + 'self' => 0, ]; } elseif (in_array($link, $conv_responses[$mode][$activity['thr-parent-id']]['links'])) { // only list each unique author once @@ -192,11 +191,12 @@ class Conversation * @return string formatted text * @throws \Friendica\Network\HTTPException\InternalServerErrorException */ - public function formatActivity(array $links, $verb, $id) { + public function formatActivity(array $links, $verb, $id) + { $this->profiler->startRecording('rendering'); - $o = ''; + $o = ''; $expanded = ''; - $phrase = ''; + $phrase = ''; $total = count($links); if ($total == 1) { @@ -205,32 +205,32 @@ class Conversation // Phrase if there is only one liker. In other cases it will be uses for the expanded // list which show all likers switch ($verb) { - case 'like' : + case 'like': $phrase = $this->l10n->t('%s likes this.', $likers); break; - case 'dislike' : + case 'dislike': $phrase = $this->l10n->t('%s doesn\'t like this.', $likers); break; - case 'attendyes' : + case 'attendyes': $phrase = $this->l10n->t('%s attends.', $likers); break; - case 'attendno' : + case 'attendno': $phrase = $this->l10n->t('%s doesn\'t attend.', $likers); break; - case 'attendmaybe' : + case 'attendmaybe': $phrase = $this->l10n->t('%s attends maybe.', $likers); break; - case 'announce' : + case 'announce': $phrase = $this->l10n->t('%s reshared this.', $likers); break; } } elseif ($total > 1) { - if ($total < MAX_LIKERS) { + if ($total < $this->config->get('system', 'max_likers')) { $likers = implode(', ', array_slice($links, 0, -1)); - $likers .= ' ' . $this->l10n->t('and') . ' ' . $links[count($links)-1]; - } else { - $likers = implode(', ', array_slice($links, 0, MAX_LIKERS - 1)); - $likers .= ' ' . $this->l10n->t('and %d other people', $total - MAX_LIKERS); + $likers .= ' ' . $this->l10n->t('and') . ' ' . $links[count($links) - 1]; + } else { + $likers = implode(', ', array_slice($links, 0, $this->config->get('system', 'max_likers') - 1)); + $likers .= ' ' . $this->l10n->t('and %d other people', $total - $this->config->get('system', 'max_likers')); } $spanatts = "class=\"fakelink\" onclick=\"openClose('{$verb}list-$id');\""; @@ -238,27 +238,27 @@ class Conversation $explikers = ''; switch ($verb) { case 'like': - $phrase = $this->l10n->t('%2$d people like this', $spanatts, $total); + $phrase = $this->l10n->t('%2$d people like this', $spanatts, $total); $explikers = $this->l10n->t('%s like this.', $likers); break; case 'dislike': - $phrase = $this->l10n->t('%2$d people don\'t like this', $spanatts, $total); + $phrase = $this->l10n->t('%2$d people don\'t like this', $spanatts, $total); $explikers = $this->l10n->t('%s don\'t like this.', $likers); break; case 'attendyes': - $phrase = $this->l10n->t('%2$d people attend', $spanatts, $total); + $phrase = $this->l10n->t('%2$d people attend', $spanatts, $total); $explikers = $this->l10n->t('%s attend.', $likers); break; case 'attendno': - $phrase = $this->l10n->t('%2$d people don\'t attend', $spanatts, $total); + $phrase = $this->l10n->t('%2$d people don\'t attend', $spanatts, $total); $explikers = $this->l10n->t('%s don\'t attend.', $likers); break; case 'attendmaybe': - $phrase = $this->l10n->t('%2$d people attend maybe', $spanatts, $total); + $phrase = $this->l10n->t('%2$d people attend maybe', $spanatts, $total); $explikers = $this->l10n->t('%s attend maybe.', $likers); break; case 'announce': - $phrase = $this->l10n->t('%2$d people reshared this', $spanatts, $total); + $phrase = $this->l10n->t('%2$d people reshared this', $spanatts, $total); $explikers = $this->l10n->t('%s reshared this.', $likers); break; } @@ -268,8 +268,8 @@ class Conversation $o .= Renderer::replaceMacros(Renderer::getMarkupTemplate('voting_fakelink.tpl'), [ '$phrase' => $phrase, - '$type' => $verb, - '$id' => $id + '$type' => $verb, + '$id' => $id ]); $o .= $expanded; @@ -318,42 +318,55 @@ class Conversation $jotplugins = ''; Hook::callAll('jot_tool', $jotplugins); + if ($this->config->get('system', 'set_creation_date')) { + $created_at = Temporal::getDateTimeField( + new \DateTime(DBA::NULL_DATETIME), + new \DateTime('now'), + null, + $this->l10n->t('Created at'), + 'created_at' + ); + } else { + $created_at = ''; + } + $tpl = Renderer::getMarkupTemplate("jot.tpl"); $o .= Renderer::replaceMacros($tpl, [ - '$new_post' => $this->l10n->t('New Post'), - '$return_path' => $this->args->getQueryString(), - '$action' => 'item', - '$share' => ($x['button'] ?? '') ?: $this->l10n->t('Share'), - '$loading' => $this->l10n->t('Loading...'), - '$upload' => $this->l10n->t('Upload photo'), - '$shortupload' => $this->l10n->t('upload photo'), - '$attach' => $this->l10n->t('Attach file'), - '$shortattach' => $this->l10n->t('attach file'), - '$edbold' => $this->l10n->t('Bold'), - '$editalic' => $this->l10n->t('Italic'), - '$eduline' => $this->l10n->t('Underline'), - '$edquote' => $this->l10n->t('Quote'), - '$edcode' => $this->l10n->t('Code'), - '$edimg' => $this->l10n->t('Image'), - '$edurl' => $this->l10n->t('Link'), - '$edattach' => $this->l10n->t('Link or Media'), - '$edvideo' => $this->l10n->t('Video'), - '$setloc' => $this->l10n->t('Set your location'), - '$shortsetloc' => $this->l10n->t('set location'), - '$noloc' => $this->l10n->t('Clear browser location'), - '$shortnoloc' => $this->l10n->t('clear location'), - '$title' => $x['title'] ?? '', - '$placeholdertitle' => $this->l10n->t('Set title'), - '$category' => $x['category'] ?? '', + '$new_post' => $this->l10n->t('New Post'), + '$return_path' => $this->args->getQueryString(), + '$action' => 'item', + '$share' => ($x['button'] ?? '') ?: $this->l10n->t('Share'), + '$loading' => $this->l10n->t('Loading...'), + '$upload' => $this->l10n->t('Upload photo'), + '$shortupload' => $this->l10n->t('upload photo'), + '$attach' => $this->l10n->t('Attach file'), + '$shortattach' => $this->l10n->t('attach file'), + '$edbold' => $this->l10n->t('Bold'), + '$editalic' => $this->l10n->t('Italic'), + '$eduline' => $this->l10n->t('Underline'), + '$edquote' => $this->l10n->t('Quote'), + '$edcode' => $this->l10n->t('Code'), + '$edimg' => $this->l10n->t('Image'), + '$edurl' => $this->l10n->t('Link'), + '$edattach' => $this->l10n->t('Link or Media'), + '$edvideo' => $this->l10n->t('Video'), + '$setloc' => $this->l10n->t('Set your location'), + '$shortsetloc' => $this->l10n->t('set location'), + '$noloc' => $this->l10n->t('Clear browser location'), + '$shortnoloc' => $this->l10n->t('clear location'), + '$title' => $x['title'] ?? '', + '$placeholdertitle' => $this->l10n->t('Set title'), + '$category' => $x['category'] ?? '', '$placeholdercategory' => Feature::isEnabled(local_user(), 'categories') ? $this->l10n->t("Categories \x28comma-separated list\x29") : '', - '$scheduled_at' => Temporal::getDateTimeField( + '$scheduled_at' => Temporal::getDateTimeField( new \DateTime(), new \DateTime('now + 6 months'), null, $this->l10n->t('Scheduled at'), 'scheduled_at' ), + '$created_at' => $created_at, '$wait' => $this->l10n->t('Please wait'), '$permset' => $this->l10n->t('Permission settings'), '$shortpermset' => $this->l10n->t('Permissions'), @@ -376,7 +389,7 @@ class Conversation '$rand_num' => Crypto::randomDigits(12), // ACL permissions box - '$acl' => $x['acl'], + '$acl' => $x['acl'], //jot nav tab (used in some themes) '$message' => $this->l10n->t('Message'), @@ -456,7 +469,7 @@ class Conversation . "'; \r\n"; } } elseif ($mode === 'profile') { - $items = $this->addChildren($items, false, $order, local_user()); + $items = $this->addChildren($items, false, $order, $uid); if (!$update) { $tab = !empty($_GET['tab']) ? trim($_GET['tab']) : 'posts'; @@ -535,10 +548,10 @@ class Conversation } // array with html for each thread (parent+comments) - $threads = []; + $threads = []; $threadsid = -1; - $page_template = Renderer::getMarkupTemplate("conversation.tpl"); + $page_template = Renderer::getMarkupTemplate("conversation.tpl"); $formSecurityToken = BaseModule::getFormSecurityToken('contact_action'); if (!empty($items)) { @@ -592,8 +605,7 @@ class Conversation $tags = Tag::populateFromItem($item); - $author = ['uid' => 0, 'id' => $item['author-id'], - 'network' => $item['author-network'], 'url' => $item['author-link']]; + $author = ['uid' => 0, 'id' => $item['author-id'], 'network' => $item['author-network'], 'url' => $item['author-link']]; $profile_link = Contact::magicLinkByContact($author); $sparkle = ''; @@ -615,8 +627,8 @@ class Conversation $drop = [ 'dropping' => $dropping, 'pagedrop' => $page_dropping, - 'select' => $this->l10n->t('Select'), - 'delete' => $this->l10n->t('Delete'), + 'select' => $this->l10n->t('Select'), + 'delete' => $this->l10n->t('Delete'), ]; $likebuttons = [ @@ -632,74 +644,83 @@ class Conversation $body_html = ItemModel::prepareBody($item, true, $preview); - list($categories, $folders) = $this->item->determineCategoriesTerms($item, local_user()); + [$categories, $folders] = $this->item->determineCategoriesTerms($item, local_user()); - if (!empty($item['content-warning']) && $this->pConfig->get(local_user(), 'system', 'disable_cw', false)) { + if (!empty($item['title'])) { + $title = $item['title']; + } elseif (!empty($item['content-warning']) && $this->pConfig->get(local_user(), 'system', 'disable_cw', false)) { $title = ucfirst($item['content-warning']); } else { - $title = $item['title']; + $title = ''; + } + + if (!empty($item['featured'])) { + $pinned = $this->l10n->t('Pinned item'); + } else { + $pinned = ''; } $tmp_item = [ - 'template' => $tpl, - 'id' => ($preview ? 'P0' : $item['id']), - 'guid' => ($preview ? 'Q0' : $item['guid']), - 'commented' => $item['commented'], - 'received' => $item['received'], - 'created_date' => $item['created'], - 'uriid' => $item['uri-id'], - 'network' => $item['network'], - 'network_name' => ContactSelector::networkToName($item['author-network'], $item['author-link'], $item['network']), - 'network_icon' => ContactSelector::networkToIcon($item['network'], $item['author-link']), - 'linktitle' => $this->l10n->t('View %s\'s profile @ %s', $profile_name, $item['author-link']), - 'profile_url' => $profile_link, + 'template' => $tpl, + 'id' => ($preview ? 'P0' : $item['id']), + 'guid' => ($preview ? 'Q0' : $item['guid']), + 'commented' => $item['commented'], + 'received' => $item['received'], + 'created_date' => $item['created'], + 'uriid' => $item['uri-id'], + 'network' => $item['network'], + 'network_name' => ContactSelector::networkToName($item['author-network'], $item['author-link'], $item['network'], $item['author-gsid']), + 'network_icon' => ContactSelector::networkToIcon($item['network'], $item['author-link'], $item['author-gsid']), + 'linktitle' => $this->l10n->t('View %s\'s profile @ %s', $profile_name, $item['author-link']), + 'profile_url' => $profile_link, 'item_photo_menu_html' => $this->item->photoMenu($item, $formSecurityToken), - 'name' => $profile_name, - 'sparkle' => $sparkle, - 'lock' => false, - 'thumb' => $this->baseURL->remove(Contact::getAvatarUrlForUrl($item['author-link'], $item['uid'], Proxy::SIZE_THUMB)), - 'title' => $title, - 'body_html' => $body_html, - 'tags' => $tags['tags'], - 'hashtags' => $tags['hashtags'], - 'mentions' => $tags['mentions'], - 'implicit_mentions' => $tags['implicit_mentions'], - 'txt_cats' => $this->l10n->t('Categories:'), - 'txt_folders' => $this->l10n->t('Filed under:'), - 'has_cats' => ((count($categories)) ? 'true' : ''), - 'has_folders' => ((count($folders)) ? 'true' : ''), - 'categories' => $categories, - 'folders' => $folders, - 'text' => strip_tags($body_html), - 'localtime' => DateTimeFormat::local($item['created'], 'r'), - 'ago' => (($item['app']) ? $this->l10n->t('%s from %s', Temporal::getRelativeDate($item['created']), $item['app']) : Temporal::getRelativeDate($item['created'])), - 'location_html' => $location_html, - 'indent' => '', - 'owner_name' => '', - 'owner_url' => '', - 'owner_photo' => $this->baseURL->remove(Contact::getAvatarUrlForUrl($item['owner-link'], $item['uid'], Proxy::SIZE_THUMB)), - 'plink' => ItemModel::getPlink($item), - 'edpost' => false, - 'isstarred' => 'unstarred', - 'star' => false, - 'drop' => $drop, - 'vote' => $likebuttons, - 'like_html' => '', - 'dislike_html' => '', - 'comment_html' => '', - 'conv' => (($preview) ? '' : ['href'=> 'display/'.$item['guid'], 'title'=> $this->l10n->t('View in context')]), - 'previewing' => $previewing, - 'wait' => $this->l10n->t('Please wait'), - 'thread_level' => 1, + 'name' => $profile_name, + 'sparkle' => $sparkle, + 'lock' => false, + 'thumb' => $this->baseURL->remove($this->item->getAuthorAvatar($item)), + 'title' => $title, + 'body_html' => $body_html, + 'tags' => $tags['tags'], + 'hashtags' => $tags['hashtags'], + 'mentions' => $tags['mentions'], + 'implicit_mentions' => $tags['implicit_mentions'], + 'txt_cats' => $this->l10n->t('Categories:'), + 'txt_folders' => $this->l10n->t('Filed under:'), + 'has_cats' => ((count($categories)) ? 'true' : ''), + 'has_folders' => ((count($folders)) ? 'true' : ''), + 'categories' => $categories, + 'folders' => $folders, + 'text' => strip_tags($body_html), + 'localtime' => DateTimeFormat::local($item['created'], 'r'), + 'utc' => DateTimeFormat::utc($item['created'], 'c'), + 'ago' => (($item['app']) ? $this->l10n->t('%s from %s', Temporal::getRelativeDate($item['created']), $item['app']) : Temporal::getRelativeDate($item['created'])), + 'location_html' => $location_html, + 'indent' => '', + 'owner_name' => '', + 'owner_url' => '', + 'owner_photo' => $this->baseURL->remove($this->item->getOwnerAvatar($item)), + 'plink' => ItemModel::getPlink($item), + 'edpost' => false, + 'pinned' => $pinned, + 'isstarred' => 'unstarred', + 'star' => false, + 'drop' => $drop, + 'vote' => $likebuttons, + 'like_html' => '', + 'dislike_html ' => '', + 'comment_html' => '', + 'conv' => ($preview ? '' : ['href' => 'display/' . $item['guid'], 'title' => $this->l10n->t('View in context')]), + 'previewing' => $previewing, + 'wait' => $this->l10n->t('Please wait'), + 'thread_level' => 1, ]; $arr = ['item' => $item, 'output' => $tmp_item]; Hook::callAll('display_item', $arr); - $threads[$threadsid]['id'] = $item['id']; + $threads[$threadsid]['id'] = $item['id']; $threads[$threadsid]['network'] = $item['network']; - $threads[$threadsid]['items'] = [$arr['output']]; - + $threads[$threadsid]['items'] = [$arr['output']]; } } else { // Normal View @@ -750,14 +771,14 @@ class Conversation } $o = Renderer::replaceMacros($page_template, [ - '$baseurl' => $this->baseURL->get($ssl_state), + '$baseurl' => $this->baseURL->get($ssl_state), '$return_path' => $this->args->getQueryString(), '$live_update' => $live_update_div, - '$remove' => $this->l10n->t('remove'), - '$mode' => $mode, - '$update' => $update, - '$threads' => $threads, - '$dropping' => ($page_dropping ? $this->l10n->t('Delete Selected Items') : False), + '$remove' => $this->l10n->t('remove'), + '$mode' => $mode, + '$update' => $update, + '$threads' => $threads, + '$dropping' => ($page_dropping ? $this->l10n->t('Delete Selected Items') : false), ]); $this->profiler->stopRecording(); @@ -790,12 +811,14 @@ class Conversation /** * Adds some information (Causer, post reason, direction) to the fetched post row. * - * @param array $row Post row - * @param array $activity Contact data of the resharer + * @param array $row Post row + * @param array $activity Contact data of the resharer + * @param array $thr_parent Thread parent row * * @return array items with parents and comments */ - private function addRowInformation(array $row, array $activity) { + private function addRowInformation(array $row, array $activity, array $thr_parent) + { $this->profiler->startRecording('rendering'); if ($row['uid'] == 0) { @@ -805,11 +828,13 @@ class Conversation if (!empty($activity)) { if (($row['gravity'] == GRAVITY_PARENT)) { $row['post-reason'] = ItemModel::PR_ANNOUNCEMENT; - $row = array_merge($row, $activity); + + $row = array_merge($row, $activity); $contact = Contact::getById($activity['causer-id'], ['url', 'name', 'thumb']); - $row['causer-link'] = $contact['url']; + + $row['causer-link'] = $contact['url']; $row['causer-avatar'] = $contact['thumb']; - $row['causer-name'] = $contact['name']; + $row['causer-name'] = $contact['name']; } elseif (($row['gravity'] == GRAVITY_ACTIVITY) && ($row['verb'] == Activity::ANNOUNCE) && ($row['author-id'] == $activity['causer-id'])) { return $row; @@ -837,15 +862,15 @@ class Conversation break; case ItemModel::PR_ANNOUNCEMENT: if (!empty($row['causer-id']) && $this->pConfig->get(local_user(), 'system', 'display_resharer')) { - $row['owner-id'] = $row['causer-id']; - $row['owner-link'] = $row['causer-link']; + $row['owner-id'] = $row['causer-id']; + $row['owner-link'] = $row['causer-link']; $row['owner-avatar'] = $row['causer-avatar']; - $row['owner-name'] = $row['causer-name']; + $row['owner-name'] = $row['causer-name']; } - if (($row['gravity'] == GRAVITY_PARENT) && !empty($row['causer-id'])) { - $causer = ['uid' => 0, 'id' => $row['causer-id'], - 'network' => $row['causer-network'], 'url' => $row['causer-link']]; + if (in_array($row['gravity'], [GRAVITY_PARENT, GRAVITY_COMMENT]) && !empty($row['causer-id'])) { + $causer = ['uid' => 0, 'id' => $row['causer-id'], 'network' => $row['causer-network'], 'url' => $row['causer-link']]; + $row['reshared'] = $this->l10n->t('%s reshared this.', '' . htmlentities($row['causer-name']) . ''); } $row['direction'] = ['direction' => 3, 'title' => (empty($row['causer-id']) ? $this->l10n->t('Reshared') : $this->l10n->t('Reshared by %s <%s>', $row['causer-name'], $row['causer-link']))]; @@ -867,6 +892,8 @@ class Conversation break; } + $row['thr-parent-row'] = $thr_parent; + $this->profiler->stopRecording(); return $row; } @@ -885,7 +912,8 @@ class Conversation * @return array items with parents and comments * @throws \Friendica\Network\HTTPException\InternalServerErrorException */ - private function addChildren(array $parents, $block_authors, $order, $uid) { + private function addChildren(array $parents, $block_authors, $order, $uid) + { $this->profiler->startRecording('rendering'); if (count($parents) > 1) { $max_comments = $this->config->get('system', 'max_comments', 100); @@ -893,14 +921,12 @@ class Conversation $max_comments = $this->config->get('system', 'max_display_comments', 1000); } - $params = ['order' => ['uri-id' => true, 'uid' => true]]; - $activities = []; $uriids = []; $commentcounter = []; $activitycounter = []; - foreach ($parents AS $parent) { + foreach ($parents as $parent) { if (!empty($parent['thr-parent-id']) && !empty($parent['gravity']) && ($parent['gravity'] == GRAVITY_ACTIVITY)) { $uriid = $parent['thr-parent-id']; if (!empty($parent['author-id'])) { @@ -928,7 +954,18 @@ class Conversation $condition = DBA::mergeConditions($condition, ["`uid` IN (0, ?) AND (`vid` != ? OR `vid` IS NULL)", $uid, Verb::getID(Activity::FOLLOW)]); - $thread_items = Post::selectForUser(local_user(), array_merge(ItemModel::DISPLAY_FIELDLIST, ['pinned', 'contact-uid', 'gravity', 'post-type', 'post-reason']), $condition, $params); + $thread_parents = Post::select(['uri-id', 'causer-id'], $condition, ['order' => ['uri-id' => false, 'uid']]); + + $thr_parent = []; + + while ($row = Post::fetch($thread_parents)) { + $thr_parent[$row['uri-id']] = $row; + } + DBA::close($thread_parents); + + $params = ['order' => ['uri-id' => true, 'uid' => true]]; + + $thread_items = Post::selectForUser($uid, array_merge(ItemModel::DISPLAY_FIELDLIST, ['featured', 'contact-uid', 'gravity', 'post-type', 'post-reason']), $condition, $params); $items = []; @@ -945,7 +982,8 @@ class Conversation continue; } } - $items[$row['uri-id']] = $this->addRowInformation($row, $activities[$row['uri-id']] ?? []); + + $items[$row['uri-id']] = $this->addRowInformation($row, $activities[$row['uri-id']] ?? [], $thr_parent[$row['thr-parent-id']] ?? []); } DBA::close($thread_items); @@ -979,6 +1017,7 @@ class Conversation if ($thr_parent == $parent['uri-id']) { $item['children'] = $this->getItemChildren($item_list, $item); + $children[] = $item; unset($item_list[$i]); } @@ -1058,7 +1097,7 @@ class Conversation if (isset($child['children']) && count($child['children'])) { // This helps counting only the regular posts - $count_post_closure = function($var) { + $count_post_closure = function ($var) { $this->profiler->stopRecording(); return $var['verb'] === Activity::POST; }; @@ -1072,7 +1111,7 @@ class Conversation // Searches the post item in the children $j = 0; - while($child['children'][$j]['verb'] !== Activity::POST && $j < count($child['children'])) { + while ($child['children'][$j]['verb'] !== Activity::POST && $j < count($child['children'])) { $j ++; } @@ -1131,11 +1170,15 @@ class Conversation } if (stristr($order, 'pinned_received')) { - usort($parents, [$this, 'sortThrPinnedReceived']); + usort($parents, [$this, 'sortThrFeaturedReceived']); + } elseif (stristr($order, 'pinned_commented')) { + usort($parents, [$this, 'sortThrFeaturedCommented']); } elseif (stristr($order, 'received')) { usort($parents, [$this, 'sortThrReceived']); } elseif (stristr($order, 'commented')) { usort($parents, [$this, 'sortThrCommented']); + } elseif (stristr($order, 'created')) { + usort($parents, [$this, 'sortThrCreated']); } /* @@ -1143,9 +1186,8 @@ class Conversation * items and add them as children of their top-level post. */ foreach ($parents as $i => $parent) { - $parents[$i]['children'] = - array_merge($this->getItemChildren($item_array, $parent, true), - $this->getItemChildren($item_array, $parent, false)); + $parents[$i]['children'] = array_merge($this->getItemChildren($item_array, $parent, true), + $this->getItemChildren($item_array, $parent, false)); } foreach ($parents as $i => $parent) { @@ -1171,23 +1213,41 @@ class Conversation } /** - * usort() callback to sort item arrays by pinned and the received key + * usort() callback to sort item arrays by featured and the received key * * @param array $a * @param array $b * @return int */ - private function sortThrPinnedReceived(array $a, array $b) + private function sortThrFeaturedReceived(array $a, array $b) { - if ($b['pinned'] && !$a['pinned']) { + if ($b['featured'] && !$a['featured']) { return 1; - } elseif (!$b['pinned'] && $a['pinned']) { + } elseif (!$b['featured'] && $a['featured']) { return -1; } return strcmp($b['received'], $a['received']); } + /** + * usort() callback to sort item arrays by featured and the received key + * + * @param array $a + * @param array $b + * @return int + */ + private function sortThrFeaturedCommented(array $a, array $b) + { + if ($b['featured'] && !$a['featured']) { + return 1; + } elseif (!$b['featured'] && $a['featured']) { + return -1; + } + + return strcmp($b['commented'], $a['commented']); + } + /** * usort() callback to sort item arrays by the received key * @@ -1223,4 +1283,16 @@ class Conversation { return strcmp($b['commented'], $a['commented']); } + + /** + * usort() callback to sort item arrays by the created key + * + * @param array $a + * @param array $b + * @return int + */ + private function sortThrCreated(array $a, array $b) + { + return strcmp($b['created'], $a['created']); + } }