]> git.mxchange.org Git - friendica.git/commitdiff
Decouple conversation creation from rendering
authorHypolite Petovan <hypolite@mrpetovan.com>
Sun, 5 Feb 2023 00:14:21 +0000 (19:14 -0500)
committerHypolite Petovan <hypolite@mrpetovan.com>
Sat, 8 Jul 2023 20:57:52 +0000 (16:57 -0400)
- This allows to separately obtain a list of threads for rendering without having to deal with an already-formed HTML output

14 files changed:
mod/item.php
mod/notes.php
src/Content/Conversation.php
src/Model/Contact.php
src/Module/Conversation/Community.php
src/Module/Conversation/Network.php
src/Module/Item/Display.php
src/Module/Profile/Conversations.php
src/Module/Search/Filed.php
src/Module/Search/Index.php
src/Module/Update/Community.php
src/Module/Update/Network.php
src/Module/Update/Profile.php
src/Object/Thread.php

index 369b0888a29449bbac8239ea1c16c92d7c2c642b..cf23df8424f219ffa305df9761c2daa0851bc8e7 100644 (file)
@@ -104,7 +104,7 @@ function item_edit(int $uid, array $request, bool $preview, string $return_path)
        }
 
        $post['edit'] = $post;
-       $post['file'] = Post\Category::getTextByURIId($post['uri-id'], $post['uid']);   
+       $post['file'] = Post\Category::getTextByURIId($post['uri-id'], $post['uid']);
 
        Post\Media::deleteByURIId($post['uri-id'], [Post\Media::AUDIO, Post\Media::VIDEO, Post\Media::IMAGE, Post\Media::HTML]);
        $post = item_process($post, $request, $preview, $return_path);
@@ -274,7 +274,7 @@ function item_process(array $post, array $request, bool $preview, string $return
                $post['body']           = BBCode::removeSharedData(Item::setHashtags($post['body']));
                $post['writable']       = true;
 
-               $o = DI::conversation()->create([$post], Conversation::MODE_SEARCH, false, true);
+               $o = DI::conversation()->render([$post], Conversation::MODE_SEARCH, false, true);
 
                System::jsonExit(['preview' => $o]);
        }
index 360441471f1dd4fc2eba08230e42a29ba2656995..554429d0ec56655b2e59dfda2912455f18c4ac80 100644 (file)
@@ -85,7 +85,7 @@ function notes_content(App $a, bool $update = false)
 
                $count = count($notes);
 
-               $o .= DI::conversation()->create($notes, Conversation::MODE_NOTES, $update);
+               $o .= DI::conversation()->render($notes, Conversation::MODE_NOTES, $update);
        }
 
        $o .= $pager->renderMinimal($count);
index 93dad904a29b8232cfbc3d43384fd5c05833ba69..b645ecf4b2e5d89312adaa1fb682d43ea5dc01f0 100644 (file)
@@ -438,17 +438,17 @@ class Conversation
         * The $mode parameter decides between the various renderings and also
         * figures out how to determine page owner and other contextual items
         * that are based on unique features of the calling module.
-        * @param array  $items
-        * @param string $mode
-        * @param        $update @TODO Which type?
-        * @param bool   $preview
-        * @param string $order
+        * @param array  $items   An array of Posts
+        * @param string $mode    One of self::MODE_*
+        * @param bool   $update  Asynchronous update rendering
+        * @param bool   $preview Post preview (no actual database record)
+        * @param string $order   Either "received" or "commented"
         * @param int    $uid
         * @return string
         * @throws ImagickException
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
-       public function create(array $items, string $mode, $update, bool $preview = false, string $order = 'commented', int $uid = 0): string
+       public function render(array $items, string $mode, bool $update = false, bool $preview = false, string $order = 'commented', int $uid = 0): string
        {
                $this->profiler->startRecording('rendering');
 
@@ -459,10 +459,6 @@ class Conversation
 
                $live_update_div = '';
 
-               $blocklist = $this->getBlocklist();
-
-               $previewing = (($preview) ? ' preview ' : '');
-
                if ($mode === self::MODE_NETWORK) {
                        $items = $this->addChildren($items, false, $order, $uid, $mode);
                        if (!$update) {
@@ -556,27 +552,59 @@ class Conversation
 
                $items = $cb['items'];
 
-               $conv_responses = [
-                       'like'        => [],
-                       'dislike'     => [],
-                       'attendyes'   => [],
-                       'attendno'    => [],
-                       'attendmaybe' => [],
-                       'announce'    => [],
-               ];
+               $formSecurityToken = BaseModule::getFormSecurityToken('contact_action');
 
-               if ($this->pConfig->get($this->session->getLocalUserId(), 'system', 'hide_dislike')) {
-                       unset($conv_responses['dislike']);
+               $threads = $this->getThreadList($items, $mode, $preview, $page_dropping, $formSecurityToken);
+
+               if (in_array($mode, [self::MODE_FILED, self::MODE_SEARCH, self::MODE_CONTACT_POSTS])) {
+                       $page_template = Renderer::getMarkupTemplate('conversation.tpl');
+               } else {
+                       $page_template = Renderer::getMarkupTemplate('threaded_conversation.tpl');
                }
 
-               // array with html for each thread (parent+comments)
-               $threads   = [];
-               $threadsid = -1;
+               $o = Renderer::replaceMacros($page_template, [
+                       '$baseurl'     => $this->baseURL,
+                       '$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),
+               ]);
+
+               $this->profiler->stopRecording();
+               return $o;
+       }
 
-               $page_template     = Renderer::getMarkupTemplate("conversation.tpl");
-               $formSecurityToken = BaseModule::getFormSecurityToken('contact_action');
+       /**
+        * @param array  $items
+        * @param string $mode One of self::MODE_*
+        * @param bool   $preview
+        * @param bool   $pagedrop Whether to enable the user to select the thread for deletion
+        * @param string $formSecurityToken A 'contact_action' form security token
+        * @return array
+        * @throws InternalServerErrorException
+        * @throws \ImagickException
+        */
+       public function getThreadList(array $items, string $mode, bool $preview, bool $pagedrop, string $formSecurityToken): array
+       {
+               if (in_array($mode, [self::MODE_FILED, self::MODE_SEARCH, self::MODE_CONTACT_POSTS])) {
+                       $threads = $this->getContextLessThreadList($items, $mode, $preview, $pagedrop, $formSecurityToken);
+               } else {
+                       $conv_responses = [
+                               'like'        => [],
+                               'dislike'     => [],
+                               'attendyes'   => [],
+                               'attendno'    => [],
+                               'attendmaybe' => [],
+                               'announce'    => [],
+                       ];
+
+                       if ($this->pConfig->get($this->session->getLocalUserId(), 'system', 'hide_dislike')) {
+                               unset($conv_responses['dislike']);
+                       }
 
-               if (!empty($items)) {
                        if (in_array($mode, [self::MODE_COMMUNITY, self::MODE_CONTACTS, self::MODE_PROFILE])) {
                                $writable = true;
                        } else {
@@ -587,230 +615,51 @@ class Conversation
                                $writable = false;
                        }
 
-                       if (in_array($mode, [self::MODE_FILED, self::MODE_SEARCH, self::MODE_CONTACT_POSTS])) {
-
-                               /*
-                               * "New Item View" on network page or search page results
-                               * - just loop through the items and format them minimally for display
-                               */
-
-                               $tpl = 'search_item.tpl';
-
-                               $uriids = [];
+                       // Normal View
+                       $conv = new Thread($mode, $preview, $writable);
 
-                               foreach ($items as $item) {
-                                       if (in_array($item['uri-id'], $uriids)) {
-                                               continue;
-                                       }
-
-                                       $uriids[] = $item['uri-id'];
-
-                                       if (!$this->item->isVisibleActivity($item)) {
-                                               continue;
-                                       }
-
-                                       if (in_array($item['author-id'], $blocklist)) {
-                                               continue;
-                                       }
-
-                                       $threadsid++;
-
-                                       // prevent private email from leaking.
-                                       if ($item['network'] === Protocol::MAIL && $this->session->getLocalUserId() != $item['uid']) {
-                                               continue;
-                                       }
-
-                                       $profile_name = $item['author-name'];
-                                       if (!empty($item['author-link']) && empty($item['author-name'])) {
-                                               $profile_name = $item['author-link'];
-                                       }
-
-                                       $tags = Tag::populateFromItem($item);
-
-                                       $author = [
-                                               'uid'     => 0,
-                                               'id'      => $item['author-id'],
-                                               'network' => $item['author-network'],
-                                               'url'     => $item['author-link'],
-                                               'alias'   => $item['author-alias'],
-                                       ];
-                                       $profile_link = Contact::magicLinkByContact($author);
-
-                                       $sparkle = '';
-                                       if (strpos($profile_link, 'contact/redir/') === 0) {
-                                               $sparkle = ' sparkle';
-                                       }
-
-                                       $locate = ['location' => $item['location'], 'coord' => $item['coord'], 'html' => ''];
-                                       Hook::callAll('render_location', $locate);
-                                       $location_html = $locate['html'] ?: Strings::escapeHtml($locate['location'] ?: $locate['coord'] ?: '');
-
-                                       $this->item->localize($item);
-                                       if ($mode === self::MODE_FILED) {
-                                               $dropping = true;
-                                       } else {
-                                               $dropping = false;
-                                       }
-
-                                       $drop = [
-                                               'dropping' => $dropping,
-                                               'pagedrop' => $page_dropping,
-                                               'select'   => $this->l10n->t('Select'),
-                                               'delete'   => $this->l10n->t('Delete'),
-                                       ];
-
-                                       $likebuttons = [
-                                               'like'     => null,
-                                               'dislike'  => null,
-                                               'share'    => null,
-                                               'announce' => null,
-                                       ];
-
-                                       if ($this->pConfig->get($this->session->getLocalUserId(), 'system', 'hide_dislike')) {
-                                               unset($likebuttons['dislike']);
-                                       }
-
-                                       $body_html = ItemModel::prepareBody($item, true, $preview);
-
-                                       [$categories, $folders] = $this->item->determineCategoriesTerms($item, $this->session->getLocalUserId());
-
-                                       if (!empty($item['title'])) {
-                                               $title = $item['title'];
-                                       } elseif (!empty($item['content-warning']) && $this->pConfig->get($this->session->getLocalUserId(), 'system', 'disable_cw', false)) {
-                                               $title = ucfirst($item['content-warning']);
-                                       } else {
-                                               $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'], $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($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]['network'] = $item['network'];
-                                       $threads[$threadsid]['items']   = [$arr['output']];
+                       /*
+                       * get all the topmost parents
+                       * this shouldn't be needed, as we should have only them in our array
+                       * But for now, this array respects the old style, just in case
+                       */
+                       foreach ($items as $item) {
+                               if (in_array($item['author-id'], $this->getBlocklist())) {
+                                       continue;
                                }
-                       } else {
-                               // Normal View
-                               $page_template = Renderer::getMarkupTemplate("threaded_conversation.tpl");
-
-                               $conv = new Thread($mode, $preview, $writable);
-
-                               /*
-                               * get all the topmost parents
-                               * this shouldn't be needed, as we should have only them in our array
-                               * But for now, this array respects the old style, just in case
-                               */
-                               foreach ($items as $item) {
-                                       if (in_array($item['author-id'], $blocklist)) {
-                                               continue;
-                                       }
 
-                                       // Can we put this after the visibility check?
-                                       $this->builtinActivityPuller($item, $conv_responses);
+                               // Can we put this after the visibility check?
+                               $this->builtinActivityPuller($item, $conv_responses);
 
-                                       // Only add what is visible
-                                       if ($item['network'] === Protocol::MAIL && $this->session->getLocalUserId() != $item['uid']) {
-                                               continue;
-                                       }
+                               // Only add what is visible
+                               if ($item['network'] === Protocol::MAIL && $this->session->getLocalUserId() != $item['uid']) {
+                                       continue;
+                               }
 
-                                       if (!$this->item->isVisibleActivity($item)) {
-                                               continue;
-                                       }
+                               if (!$this->item->isVisibleActivity($item)) {
+                                       continue;
+                               }
 
-                                       /// @todo Check if this call is needed or not
-                                       $arr = ['item' => $item];
-                                       Hook::callAll('display_item', $arr);
+                               /// @todo Check if this call is needed or not
+                               $arr = ['item' => $item];
+                               Hook::callAll('display_item', $arr);
 
-                                       $item['pagedrop'] = $page_dropping;
+                               $item['pagedrop'] = $pagedrop;
 
-                                       if ($item['gravity'] == ItemModel::GRAVITY_PARENT) {
-                                               $item_object = new PostObject($item);
-                                               $conv->addParent($item_object);
-                                       }
+                               if ($item['gravity'] == ItemModel::GRAVITY_PARENT) {
+                                       $item_object = new PostObject($item);
+                                       $conv->addParent($item_object);
                                }
+                       }
 
-                               $threads = $conv->getTemplateData($conv_responses, $formSecurityToken);
-                               if (!$threads) {
-                                       $this->logger->info('[ERROR] conversation : Failed to get template data.');
-                                       $threads = [];
-                               }
+                       $threads = $conv->getTemplateData($conv_responses, $formSecurityToken);
+                       if (!$threads) {
+                               $this->logger->info('[ERROR] conversation : Failed to get template data.');
+                               $threads = [];
                        }
                }
 
-               $o = Renderer::replaceMacros($page_template, [
-                       '$baseurl'     => $this->baseURL,
-                       '$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),
-               ]);
-
-               $this->profiler->stopRecording();
-               return $o;
+               return $threads;
        }
 
        private function getBlocklist(): array
@@ -1494,4 +1343,180 @@ class Conversation
        {
                return strcmp($b['created'], $a['created']);
        }
+
+       /**
+        * "New Item View" on network page or search page results
+        * - just loop through the items and format them minimally for display
+        *
+        * @param array  $items
+        * @param string $mode              One of self::MODE_*
+        * @param bool   $preview           Whether the display is a preview
+        * @param bool   $pagedrop          Whether the user can select the threads for deletion
+        * @param string $formSecurityToken A 'contact_action' form security token
+        * @return array
+        * @throws InternalServerErrorException
+        * @throws \ImagickException
+        */
+       public function getContextLessThreadList(array $items, string $mode, bool $preview, bool $pagedrop, string $formSecurityToken): array
+       {
+               $threads = [];
+               $uriids = [];
+
+               foreach ($items as $item) {
+                       if (in_array($item['uri-id'], $uriids)) {
+                               continue;
+                       }
+
+                       $uriids[] = $item['uri-id'];
+
+                       if (!$this->item->isVisibleActivity($item)) {
+                               continue;
+                       }
+
+                       if (in_array($item['author-id'], $this->getBlocklist())) {
+                               continue;
+                       }
+
+                       $threadsid++;
+
+                       // prevent private email from leaking.
+                       if ($item['network'] === Protocol::MAIL && $this->session->getLocalUserId() != $item['uid']) {
+                               continue;
+                       }
+
+                       $profile_name = $item['author-name'];
+                       if (!empty($item['author-link']) && empty($item['author-name'])) {
+                               $profile_name = $item['author-link'];
+                       }
+
+                       $tags = Tag::populateFromItem($item);
+
+                       $author       = [
+                               'uid'     => 0,
+                               'id'      => $item['author-id'],
+                               'network' => $item['author-network'],
+                               'url'     => $item['author-link'],
+                               'alias'   => $item['author-alias'],
+                       ];
+                       $profile_link = Contact::magicLinkByContact($author);
+
+                       $sparkle = '';
+                       if (strpos($profile_link, 'contact/redir/') === 0) {
+                               $sparkle = ' sparkle';
+                       }
+
+                       $locate = ['location' => $item['location'], 'coord' => $item['coord'], 'html' => ''];
+                       Hook::callAll('render_location', $locate);
+                       $location_html = $locate['html'] ?: Strings::escapeHtml($locate['location'] ?: $locate['coord'] ?: '');
+
+                       $this->item->localize($item);
+                       if ($mode === self::MODE_FILED) {
+                               $dropping = true;
+                       } else {
+                               $dropping = false;
+                       }
+
+                       $drop = [
+                               'dropping' => $dropping,
+                               'pagedrop' => $pagedrop,
+                               'select'   => $this->l10n->t('Select'),
+                               'delete'   => $this->l10n->t('Delete'),
+                       ];
+
+                       $likebuttons = [
+                               'like'     => null,
+                               'dislike'  => null,
+                               'share'    => null,
+                               'announce' => null,
+                       ];
+
+                       if ($this->pConfig->get($this->session->getLocalUserId(), 'system', 'hide_dislike')) {
+                               unset($likebuttons['dislike']);
+                       }
+
+                       $body_html = ItemModel::prepareBody($item, true, $preview);
+
+                       [$categories, $folders] = $this->item->determineCategoriesTerms($item, $this->session->getLocalUserId());
+
+                       if (!empty($item['title'])) {
+                               $title = $item['title'];
+                       } elseif (!empty($item['content-warning']) && $this->pConfig->get($this->session->getLocalUserId(), 'system', 'disable_cw', false)) {
+                               $title = ucfirst($item['content-warning']);
+                       } else {
+                               $title = '';
+                       }
+
+                       if (!empty($item['featured'])) {
+                               $pinned = $this->l10n->t('Pinned item');
+                       } else {
+                               $pinned = '';
+                       }
+
+                       $tmp_item = [
+                               'template'             => 'search_item.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($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'           => $preview ? ' preview ' : '',
+                               'wait'                 => $this->l10n->t('Please wait'),
+                               'thread_level'         => 1,
+                       ];
+
+                       $arr = ['item' => $item, 'output' => $tmp_item];
+                       Hook::callAll('display_item', $arr);
+
+                       $threads[] = [
+                               'id'      => $item['id'],
+                               'network' => $item['network'],
+                               'items'   => [$arr['output']],
+                       ];
+               }
+
+               return $threads;
+       }
 }
index d519fe97a02d344bb1aeed2410afb0fc4f480994..3ca84515a9af54d71b4d05d8999c43d46f2e8bd7 100644 (file)
@@ -1626,7 +1626,7 @@ class Contact
                                }
                        }
 
-                       $o .= DI::conversation()->create($items, ConversationContent::MODE_CONTACTS, $update, false, 'pinned_commented', DI::userSession()->getLocalUserId());
+                       $o .= DI::conversation()->render($items, ConversationContent::MODE_CONTACTS, $update, false, 'pinned_commented', DI::userSession()->getLocalUserId());
                } else {
                        $fields = array_merge(Item::DISPLAY_FIELDLIST, ['featured']);
                        $items = Post::toArray(Post::selectForUser(DI::userSession()->getLocalUserId(), $fields, $condition, $params));
@@ -1643,7 +1643,7 @@ class Contact
                                }
                        }
 
-                       $o .= DI::conversation()->create($items, ConversationContent::MODE_CONTACT_POSTS, $update);
+                       $o .= DI::conversation()->render($items, ConversationContent::MODE_CONTACT_POSTS, $update);
                }
 
                if (!$update) {
index ae6297e48484794a2e3dee4d894f7d36f0c1f468..7525ba1c16833f04f192949c4de23ae47a20a9b1 100644 (file)
@@ -92,7 +92,7 @@ class Community extends BaseModule
                                        'accesskey' => 'l'
                                ];
                        }
-       
+
                        if (DI::userSession()->isAuthenticated() || in_array(self::$page_style, [self::LOCAL_AND_GLOBAL, self::GLOBAL])) {
                                $tabs[] = [
                                        'label' => DI::l10n()->t('Global Community'),
@@ -110,14 +110,14 @@ class Community extends BaseModule
                        Nav::setSelected('community');
 
                        DI::page()['aside'] .= Widget::accountTypes('community/' . self::$content, self::$accountTypeString);
-       
+
                        if (DI::userSession()->getLocalUserId() && DI::config()->get('system', 'community_no_sharer')) {
                                $path = self::$content;
                                if (!empty($this->parameters['accounttype'])) {
                                        $path .= '/' . $this->parameters['accounttype'];
                                }
                                $query_parameters = [];
-               
+
                                if (!empty($_GET['min_id'])) {
                                        $query_parameters['min_id'] = $_GET['min_id'];
                                }
@@ -127,7 +127,7 @@ class Community extends BaseModule
                                if (!empty($_GET['last_commented'])) {
                                        $query_parameters['max_id'] = $_GET['last_commented'];
                                }
-               
+
                                $path_all = $path . (!empty($query_parameters) ? '?' . http_build_query($query_parameters) : '');
                                $path_no_sharer = $path . '?' . http_build_query(array_merge($query_parameters, ['no_sharer' => true]));
                                DI::page()['aside'] .= Renderer::replaceMacros(Renderer::getMarkupTemplate('widget/community_sharer.tpl'), [
@@ -139,7 +139,7 @@ class Community extends BaseModule
                                        '$no_sharer_label' => DI::l10n()->t('Hide'),
                                ]);
                        }
-       
+
                        if (Feature::isEnabled(DI::userSession()->getLocalUserId(), 'trending_tags')) {
                                DI::page()['aside'] .= TrendingTags::getHTML(self::$content);
                        }
@@ -157,7 +157,7 @@ class Community extends BaseModule
                        return $o;
                }
 
-               $o .= DI::conversation()->create($items, Conversation::MODE_COMMUNITY, false, false, 'commented', DI::userSession()->getLocalUserId());
+               $o .= DI::conversation()->render($items, Conversation::MODE_COMMUNITY, false, false, 'commented', DI::userSession()->getLocalUserId());
 
                $pager = new BoundariesPager(
                        DI::l10n(),
@@ -339,7 +339,7 @@ class Community extends BaseModule
                                $condition[0] .= " AND NOT `uri-id` IN (SELECT `uri-id` FROM `post-user` WHERE `post-user`.`uid` = ? AND `post-user`.`uri-id` = `post-thread-user-view`.`uri-id`)";
                                $condition[] = DI::userSession()->getLocalUserId();
                        }
-       
+
                        if (isset($max_id)) {
                                $condition[0] .= " AND `commented` < ?";
                                $condition[] = $max_id;
index f1f8a6860de1572eb7f152a1d4a3c3efbc25bad0..ed53f7d2339d8f21dbf321efc387b2f07519022b 100644 (file)
@@ -201,7 +201,7 @@ class Network extends BaseModule
                        $ordering = '`commented`';
                }
 
-               $o .= DI::conversation()->create($items, Conversation::MODE_NETWORK, false, false, $ordering, DI::userSession()->getLocalUserId());
+               $o .= DI::conversation()->render($items, Conversation::MODE_NETWORK, false, false, $ordering, DI::userSession()->getLocalUserId());
 
                if (DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'system', 'infinite_scroll')) {
                        $o .= HTML::scrollLoader();
index a0d1ecbf56d81263d3aca04b192bf4aa0357b985..f8e2d337bbd62cb4d7f6822e7e93056404ecdc8d 100644 (file)
@@ -275,7 +275,7 @@ class Display extends BaseModule
                        $output .= $this->conversation->statusEditor([], 0, true);
                }
 
-               $output .= $this->conversation->create([$item], Conversation::MODE_DISPLAY, $updateUid, false, 'commented', $itemUid);
+               $output .= $this->conversation->render([$item], Conversation::MODE_DISPLAY, $updateUid, false, 'commented', $itemUid);
 
                return $output;
        }
index 9d5fea0a6ecc4112261e30c7ff3a033797c3f8b4..b53c2d1ab818d99e6925ea9f4f04b5846430a1bb 100644 (file)
@@ -240,7 +240,7 @@ class Conversations extends BaseProfile
                        $items  = array_merge($items, $pinned);
                }
 
-               $o .= $this->conversation->create($items, Conversation::MODE_PROFILE, false, false, 'pinned_received', $profile['uid']);
+               $o .= $this->conversation->render($items, Conversation::MODE_PROFILE, false, false, 'pinned_received', $profile['uid']);
 
                $o .= $pager->renderMinimal(count($items));
 
index 4661a58664a8fc06f43b8ca1787fd62330d64ae0..5f519b60c2f359e0a35bef5d395ac65c15f2e35f 100644 (file)
@@ -99,7 +99,7 @@ class Filed extends BaseSearch
 
                $items = Post::toArray(Post::selectForUser(DI::userSession()->getLocalUserId(), Item::DISPLAY_FIELDLIST, $item_condition, $item_params));
 
-               $o .= DI::conversation()->create($items, Conversation::MODE_FILED, false, false, '', DI::userSession()->getLocalUserId());
+               $o .= DI::conversation()->render($items, Conversation::MODE_FILED, false, false, '', DI::userSession()->getLocalUserId());
 
                if (DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'system', 'infinite_scroll')) {
                        $o .= HTML::scrollLoader();
index b08857a73916a80d758c3d56def04e3be7915ccc..9ec8c9dd6d898e9d398103d83f5a5357513cd0f0 100644 (file)
@@ -213,7 +213,7 @@ class Index extends BaseSearch
 
                Logger::info('Start Conversation.', ['q' => $search]);
 
-               $o .= DI::conversation()->create($items, Conversation::MODE_SEARCH, false, false, 'commented', DI::userSession()->getLocalUserId());
+               $o .= DI::conversation()->render($items, Conversation::MODE_SEARCH, false, false, 'commented', DI::userSession()->getLocalUserId());
 
                if (DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'system', 'infinite_scroll')) {
                        $o .= HTML::scrollLoader();
index 1ac241e55aa4d006a5e13b0e850655fc48cf9d0c..7edb2949bbac47453a9740b970577d84b87b2041 100644 (file)
@@ -40,7 +40,7 @@ class Community extends CommunityModule
 
                $o = '';
                if (!empty($request['force'])) {
-                       $o = DI::conversation()->create(self::getItems(), Conversation::MODE_COMMUNITY, true, false, 'commented', DI::userSession()->getLocalUserId());
+                       $o = DI::conversation()->render(self::getItems(), Conversation::MODE_COMMUNITY, true, false, 'commented', DI::userSession()->getLocalUserId());
                }
 
                System::htmlUpdateExit($o);
index 052ae040f066fd56396dab8aa22bd1011671cbf3..7c9a07f362fd01a16c0c52122734b5e88457df1e 100644 (file)
@@ -79,7 +79,7 @@ class Network extends NetworkModule
                        $ordering = '`commented`';
                }
 
-               $o = DI::conversation()->create($items, Conversation::MODE_NETWORK, $profile_uid, false, $ordering, DI::userSession()->getLocalUserId());
+               $o = DI::conversation()->render($items, Conversation::MODE_NETWORK, $profile_uid, false, $ordering, DI::userSession()->getLocalUserId());
 
                System::htmlUpdateExit($o);
        }
index bdbe5732046b07229f14a8076a812fac9c7749b2..4712cc3f5bdc9d88cb4f31fa09c02d074f886be7 100644 (file)
@@ -116,7 +116,7 @@ class Profile extends BaseModule
                        }
                }
 
-               $o .= DI::conversation()->create($items, Conversation::MODE_PROFILE, $a->getProfileOwner(), false, 'received', $a->getProfileOwner());
+               $o .= DI::conversation()->render($items, Conversation::MODE_PROFILE, $a->getProfileOwner(), false, 'received', $a->getProfileOwner());
 
                System::htmlUpdateExit($o);
        }
index 84245ab6a7fb283a7ee1fd120a9a8b68ee727cc5..adc822b6ad456af419fffe6b7a5da09fe26234b7 100644 (file)
@@ -190,13 +190,13 @@ class Thread
         * We should find a way to avoid using those arguments (at least most of them)
         *
         * @param array $conv_responses data
-        * @param string $formSecurityToken A security Token to avoid CSF attacks
+        * @param string $formSecurityToken A 'contact_action' form security token
         *
         * @return mixed The data requested on success
         *               false on failure
         * @throws \Exception
         */
-       public function getTemplateData($conv_responses, string $formSecurityToken)
+       public function getTemplateData(array $conv_responses, string $formSecurityToken)
        {
                $result = [];