const NETWORKING_IM = 0x020000;
const NETWORKING_SOCIAL = 0x040000;
- const FETCH_ADDRESSES = 0x00001;
- const FETCH_CORPS = 0x00002;
- const FETCH_EDU = 0x00004;
- const FETCH_JOBS = 0x00008;
- const FETCH_MEDALS = 0x00010;
- const FETCH_NETWORKING = 0x00020;
- const FETCH_PHONES = 0x00040;
- const FETCH_PHOTO = 0x00080;
-
- const FETCH_ALL = 0x000FF;
+ const FETCH_ADDRESSES = 0x000001;
+ const FETCH_CORPS = 0x000002;
+ const FETCH_EDU = 0x000004;
+ const FETCH_JOBS = 0x000008;
+ const FETCH_MEDALS = 0x000010;
+ const FETCH_NETWORKING = 0x000020;
+ const FETCH_PHONES = 0x000040;
+ const FETCH_PHOTO = 0x000080;
+
+ // xor of all FETCH_XYZ
+ const FETCH_ALL = 0x0000FF;
private $pid;
private $hrpid;
$this->hrpid = $this->data['hrpid'];
if (!S::logged()) {
$this->setVisibilityLevel(self::VISIBILITY_PUBLIC);
+ } else {
+ $this->setVisibilityLevel(self::VISIBILITY_PRIVATE);
}
}
return $this->sex == PlUser::GENDER_FEMALE;
}
+ public function isDead()
+ {
+ return ($this->deathdate != null);
+ }
+
public function data()
{
$this->first_name;
return self::$v_values[$visibility];
}
+ private function getProfileField($cls)
+ {
+ return ProfileField::getForPID($cls, $this->id(), $this->visibility);
+ }
+
+ /** Consolidates internal data (addresses, phones, jobs)
+ */
+ private function consolidateFields()
+ {
+ if ($this->phones != null) {
+ if ($this->addresses != null) {
+ $this->addresses->addPhones($this->phones);
+ }
+
+ if ($this->jobs != null) {
+ $this->jobs->addPhones($this->phones);
+ }
+ }
+
+ if ($this->addresses != null && $this->jobs != null) {
+ $this->jobs->addAddresses($this->addresses);
+ }
+ }
+
/* Photo
*/
private $photo = null;
public function getPhoto($fallback = true)
{
+ if ($this->photo == null) {
+ $this->setPhoto($this->getProfileField('ProfilePhoto'));
+ }
+
if ($this->photo != null) {
return $this->photo->pic;
} else if ($fallback) {
public function setAddresses(ProfileAddresses $addr)
{
$this->addresses = $addr;
+ $this->consolidateFields();
}
public function getAddresses($flags, $limit = null)
{
if ($this->addresses == null) {
- return PlIteratorUtils::fromArray(array());
- } else {
- return $this->addresses->get($flags, $limit);
+ $this->setAddresses($this->getProfileField('ProfileAddresses'));
}
+
+ if ($this->addresses == null) {
+ return PlIteratorUtils::emptyIterator();
+ }
+ return $this->addresses->get($flags, $limit);
}
public function getMainAddress()
}
}
+ /* Phones
+ */
+ private $phones = null;
+ public function setPhones(ProfilePhones $phones)
+ {
+ $this->phones = $phones;
+ $this->consolidateFields();
+ }
+
+ public function getPhones($flags, $limit = null)
+ {
+ if ($this->phones == null) {
+ $this->setPhones($this->getProfileField('ProfilePhones'));
+ }
+
+ if ($this->phones == null) {
+ return PlIteratorUtils::emptyIterator();
+ }
+ return $this->phones->get($flags, $limit);
+ }
/* Educations
*/
- private $educations;
+ private $educations = null;
public function setEducations(ProfileEducation $edu)
{
$this->educations = $edu;
public function getEducations($flags, $limit = null)
{
+ if ($this->educations == null) {
+ $this->setEducations($this->getProfileField('ProfileEducation'));
+ }
+
+ if ($this->educations == null) {
+ return PlIteratorUtils::emptyIterator();
+ }
return $this->educations->get($flags, $limit);
}
/** Networking
*/
+ private $networks = null;
+ public function setNetworking(ProfileNetworking $nw)
+ {
+ $this->networks = $nw;
+ }
public function getNetworking($flags, $limit = null)
{
- $where = XDB::format('pn.pid = {?}', $this->id());
- if ($flags & self::NETWORKING_WEB) {
- $where .= ' AND pn.network_type = 0'; // XXX hardcoded reference to web site index
+ if ($this->networks == null) {
+ $this->setNetworking($this->getProfileField('ProfileNetworking'));
}
- if ($this->visibility) {
- $where .= ' AND pn.pub IN ' . XDB::formatArray($this->visibility);
+ if ($this->networks == null) {
+ return PlIteratorUtils::emptyIterator();
}
- $limit = is_null($limit) ? '' : XDB::format('LIMIT {?}', (int)$limit);
- return XDB::iterator('SELECT pne.name, pne.icon,
- IF (LENGTH(pne.link) > 0, REPLACE(pne.link, \'%s\', pn.address),
- pn.address) AS address
- FROM profile_networking AS pn
- INNER JOIN profile_networking_enum AS pne ON (pn.network_type = pne.network_type)
- WHERE ' . $where . '
- ORDER BY pn.network_type, pn.nwid
- ' . $limit);
+ return $this->networks->get($flags, $limit);
}
public function getWebSite()
/** Jobs
*/
+ private $jobs = null;
+ public function setJobs(ProfileJobs $jobs)
+ {
+ $this->jobs = $jobs;
+ $this->consolidateFields();
+ }
public function getJobs($flags, $limit = null)
{
- $where = XDB::format('pj.pid = {?}', $this->id());
- $cond = 'TRUE';
- if ($this->visibility) {
- $where .= ' AND pj.pub IN ' . XDB::formatArray($this->visibility);
- $cond = 'pj.email_pub IN ' . XDB::formatArray($this->visibility);
- }
- $limit = is_null($limit) ? '' : XDB::format('LIMIT {?}', (int)$limit);
- return XDB::iterator('SELECT pje.name, pje.acronym, pje.url, pje.email, pje.NAF_code,
- pj.description, pj.url AS user_site,
- IF (' . $cond . ', pj.email, NULL) AS user_email,
- pjse.name AS sector, pjsse.name AS subsector,
- pjssse.name AS subsubsector
- FROM profile_job AS pj
- INNER JOIN profile_job_enum AS pje ON (pje.id = pj.jobid)
- LEFT JOIN profile_job_sector_enum AS pjse ON (pjse.id = pj.sectorid)
- LEFT JOIN profile_job_subsector_enum AS pjsse ON (pjsse.id = pj.subsectorid)
- LEFT JOIN profile_job_subsubsector_enum AS pjssse ON (pjssse.id = pj.subsubsectorid)
- WHERE ' . $where . '
- ORDER BY pj.id
- ' . $limit);
- }
-
- public function getMailJob()
+ if ($this->jobs == null) {
+ $this->setJobs($this->getProfileField('ProfileJobs'));
+ }
+
+ if ($this->jobs == null) {
+ return PlIteratorUtils::emptyIterator();
+ }
+ return $this->jobs->get($flags, $limit);
+ }
+
+ public function getMainJob()
{
$job = $this->getJobs(self::JOBS_MAIN, 1);
if ($job->total() != 1) {
FROM profile_binets
WHERE pid = {?}', $this->id());
}
+ public function getBinetsNames()
+ {
+ return XDB::fetchColumn('SELECT text
+ FROM profile_binets AS pb
+ LEFT JOIN profile_binet_enum AS pbe ON (pbe.id = pb.binet_id)
+ WHERE pb.pid = {?}', $this->id());
+ }
+ /* Medals
+ */
+ private $medals = null;
+ public function setMedals(ProfileMedals $medals)
+ {
+ $this->medals = $medals;
+ }
+
+ public function getMedals()
+ {
+ if ($this->medals == null) {
+ $this->setMedals($this->getProfileField('ProfileMedals'));
+ }
+ if ($this->medals == null) {
+ return array();
+ }
+ return $this->medals->medals;
+ }
public function owner()
{
}
- $it = XDB::Iterator('SELECT p.*, p.sex = \'female\' AS sex, pe.entry_year, pe.grad_year,
+ $it = XDB::Iterator('SELECT p.*, p.sex = \'female\' AS sex, pe.entry_year, pe.grad_year, pse.text AS section,
pn_f.name AS firstname, pn_l.name AS lastname, pn_n.name AS nickname,
IF(pn_uf.name IS NULL, pn_f.name, pn_uf.name) AS firstname_ordinary,
IF(pn_ul.name IS NULL, pn_l.name, pn_ul.name) AS lastname_ordinary,
pd.directory_name, pp.display_tel AS mobile, pp.pub AS mobile_pub,
ph.attach IS NOT NULL AS has_photo, ph.pub AS photo_pub,
p.last_change < DATE_SUB(NOW(), INTERVAL 365 DAY) AS is_old,
+ pm.expertise AS mentor_expertise,
ap.uid AS owner_id
FROM profiles AS p
INNER JOIN profile_display AS pd ON (pd.pid = p.pid)
INNER JOIN profile_education AS pe ON (pe.pid = p.pid AND FIND_IN_SET(\'primary\', pe.flags))
+ LEFT JOIN profile_section_enum AS pse ON (pse.id = p.section)
INNER JOIN profile_name AS pn_f ON (pn_f.pid = p.pid
AND pn_f.typeid = ' . self::getNameTypeId('firstname', true) . ')
INNER JOIN profile_name AS pn_l ON (pn_l.pid = p.pid
AND pn_n.typeid = ' . self::getNameTypeId('nickname', true) . ')
LEFT JOIN profile_phones AS pp ON (pp.pid = p.pid AND pp.link_type = \'user\' AND tel_type = \'mobile\')
LEFT JOIN profile_photos AS ph ON (ph.pid = p.pid)
+ LEFT JOIN profile_mentor AS pm ON (pm.pid = p.pid)
LEFT JOIN account_profiles AS ap ON (ap.pid = p.pid AND FIND_IN_SET(\'owner\', ap.perms))
WHERE p.pid IN ' . XDB::formatArray($pids) . '
GROUP BY p.pid
' . $order);
- return new ProfileDataIterator($it, $pids, $fields, $visibility);
+ return new ProfileIterator($it, $pids, $fields, $visibility);
}
public static function getPID($login)
}
}
-class ProfileDataIterator
+
+/** Iterator over a set of Profiles
+ */
+class ProfileIterator implements PlIterator
{
private $iterator = null;
private $fields;
$this->iterator = PlIteratorUtils::parallelIterator($subits, $callbacks, 0);
}
- private function consolidateFields(array $pf)
+ private function hasData($flag, $vals)
{
- if ($this->fields & Profile::FETCH_PHONES) {
- $phones = $pf[Profile::FETCH_PHONES];
-
- if ($this->fields & Profile::FETCH_ADDRESSES && $pf[Profile::FETCH_ADDRESSES] != null) {
- $pf[Profile::FETCH_ADDRESSES]->addPhones($phones);
- }
- if ($this->fields & Profile::FETCH_JOBS && $pf[Profile::FETCH_JOBS] != null) {
- $pf[Profile::FETCH_JOBS]->addPhones($phones);
- }
- }
-
- if ($this->fields & Profile::FETCH_ADDRESSES) {
- $addrs = $pf[Profile::FETCH_ADDRESSES];
- if ($this->fields & Profile::FETCH_JOBS && $pf[Profile::FETCH_JOBS] != null) {
- $pf[Profile::FETCH_JOBS]->addAddresses($addrs);
- }
- }
-
- return $pf;
+ return ($this->fields & $flag) && ($vals[$flag] != null);
}
private function fillProfile(array $vals)
{
- $vals = $this->consolidateFields($vals);
-
$pf = Profile::get($vals[0]);
- if ($this->fields & Profile::FETCH_ADDRESSES) {
- if ($vals[Profile::FETCH_ADDRESSES] != null) {
- $pf->setAddresses($vals[Profile::FETCH_ADDRESSES]);
- }
- }
- if ($this->fields & Profile::FETCH_CORPS) {
- $pf->setCorps($vals[Profile::FETCH_CORPS]);
+ if ($this->hasData(Profile::FETCH_PHONES, $vals)) {
+ $pf->setPhones($vals[Profile::FETCH_PHONES]);
}
- if ($this->fields & Profile::FETCH_EDU) {
- $pf->setEdu($vals[Profile::FETCH_EDU]);
+ if ($this->hasData(Profile::FETCH_ADDRESSES, $vals)) {
+ $pf->setAddresses($vals[Profile::FETCH_ADDRESSES]);
}
- if ($this->fields & Profile::FETCH_JOBS) {
+ if ($this->hasData(Profile::FETCH_JOBS, $vals)) {
$pf->setJobs($vals[Profile::FETCH_JOBS]);
}
- if ($this->fields & Profile::FETCH_MEDALS) {
+
+ if ($this->hasData(Profile::FETCH_CORPS, $vals)) {
+ $pf->setCorps($vals[Profile::FETCH_CORPS]);
+ }
+ if ($this->hasData(Profile::FETCH_EDU, $vals)) {
+ $pf->setEducations($vals[Profile::FETCH_EDU]);
+ }
+ if ($this->hasData(Profile::FETCH_MEDALS, $vals)) {
$pf->setMedals($vals[Profile::FETCH_MEDALS]);
}
- if ($this->fields & Profile::FETCH_NETWORKING) {
+ if ($this->hasData(Profile::FETCH_NETWORKING, $vals)) {
$pf->setNetworking($vals[Profile::FETCH_NETWORKING]);
}
- if ($this->fields & Profile::FETCH_PHONES) {
- $pf->setPhones($vals[Profile::FETCH_PHONES]);
- }
- if ($this->fields & Profile::FETCH_PHOTO) {
- if ($vals[Profile::FETCH_PHOTO] != null) {
- $pf->setPhoto($vals[Profile::FETCH_PHOTO]);
- }
+ if ($this->hasData(Profile::FETCH_PHOTO, $vals)) {
+ $pf->setPhoto($vals[Profile::FETCH_PHOTO]);
}
return $pf;
}
}
-/** Iterator over a set of Profiles
- * @param an XDB::Iterator obtained from a Profile::fetchProfileData
- */
-class ProfileIterator implements PlIterator
-{
- private $pdi;
- private $dbiter;
-
- public function __construct(ProfileDataIterator &$pdi)
- {
- $this->pdi = $pdi;
- $this->dbiter = $pdi->iterator();
- }
-
- public function next()
- {
- $data = $this->dbiter->next();
- if ($data == null) {
- return null;
- } else {
- return $this->pdi->fillProfile(Profile::get($data));
- }
- }
-
- public function total()
- {
- return $this->dbiter->total();
- }
-
- public function first()
- {
- return $this->dbiter->first();
- }
-
- public function last()
- {
- return $this->dbiter->last();
- }
-}
-
// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
?>