X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FModel%2FProfile.php;h=b32c58fc9313c97334471e3301cf910e6c08ee11;hb=83d3ce0802d2a2e2717f580f606d1f5211f23edd;hp=3e35d60c2966fa67d90fd344af64fa6e71b5fa90;hpb=7789ea25079801ee1425368e9bf2f7ce80d16d88;p=friendica.git diff --git a/src/Model/Profile.php b/src/Model/Profile.php index 3e35d60c29..b32c58fc93 100644 --- a/src/Model/Profile.php +++ b/src/Model/Profile.php @@ -29,8 +29,10 @@ use Friendica\Core\Hook; use Friendica\Core\Logger; use Friendica\Core\Protocol; use Friendica\Core\Renderer; +use Friendica\Core\Search; use Friendica\Core\Session; use Friendica\Core\System; +use Friendica\Core\Worker; use Friendica\Database\DBA; use Friendica\DI; use Friendica\Protocol\Activity; @@ -84,6 +86,71 @@ class Profile return DBA::selectToArray('profile', $fields, ['uid' => $uid]); } + /** + * Update a profile entry and distribute the changes if needed + * + * @param array $fields + * @param integer $uid + * @return boolean + */ + public static function update(array $fields, int $uid): bool + { + $old_owner = User::getOwnerDataById($uid); + if (empty($old_owner)) { + return false; + } + + if (!DBA::update('profile', $fields, ['uid' => $uid])) { + return false; + } + + $update = Contact::updateSelfFromUserID($uid); + + $owner = User::getOwnerDataById($uid); + if (empty($owner)) { + return false; + } + + if ($old_owner['name'] != $owner['name']) { + User::update(['username' => $owner['name']], $uid); + } + + $profile_fields = ['postal-code', 'dob', 'prv_keywords', 'homepage']; + foreach ($profile_fields as $field) { + if ($old_owner[$field] != $owner[$field]) { + $update = true; + } + } + + if ($update) { + self::publishUpdate($uid, ($old_owner['net-publish'] != $owner['net-publish'])); + } + + return true; + } + + /** + * Publish a changed profile + * @param int $uid + * @param bool $force Force publishing to the directory + */ + public static function publishUpdate(int $uid, bool $force = false) + { + $owner = User::getOwnerDataById($uid); + if (empty($owner)) { + return; + } + + if ($owner['net-publish'] || $force) { + // Update global directory in background + if (Search::getGlobalDirectory()) { + Worker::add(PRIORITY_LOW, 'Directory', $owner['url']); + } + } + + Worker::add(PRIORITY_LOW, 'ProfileUpdate', $uid); + } + /** * Returns a formatted location string from the given profile array * @@ -216,24 +283,17 @@ class Profile } /** - * Get all profile data of a local user - * - * If the viewer is an authenticated remote viewer, the profile displayed is the - * one that has been configured for his/her viewing in the Contact manager. - * Passing a non-zero profile ID can also allow a preview of a selected profile - * by the owner + * Get the profile for the given nick name * * Includes all available profile data * * @param string $nickname nick - * @param int $uid uid - * @param int $profile_id ID of the profile * @return array * @throws \Exception */ - public static function getByNickname($nickname, $uid = 0) + public static function getByNickname($nickname) { - $profile = DBA::selectFirst('owner-view', [], ['nickname' => $nickname, 'uid' => $uid]); + $profile = DBA::selectFirst('owner-view', [], ['nickname' => $nickname]); return $profile; } @@ -263,8 +323,20 @@ class Profile $o = ''; $location = false; - // This function can also use contact information in $profile - $is_contact = !empty($profile['cid']); + // This function can also use contact information in $profile, but the 'cid' + // value is going to be coming from 'owner-view', which means it's the wrong + // contact ID for the user viewing this page. Use 'nurl' to look up the + // correct contact table entry for the logged-in user. + $profile_contact = []; + + if (!empty($profile['nurl'] ?? '')) { + if (local_user() && ($profile['uid'] ?? '') != local_user()) { + $profile_contact = Contact::getById(Contact::getIdForURL($profile['nurl'], local_user())); + } + if (!empty($profile['cid']) && self::getMyURL()) { + $profile_contact = Contact::selectFirst(['rel'], ['id' => $profile['cid']]); + } + } if (empty($profile['nickname'])) { Logger::warning('Received profile with no nickname', ['profile' => $profile, 'callstack' => System::callstack(10)]); @@ -292,16 +364,12 @@ class Profile $subscribe_feed_link = null; $wallmessage_link = null; + // Who is the logged-in user to this profile? $visitor_contact = []; if (!empty($profile['uid']) && self::getMyURL()) { $visitor_contact = Contact::selectFirst(['rel'], ['uid' => $profile['uid'], 'nurl' => Strings::normaliseLink(self::getMyURL())]); } - $profile_contact = []; - if (!empty($profile['cid']) && self::getMyURL()) { - $profile_contact = Contact::selectFirst(['rel'], ['id' => $profile['cid']]); - } - $profile_is_dfrn = $profile['network'] == Protocol::DFRN; $profile_is_native = in_array($profile['network'], Protocol::NATIVE_SUPPORT); $local_user_is_self = self::getMyURL() && ($profile['url'] == self::getMyURL()); @@ -332,17 +400,19 @@ class Profile $subscribe_feed_link = 'dfrn_poll/' . $profile['nickname']; } - if (Contact::canReceivePrivateMessages($profile)) { + if (Contact::canReceivePrivateMessages($profile_contact)) { if ($visitor_is_followed || $visitor_is_following) { - $wallmessage_link = $visitor_base_path . '/message/new/' . base64_encode($profile['addr'] ?? ''); + $wallmessage_link = $visitor_base_path . '/message/new/' . $profile_contact['id']; } elseif ($visitor_is_authenticated && !empty($profile['unkmail'])) { $wallmessage_link = 'wallmessage/' . $profile['nickname']; } } } - // show edit profile to yourself - if (!$is_contact && $local_user_is_self) { + // show edit profile to yourself, but only if this is not meant to be + // rendered as a "contact". i.e., if 'self' (a "contact" table column) isn't + // set in $profile. + if (!isset($profile['self']) && $local_user_is_self) { $profile['edit'] = [DI::baseUrl() . '/settings/profile', DI::l10n()->t('Edit profile'), '', DI::l10n()->t('Edit profile')]; $profile['menu'] = [ 'chg_photo' => DI::l10n()->t('Change profile photo'),