<?php
/**
* @defgroup identity Identity
* Implements an abstract identity underlying e.g. User and Author records.
*/
/**
* @file classes/identity/Identity.php
*
* Copyright (c) 2014-2021 Simon Fraser University
* Copyright (c) 2000-2021 John Willinsky
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
*
* @class Identity
*
* @ingroup identity
*
* @brief Basic class providing common functionality for users and authors in the system.
*/
namespace PKP\identity;
use APP\core\Application;
use PKP\facades\Locale;
class Identity extends \PKP\core\DataObject
{
public const IDENTITY_SETTING_GIVENNAME = 'givenName';
public const IDENTITY_SETTING_FAMILYNAME = 'familyName';
/**
* Get the default/fall back locale the values should exist for
*/
public function getDefaultLocale(): ?string
{
// The users register for the site, thus
// the site primary locale is the default locale
return Application::get()->getRequest()->getSite()->getPrimaryLocale();
}
/**
* Get the identity's localized complete name.
* Includes given name and family name.
*
* @param bool $preferred If the preferred public name should be used, if exist
* @param bool $familyFirst False / default: Givenname Familyname
* If true: Familyname, Givenname
* @param string $preferredLocale The locale the full name is requested for. If null, the user locale will be used.
*/
public function getFullName(bool $preferred = true, bool $familyFirst = false, string $preferredLocale = null): string
{
$locale = $preferredLocale ?? Locale::getLocale();
if ($preferred) {
$preferredPublicName = $this->getPreferredPublicName($locale);
if (!empty($preferredPublicName)) {
return $preferredPublicName;
}
}
$givenName = $this->getGivenName($locale);
if (empty($givenName)) {
$locale = $this->getDefaultLocale();
$givenName = $this->getGivenName($locale);
}
$familyName = $this->getFamilyName($locale);
if ($familyFirst) {
return ($familyName != '' ? "{$familyName}, " : '') . $givenName;
} else {
return $givenName . ($familyName != '' ? " {$familyName}" : '');
}
}
/**
* Get the identity's all complete names.
* Includes given name and family name.
*
* @param bool $preferred If the preferred public name should be used, if exist
* @param bool $familyFirst False / default: Givenname Familyname
* If true: Familyname, Givenname
*/
public function getFullNames(bool $preferred = true, bool $familyFirst = false): array
{
if ($preferred) {
$preferredPublicNames = $this->getPreferredPublicName(null);
if (!empty($preferredPublicNames)) {
return $preferredPublicNames;
}
}
$fullNames = [];
$givenNames = $this->getGivenName(null);
foreach ($givenNames as $locale => $givenName) {
$familyName = $this->getFamilyName($locale);
if ($familyFirst) {
$fullNames[$locale] = ($familyName != '' ? "{$familyName}, " : '') . $givenName;
} else {
$fullNames[$locale] = $givenName . ($familyName != '' ? " {$familyName}" : '');
}
}
return $fullNames;
}
/**
* Get given name.
*
* @param string $locale
*
* @return string|array
*/
public function getGivenName($locale)
{
return $this->getData(self::IDENTITY_SETTING_GIVENNAME, $locale);
}
/**
* Set given name.
*
* @param string $givenName
* @param string $locale
*/
public function setGivenName($givenName, $locale)
{
$this->setData(self::IDENTITY_SETTING_GIVENNAME, $givenName, $locale);
}
/**
* Get the localized given name
*
* @return string
*/
public function getLocalizedGivenName()
{
return $this->getLocalizedData(self::IDENTITY_SETTING_GIVENNAME);
}
/**
* Get family name.
*
* @param string $locale
*
* @return string|array
*/
public function getFamilyName($locale)
{
return $this->getData(self::IDENTITY_SETTING_FAMILYNAME, $locale);
}
/**
* Set family name.
*
* @param string $familyName
* @param string $locale
*/
public function setFamilyName($familyName, $locale)
{
$this->setData(self::IDENTITY_SETTING_FAMILYNAME, $familyName, $locale);
}
/**
* Get the localized family name
* Return family name for the locale first name exists in
*
* @return string
*/
public function getLocalizedFamilyName()
{
$locale = Locale::getLocale();
$givenName = $this->getGivenName($locale);
// Only use the family name if a given name exists (to avoid mixing locale data)
if (!empty($givenName)) {
return $this->getFamilyName($locale);
}
// Fall back on the site locale.
$site = Application::get()->getRequest()->getSite();
$locale = $site->getPrimaryLocale();
return $this->getFamilyName($locale);
}
/**
* Get preferred public name.
*
* @param string $locale
*
* @return string
*/
public function getPreferredPublicName($locale)
{
return $this->getData('preferredPublicName', $locale);
}
/**
* Set preferred public name.
*
* @param string $preferredPublicName
* @param string $locale
*/
public function setPreferredPublicName($preferredPublicName, $locale)
{
$this->setData('preferredPublicName', $preferredPublicName, $locale);
}
/**
* Get affiliation (position, institution, etc.).
*
* @param string $locale
*
* @return string|array
*/
public function getAffiliation($locale)
{
return $this->getData('affiliation', $locale);
}
/**
* Set affiliation.
*
* @param string $affiliation
* @param string $locale
*/
public function setAffiliation($affiliation, $locale)
{
$this->setData('affiliation', $affiliation, $locale);
}
/**
* Get the localized affiliation
*/
public function getLocalizedAffiliation()
{
return $this->getLocalizedData('affiliation');
}
/**
* Get email address.
*
* @return string
*/
public function getEmail()
{
return $this->getData('email');
}
/**
* Set email address.
*
* @param string $email
*/
public function setEmail($email)
{
$this->setData('email', $email);
}
/**
* Get ORCID identifier
*
* @return string
*/
public function getOrcid()
{
return $this->getData('orcid');
}
/**
* Set ORCID identifier.
*
* @param string $orcid
*/
public function setOrcid($orcid)
{
$this->setData('orcid', $orcid);
}
/**
* Get country code (ISO 3166-1 two-letter codes)
*
* @return string
*/
public function getCountry()
{
return $this->getData('country');
}
/**
* Get localized country
*
* @return ?string
*/
public function getCountryLocalized()
{
$countryCode = $this->getCountry();
if (!$countryCode) {
return null;
}
$country = Locale::getCountries()->getByAlpha2($countryCode);
return $country ? $country->getLocalName() : null;
}
/**
* Set country code (ISO 3166-1 two-letter codes)
*
* @param string $country
*/
public function setCountry($country)
{
$this->setData('country', $country);
}
/**
* Get URL.
*
* @return string
*/
public function getUrl()
{
return $this->getData('url');
}
/**
* Set URL.
*
* @param string $url
*/
public function setUrl($url)
{
$this->setData('url', $url);
}
/**
* Get the localized biography
*
* @return string
*/
public function getLocalizedBiography()
{
return $this->getLocalizedData('biography');
}
/**
* Get biography.
*
* @param string $locale
*
* @return string|array<string,string>
*/
public function getBiography($locale)
{
return $this->getData('biography', $locale);
}
/**
* Set biography.
*
* @param string $biography
* @param string $locale
*/
public function setBiography($biography, $locale)
{
$this->setData('biography', $biography, $locale);
}
}
if (!PKP_STRICT_MODE) {
class_alias('\PKP\identity\Identity', '\Identity');
foreach (['IDENTITY_SETTING_GIVENNAME', 'IDENTITY_SETTING_FAMILYNAME'] as $constantName) {
define($constantName, constant('\Identity::' . $constantName));
}
}
|