X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FRepository%2FProfileField.php;h=bf7ac69d6131f28ed101c33dcd4d042dc2156805;hb=5a8f2021584ed86489b056037ca1ed673f26270f;hp=d04104898add8cea72ec7da6ee17c1fea6614c89;hpb=d11a0d3814ef4ae43f30fdfd5e6a02b193ac9647;p=friendica.git diff --git a/src/Repository/ProfileField.php b/src/Repository/ProfileField.php index d04104898a..bf7ac69d61 100644 --- a/src/Repository/ProfileField.php +++ b/src/Repository/ProfileField.php @@ -1,12 +1,34 @@ . + * + */ namespace Friendica\Repository; use Friendica\BaseModel; use Friendica\BaseRepository; use Friendica\Collection; +use Friendica\Core\L10n; use Friendica\Database\Database; +use Friendica\Database\DBA; use Friendica\Model; +use Friendica\Util\ACLFormatter; use Friendica\Util\DateTimeFormat; use Psr\Log\LoggerInterface; @@ -20,12 +42,18 @@ class ProfileField extends BaseRepository /** @var PermissionSet */ private $permissionSet; + /** @var ACLFormatter */ + private $aclFormatter; + /** @var L10n */ + private $l10n; - public function __construct(Database $dba, LoggerInterface $logger, PermissionSet $permissionSet) + public function __construct(Database $dba, LoggerInterface $logger, PermissionSet $permissionSet, ACLFormatter $aclFormatter, L10n $l10n) { parent::__construct($dba, $logger); $this->permissionSet = $permissionSet; + $this->aclFormatter = $aclFormatter; + $this->l10n = $l10n; } /** @@ -59,17 +87,17 @@ class ProfileField extends BaseRepository } /** - * @param array $condition - * @param array $params + * @param array $condition + * @param array $params + * @param int|null $min_id * @param int|null $max_id - * @param int|null $since_id - * @param int $limit + * @param int $limit * @return Collection\ProfileFields * @throws \Exception */ - public function selectByBoundaries(array $condition = [], array $params = [], int $max_id = null, int $since_id = null, int $limit = self::LIMIT) + public function selectByBoundaries(array $condition = [], array $params = [], int $min_id = null, int $max_id = null, int $limit = self::LIMIT) { - return parent::selectByBoundaries($condition, $params, $max_id, $since_id, $limit); + return parent::selectByBoundaries($condition, $params, $min_id, $max_id, $limit); } /** @@ -132,4 +160,160 @@ class ProfileField extends BaseRepository return parent::update($model); } + + /** + * @param int $uid User Id + * @param Collection\ProfileFields $profileFields Collection of existing profile fields + * @param array $profileFieldInputs Array of profile field form inputs indexed by profile field id + * @param array $profileFieldOrder List of profile field id in order + * @return Collection\ProfileFields + * @throws \Exception + */ + public function updateCollectionFromForm(int $uid, Collection\ProfileFields $profileFields, array $profileFieldInputs, array $profileFieldOrder) + { + // Returns an associative array of id => order values + $profileFieldOrder = array_flip($profileFieldOrder); + + // Creation of the new field + if (!empty($profileFieldInputs['new']['label'])) { + $psid = $this->permissionSet->getIdFromACL( + $uid, + $this->aclFormatter->toString($profileFieldInputs['new']['contact_allow'] ?? ''), + $this->aclFormatter->toString($profileFieldInputs['new']['group_allow'] ?? ''), + $this->aclFormatter->toString($profileFieldInputs['new']['contact_deny'] ?? ''), + $this->aclFormatter->toString($profileFieldInputs['new']['group_deny'] ?? '') + ); + + $newProfileField = $this->insert([ + 'uid' => $uid, + 'label' => $profileFieldInputs['new']['label'], + 'value' => $profileFieldInputs['new']['value'], + 'psid' => $psid, + 'order' => $profileFieldOrder['new'], + ]); + + $profileFieldInputs[$newProfileField->id] = $profileFieldInputs['new']; + $profileFieldOrder[$newProfileField->id] = $profileFieldOrder['new']; + + $profileFields[] = $newProfileField; + } + + unset($profileFieldInputs['new']); + unset($profileFieldOrder['new']); + + // Prunes profile field whose label has been emptied + $profileFields = $profileFields->filter(function (Model\ProfileField $profileField) use (&$profileFieldInputs, &$profileFieldOrder) { + $keepModel = !isset($profileFieldInputs[$profileField->id]) || !empty($profileFieldInputs[$profileField->id]['label']); + + if (!$keepModel) { + unset($profileFieldInputs[$profileField->id]); + unset($profileFieldOrder[$profileField->id]); + $this->delete($profileField); + } + + return $keepModel; + }); + + // Regenerates the order values if items were deleted + $profileFieldOrder = array_flip(array_keys($profileFieldOrder)); + + // Update existing profile fields from form values + $profileFields = $profileFields->map(function (Model\ProfileField $profileField) use ($uid, &$profileFieldInputs, &$profileFieldOrder) { + if (isset($profileFieldInputs[$profileField->id]) && isset($profileFieldOrder[$profileField->id])) { + $psid = $this->permissionSet->getIdFromACL( + $uid, + $this->aclFormatter->toString($profileFieldInputs[$profileField->id]['contact_allow'] ?? ''), + $this->aclFormatter->toString($profileFieldInputs[$profileField->id]['group_allow'] ?? ''), + $this->aclFormatter->toString($profileFieldInputs[$profileField->id]['contact_deny'] ?? ''), + $this->aclFormatter->toString($profileFieldInputs[$profileField->id]['group_deny'] ?? '') + ); + + $profileField->psid = $psid; + $profileField->label = $profileFieldInputs[$profileField->id]['label']; + $profileField->value = $profileFieldInputs[$profileField->id]['value']; + $profileField->order = $profileFieldOrder[$profileField->id]; + + unset($profileFieldInputs[$profileField->id]); + unset($profileFieldOrder[$profileField->id]); + } + + return $profileField; + }); + + return $profileFields; + } + + /** + * Migrates a legacy profile to the new slimmer profile with extra custom fields. + * Multi profiles are converted to ACl-protected custom fields and deleted. + * + * @param array $profile Profile table row + * @throws \Exception + */ + public function migrateFromLegacyProfile(array $profile) + { + // Already processed, aborting + if ($profile['is-default'] === null) { + return; + } + + if (!$profile['is-default']) { + $contacts = Model\Contact::selectToArray(['id'], ['uid' => $profile['uid'], 'profile-id' => $profile['id']]); + if (!count($contacts)) { + // No contact visibility selected defaults to user-only permission + $contacts = Model\Contact::selectToArray(['id'], ['uid' => $profile['uid'], 'self' => true]); + } + + $allow_cid = $this->aclFormatter->toString(array_column($contacts, 'id')); + } + + $psid = $this->permissionSet->getIdFromACL($profile['uid'], $allow_cid ?? ''); + + $order = 1; + + $custom_fields = [ + 'hometown' => $this->l10n->t('Hometown:'), + 'marital' => $this->l10n->t('Marital Status:'), + 'with' => $this->l10n->t('With:'), + 'howlong' => $this->l10n->t('Since:'), + 'sexual' => $this->l10n->t('Sexual Preference:'), + 'politic' => $this->l10n->t('Political Views:'), + 'religion' => $this->l10n->t('Religious Views:'), + 'likes' => $this->l10n->t('Likes:'), + 'dislikes' => $this->l10n->t('Dislikes:'), + 'pdesc' => $this->l10n->t('Title/Description:'), + 'summary' => $this->l10n->t('Summary'), + 'music' => $this->l10n->t('Musical interests'), + 'book' => $this->l10n->t('Books, literature'), + 'tv' => $this->l10n->t('Television'), + 'film' => $this->l10n->t('Film/dance/culture/entertainment'), + 'interest' => $this->l10n->t('Hobbies/Interests'), + 'romance' => $this->l10n->t('Love/romance'), + 'work' => $this->l10n->t('Work/employment'), + 'education' => $this->l10n->t('School/education'), + 'contact' => $this->l10n->t('Contact information and Social Networks'), + ]; + + foreach ($custom_fields as $field => $label) { + if (!empty($profile[$field]) && $profile[$field] > DBA::NULL_DATE && $profile[$field] > DBA::NULL_DATETIME) { + $this->insert([ + 'uid' => $profile['uid'], + 'psid' => $psid, + 'order' => $order++, + 'label' => trim($label, ':'), + 'value' => $profile[$field], + ]); + } + + $profile[$field] = null; + } + + if ($profile['is-default']) { + $profile['profile-name'] = null; + $profile['is-default'] = null; + $this->dba->update('profile', $profile, ['id' => $profile['id']]); + } elseif (!empty($profile['id'])) { + $this->dba->delete('profile', ['id' => $profile['id']]); + } + } }