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;
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
*
}
/**
- * 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;
}
// 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.
- $is_contact = !empty($profile['nurl']);
$profile_contact = [];
- if ($is_contact) {
+ if (!empty($profile['nurl'] ?? '')) {
if (local_user() && ($profile['uid'] ?? '') != local_user()) {
$profile_contact = Contact::getById(Contact::getIdForURL($profile['nurl'], local_user()));
- } else {
- $profile_contact = $profile;
+ }
+ if (!empty($profile['cid']) && self::getMyURL()) {
+ $profile_contact = Contact::selectFirst(['rel'], ['id' => $profile['cid']]);
}
}
}
}
- // 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'),