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
*
$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.'));
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,
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;
}
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;
// 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
}
*/
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',
],
[
'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',
],
[
'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',
];
// 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',
}
// 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',
];
}
- 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',
{
$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:
];
}
+ 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',