]> git.mxchange.org Git - friendica.git/commitdiff
Ensure contact tabs will use the correct id
authorMichael <heluecht@pirati.ca>
Sun, 2 Aug 2020 13:34:49 +0000 (13:34 +0000)
committerMichael <heluecht@pirati.ca>
Sun, 2 Aug 2020 13:34:49 +0000 (13:34 +0000)
mod/common.php
src/Model/Contact.php
src/Module/AllFriends.php
src/Module/Contact.php
view/theme/frio/templates/contact_edit.tpl

index 7d9caf8d1e62da75e560c0a319ec7348755639e2..d4ee97c4ff7a1b37998ed2ddacd3f6e91c624b8a 100644 (file)
@@ -117,14 +117,6 @@ function common_content(App $a)
                return $o;
        }
 
-       $entries = [];
-       foreach ($common_friends as $common_friend) {
-               $contact = Model\Contact::getByURLForUser($common_friend['url'], local_user());
-               if (!empty($contact)) {
-                       $entries[] = Module\Contact::getContactTemplateVars($contact);
-               }
-       }
-
        $title = '';
        $tab_str = '';
        if ($cmd === 'loc' && $cid && local_user() == $uid) {
@@ -133,6 +125,14 @@ function common_content(App $a)
                $title = DI::l10n()->t('Common Friends');
        }
 
+       $entries = [];
+       foreach ($common_friends as $common_friend) {
+               $contact = Model\Contact::getByURLForUser($common_friend['url'], local_user());
+               if (!empty($contact)) {
+                       $entries[] = Module\Contact::getContactTemplateVars($contact);
+               }
+       }
+
        $tpl = Renderer::getMarkupTemplate('viewcontact_template.tpl');
 
        $o .= Renderer::replaceMacros($tpl, [
index 325183e10b0d0f3c85af70b9daf7119b4f485052..9bd63f83dd61f37361a4f19de49526c431a206d0 100644 (file)
@@ -3056,6 +3056,40 @@ class Contact
                return array_slice($contacts, $start, $limit);
        }
 
+       /**
+        * Returns a list of all common friends between two given public contact ids.
+        *
+        * @param int $cid1  first public contact id
+        * @param int $cid2  second public contact id
+        * @return int
+        */
+       public static function countContactsOfContact(int $cid)
+       {
+               return DBA::count('contact',
+                       ["`id` IN (SELECT `cid` FROM `contact-relation` WHERE `relation-cid` = ?)
+                       OR `id` IN (SELECT `relation-cid` FROM `contact-relation` WHERE `cid` = ?)",
+                       $cid, $cid]
+               );
+       }
+
+       /**
+        * Returns a list of all contacts of a given public contact id.
+        *
+        * @param int $cid   public contact id
+        * @param int $start optional, default 0
+        * @param int $limit optional, default 80
+        * @return array
+        */
+       public static function getContactsOfContact(int $cid, int $start = 0, int $limit = 80)
+       {
+               return DBA::selectToArray('contact', [],
+                       ["`id` IN (SELECT `cid` FROM `contact-relation` WHERE `relation-cid` = ?)
+                       OR `id` IN (SELECT `relation-cid` FROM `contact-relation` WHERE `cid` = ?)",
+                       $cid, $cid],
+                       ['limit' => [$start, $limit]]
+               );
+       }
+
        /**
         * Add public contacts from an array
         *
index 68a4f304e658247e931ce1d585d88ccd5c3e99a6..00614a1330a3d2c3a1ede367e061fc1a00dfea95 100644 (file)
@@ -54,7 +54,7 @@ class AllFriends extends BaseModule
 
                $uid = $app->user['uid'];
 
-               $contact = Model\Contact::getContactForUser($cid, local_user(), ['name', 'url', 'photo', 'uid', 'id']);
+               $contact = Model\Contact::getById($cid, ['name', 'url', 'photo', 'uid', 'id']);
 
                if (empty($contact)) {
                        throw new HTTPException\BadRequestException(DI::l10n()->t('Invalid contact.'));
@@ -63,25 +63,22 @@ class AllFriends extends BaseModule
                DI::page()['aside'] = "";
                Model\Profile::load($app, "", Model\Contact::getByURL($contact["url"], false));
 
-               $total = Model\GContact::countAllFriends(local_user(), $cid);
+               $total = Model\Contact::countContactsOfContact($cid);
 
                $pager = new Pager(DI::l10n(), DI::args()->getQueryString());
 
-               $friends = Model\GContact::allFriends(local_user(), $cid, $pager->getStart(), $pager->getItemsPerPage());
+               $friends = Model\Contact::getContactsOfContact($cid, $pager->getStart(), $pager->getItemsPerPage());
                if (empty($friends)) {
                        return DI::l10n()->t('No friends to display.');
                }
 
+               $tab_str = Contact::getTabsHTML($app, $contact, 4);
+
                $entries = [];
                foreach ($friends as $friend) {
-                       $contact = Model\Contact::getByURLForUser($friend['url'], local_user());
-                       if (!empty($contact)) {
-                               $entries[] = Contact::getContactTemplateVars($contact);
-                       }
+                       $entries[] = Contact::getContactTemplateVars($friend);
                }
 
-               $tab_str = Contact::getTabsHTML($app, $contact, 4);
-
                $tpl = Renderer::getMarkupTemplate('viewcontact_template.tpl');
                return Renderer::replaceMacros($tpl, [
                        '$tab_str'  => $tab_str,
index bf22470ed4babce42aaa88cc81e171da1335db95..73be9ecab53be29cf6d7a160fb20335ef5edd6ef 100644 (file)
@@ -179,7 +179,7 @@ class Contact extends BaseModule
 
        private static function updateContactFromProbe($contact_id)
        {
-               $contact = DBA::selectFirst('contact', ['url'], ['id' => $contact_id, 'uid' => local_user(), 'deleted' => false]);
+               $contact = DBA::selectFirst('contact', ['url'], ['id' => $contact_id, 'uid' => [0, local_user()], 'deleted' => false]);
                if (!DBA::isResult($contact)) {
                        return;
                }
@@ -257,19 +257,21 @@ class Contact extends BaseModule
                        DI::page()['aside'] = '';
                }
 
-               $contact_id = null;
                $contact = null;
                // @TODO: Replace with parameter from router
                if ($a->argc == 2 && intval($a->argv[1])
                        || $a->argc == 3 && intval($a->argv[1]) && in_array($a->argv[2], ['posts', 'conversations'])
                ) {
                        $contact_id = intval($a->argv[1]);
-                       $contact = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => local_user(), 'deleted' => false]);
 
-                       if (!DBA::isResult($contact)) {
-                               $contact = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => 0, 'deleted' => false]);
+                       // Ensure to use the user contact when the public contact was provided
+                       $data = Model\Contact::getPublicAndUserContacID($contact_id, local_user());
+                       if (!empty($data['user']) && ($contact_id == $data['public'])) {
+                               $contact_id = $data['user'];
                        }
 
+                       $contact = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => [0, local_user()], 'deleted' => false]);
+
                        // Don't display contacts that are about to be deleted
                        if ($contact['network'] == Protocol::PHANTOM) {
                                $contact = false;
@@ -384,9 +386,9 @@ class Contact extends BaseModule
                                // NOTREACHED
                        }
 
-                       if ($cmd === 'updateprofile' && ($orig_record['uid'] != 0)) {
+                       if ($cmd === 'updateprofile') {
                                self::updateContactFromProbe($contact_id);
-                               DI::baseUrl()->redirect('contact/' . $contact_id . '/advanced/');
+                               DI::baseUrl()->redirect('contact/' . $contact_id);
                                // NOTREACHED
                        }
 
@@ -862,11 +864,19 @@ class Contact extends BaseModule
         */
        public static function getTabsHTML($a, $contact, $active_tab)
        {
+               $cid = $pcid = $contact['id'];
+               $data = Model\Contact::getPublicAndUserContacID($contact['id'], local_user());
+               if (!empty($data['user']) && ($contact['id'] == $data['public'])) {
+                       $cid = $data['user'];
+               } elseif (!empty($data['public'])) {
+                       $pcid = $data['public'];
+               }
+
                // tabs
                $tabs = [
                        [
                                'label' => DI::l10n()->t('Status'),
-                               'url'   => "contact/" . $contact['id'] . "/conversations",
+                               'url'   => "contact/" . $cid . "/conversations",
                                'sel'   => (($active_tab == 1) ? 'active' : ''),
                                'title' => DI::l10n()->t('Conversations started by this contact'),
                                'id'    => 'status-tab',
@@ -874,7 +884,7 @@ class Contact extends BaseModule
                        ],
                        [
                                'label' => DI::l10n()->t('Posts and Comments'),
-                               'url'   => "contact/" . $contact['id'] . "/posts",
+                               'url'   => "contact/" . $cid . "/posts",
                                'sel'   => (($active_tab == 2) ? 'active' : ''),
                                'title' => DI::l10n()->t('Status Messages and Posts'),
                                'id'    => 'posts-tab',
@@ -882,7 +892,7 @@ class Contact extends BaseModule
                        ],
                        [
                                'label' => DI::l10n()->t('Profile'),
-                               'url'   => "contact/" . $contact['id'],
+                               'url'   => "contact/" . $cid,
                                'sel'   => (($active_tab == 3) ? 'active' : ''),
                                'title' => DI::l10n()->t('Profile Details'),
                                'id'    => 'profile-tab',
@@ -891,10 +901,10 @@ class Contact extends BaseModule
                ];
 
                // Show this tab only if there is visible friend list
-               $x = Model\GContact::countAllFriends(local_user(), $contact['id']);
+               $x = Model\Contact::countContactsOfContact($pcid);
                if ($x) {
                        $tabs[] = ['label' => DI::l10n()->t('Contacts'),
-                               'url'   => "allfriends/" . $contact['id'],
+                               'url'   => "allfriends/" . $pcid,
                                'sel'   => (($active_tab == 4) ? 'active' : ''),
                                'title' => DI::l10n()->t('View all contacts'),
                                'id'    => 'allfriends-tab',
@@ -902,10 +912,10 @@ class Contact extends BaseModule
                }
 
                // Show this tab only if there is visible common friend list
-               $common = Model\GContact::countCommonFriends(local_user(), $contact['id']);
+               $common = Model\GContact::countCommonFriends(local_user(), $cid);
                if ($common) {
                        $tabs[] = ['label' => DI::l10n()->t('Common Friends'),
-                               'url'   => "common/loc/" . local_user() . "/" . $contact['id'],
+                               'url'   => "common/loc/" . local_user() . "/" . $cid,
                                'sel'   => (($active_tab == 5) ? 'active' : ''),
                                'title' => DI::l10n()->t('View all common friends'),
                                'id'    => 'common-loc-tab',
@@ -913,9 +923,9 @@ class Contact extends BaseModule
                        ];
                }
 
-               if (!empty($contact['uid'])) {
+               if ($cid != $pcid) {
                        $tabs[] = ['label' => DI::l10n()->t('Advanced'),
-                               'url'   => 'contact/' . $contact['id'] . '/advanced/',
+                               'url'   => 'contact/' . $cid . '/advanced/',
                                'sel'   => (($active_tab == 6) ? 'active' : ''),
                                'title' => DI::l10n()->t('Advanced Contact Settings'),
                                'id'    => 'advanced-tab',
@@ -1011,6 +1021,15 @@ class Contact extends BaseModule
        {
                $alt_text = '';
 
+               if (!empty($contact['url']) && isset($contact['uid']) && ($contact['uid'] == 0) && local_user()) {
+                       $personal = Model\Contact::getByURL($contact['url'], false, ['uid', 'rel', 'self'], local_user());
+                       if (!empty($personal)) {
+                               $contact['uid'] = $personal['uid'];
+                               $contact['rel'] = $personal['rel'];
+                               $contact['self'] = $personal['self'];
+                       }
+               }
+
                if (!empty($contact['uid']) && !empty($contact['rel'])) {
                        switch ($contact['rel']) {
                                case Model\Contact::FRIEND:
@@ -1105,6 +1124,16 @@ class Contact extends BaseModule
                        ];
                }
 
+               if (in_array($contact['network'], Protocol::FEDERATED)) {
+                       $contact_actions['updateprofile'] = [
+                               'label' => DI::l10n()->t('Refetch contact data'),
+                               'url'   => 'contact/' . $contact['id'] . '/updateprofile',
+                               'title' => '',
+                               'sel'   => '',
+                               'id'    => 'updateprofile',
+                       ];
+               }
+
                $contact_actions['block'] = [
                        'label' => (intval($contact['blocked']) ? DI::l10n()->t('Unblock') : DI::l10n()->t('Block')),
                        'url'   => 'contact/' . $contact['id'] . '/block',
index 55a7891a82d019f1814f3afb7ca3f9653dfac026..ca585feab01b95998d23e1d693b1fc8ebd5c244a 100644 (file)
@@ -21,7 +21,8 @@
                                                <ul class="dropdown-menu pull-right" role="menu" aria-labelledby="contact-edit-actions-button" aria-haspopup="true" id="contact-actions-menu" >
                                                        {{if $lblsuggest}}<li role="presentation"><a role="menuitem" href="{{$contact_actions.suggest.url}}" title="{{$contact_actions.suggest.title}}">{{$contact_actions.suggest.label}}</a></li>{{/if}}
                                                        {{if $poll_enabled}}<li role="presentation"><a role="menuitem" href="{{$contact_actions.update.url}}" title="{{$contact_actions.update.title}}">{{$contact_actions.update.label}}</a></li>{{/if}}
-                                                       {{if $lblsuggest || $poll_enabled}}
+                                                       {{if $contact_actions.updateprofile}}<li role="presentation"><a role="menuitem" href="{{$contact_actions.updateprofile.url}}" title="{{$contact_actions.updateprofile.title}}">{{$contact_actions.updateprofile.label}}</a></li>{{/if}}
+                                                       {{if $lblsuggest || $poll_enabled || $contact_actions.updateprofile}}
                                                        <li role="presentation" class="divider"></li>
                                                        {{/if}}
                                                        <li role="presentation"><a role="menuitem" href="{{$contact_actions.block.url}}" title="{{$contact_actions.block.title}}">{{$contact_actions.block.label}}</a></li>