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_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);
}
}
/** Returns the best visibility context toward $visibility
* @param $visibility A wished visibility level
- * @return The closest allowed visibility level
+ * @return An array of compatible visibilities
*
* if $visibility is null, the best visibility is returned
*/
$minvis = self::VISIBILITY_PUBLIC;
}
if ($visibility == null) {
- $visibility = array($minvis);
+ $visibility = $minvis;
}
if ($minvis == self::VISIBILITY_PUBLIC) {
- $visibility = array(self::VISIBILITY_PUBLIC);
+ $visibility = self::VISIBILITY_PUBLIC;
}
+ $visibility = self::$v_values[$visibility];
self::$contexts[$asked_vis] = $visibility;
return $visibility;
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) {
}
return null;
}
- /*
- $cond = '';
- if ($this->visibility) {
- $cond = ' AND pub IN ' . XDB::formatArray($this->visibility);
- }
- $res = XDB::query("SELECT *
- FROM profile_photos
- WHERE attachmime IN ('jpeg', 'png')
- " . $cond . ' AND pid = {?}',
- $this->id());
- if ($res->numRows() > 0) {
- $photo = $res->fetchOneAssoc();
- return PlImage::fromData($photo['attach'], 'image/' . $photo['attachmime'],
- $photo['x'], $photo['y']);
- } else if ($fallback) {
- return PlImage::fromFile(dirname(__FILE__).'/../htdocs/images/none.png',
- 'image/png');
- }
- return null;
- }
- */
+
/* Addresses
*/
+ private $addresses = null;
+ public function setAddresses(ProfileAddresses $addr)
+ {
+ $this->addresses = $addr;
+ $this->consolidateFields();
+ }
+
public function getAddresses($flags, $limit = null)
{
- $where = XDB::format('pa.pid = {?}', $this->id());
- if ($flags & self::ADDRESS_MAIN) {
- $where .= ' AND FIND_IN_SET(\'current\', pa.flags)';
- }
- if ($flags & self::ADDRESS_POSTAL) {
- $where .= ' AND FIND_IN_SET(\'mail\', pa.flags)';
- }
- if ($this->visibility) {
- $where .= ' AND pa.pub IN ' . XDB::formatArray($this->visibility);
- }
- $type = array();
- if ($flags & self::ADDRESS_PRO) {
- $type[] = 'job';
- }
- if ($flags & self::ADDRESS_PERSO) {
- $type[] = 'home';
- }
- if (count($type) > 0) {
- $where .= ' AND pa.type IN ' . XDB::formatArray($type);
- }
- $limit = is_null($limit) ? '' : XDB::format('LIMIT {?}', (int)$limit);
- return XDB::iterator('SELECT pa.text, pa.postalCode, pa.type, pa.latitude, pa.longitude,
- gl.name AS locality, gas.name AS subAdministrativeArea,
- ga.name AS administrativeArea, gc.countryFR AS country,
- ppfix.display_tel AS fixed_tel, ppfax.display_tel AS fax_tel,
- FIND_IN_SET(\'current\', pa.flags) AS current,
- FIND_IN_SET(\'temporary\', pa.flags) AS temporary,
- FIND_IN_SET(\'secondary\', pa.flags) AS secondary,
- FIND_IN_SET(\'mail\', pa.flags) AS mail, pa.type
- FROM profile_addresses AS pa
- LEFT JOIN geoloc_localities AS gl ON (gl.id = pa.localityId)
- LEFT JOIN geoloc_administrativeareas AS ga ON (ga.id = pa.administrativeAreaId)
- LEFT JOIN geoloc_administrativeareas AS gas ON (gas.id = pa.subAdministrativeAreaId)
- LEFT JOIN geoloc_countries AS gc ON (gc.iso_3166_1_a2 = pa.countryId)
- LEFT JOIN profile_phones AS ppfix ON (ppfix.link_type = \'address\' AND ppfix.pid = pa.pid AND ppfix.link_id = pa.id AND ppfix.tel_type = \'fixed\')
- LEFT JOIN profile_phones AS ppfax ON (ppfax.link_type = \'address\' AND ppfax.pid = pa.pid AND ppfax.link_id = pa.id AND ppfax.tel_type = \'fax\')
- WHERE ' . $where . '
- ORDER BY pa.id
- ' . $limit);
+ if ($this->addresses == null) {
+ $this->setAddresses($this->getProfileField('ProfileAddresses'));
+ }
+
+ if ($this->addresses == null) {
+ return PlIteratorUtils::emptyIterator();
+ }
+ return $this->addresses->get($flags, $limit);
}
public function getMainAddress()
/* Educations
*/
+ private $educations = null;
+ public function setEducations(ProfileEducation $edu)
+ {
+ $this->educations = $edu;
+ }
+
public function getEducations($flags, $limit = null)
{
- $where = XDB::format('pe.pid = {?}', $this->id());
- if ($flags & self::EDUCATION_MAIN) {
- $where .= ' AND FIND_IN_SET(\'primary\', pe.flags)';
- } else if ($flags & self::EDUCATION_EXTRA) {
- $where .= ' AND NOT FIND_IN_SET(\'primary\', pe.flags)';
- } else if ($flags & self::EDUCATION_FINISHED) {
- $where .= ' AND pe.grad_year <= YEAR(CURDATE())';
- } else if ($flags & self::EDUCATION_CURRENT) {
- $where .= ' AND pe.grad_year > YEAR(CURDATE())';
- }
- $limit = is_null($limit) ? '' : XDB::format('LIMIT {?}', (int)$limit);
- return XDB::iterator('SELECT pe.entry_year, pe.grad_year, pe.program,
- pee.name AS school, pee.abbreviation AS school_short, pee.url AS school_url, gc.countryFR AS country,
- pede.degree, pede.abbreviation AS degree_short, pede.level AS degree_level, pefe.field,
- FIND_IN_SET(\'primary\', pe.flags) AS prim
- FROM profile_education AS pe
- INNER JOIN profile_education_enum AS pee ON (pe.eduid = pee.id)
- LEFT JOIN geoloc_countries AS gc ON (gc.iso_3166_1_a2 = pee.country)
- INNER JOIN profile_education_degree_enum AS pede ON (pe.degreeid = pede.id)
- LEFT JOIN profile_education_field_enum AS pefe ON (pe.fieldid = pefe.id)
- WHERE ' . $where . '
- ORDER BY NOT FIND_IN_SET(\'primary\', pe.flags), pe.entry_year, pe.id
- ' . $limit);
+ if ($this->educations == null) {
+ $this->setEducations($this->getProfileField('ProfileEducation'));
+ }
+
+ if ($this->educations == null) {
+ return PlIteratorUtils::emptyIterator();
+ }
+ return $this->educations->get($flags, $limit);
}
public function getExtraEducations($limit = null)
/** 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,
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
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)
/** Return profiles for the list of pids.
*/
- public static function getBulkProfilesWithPIDs(array $pids, $fields = 0x0000, $visibility = null)
+ public static function getBulkProfilesWithPIDs(array $pids, $fields = self::FETCH_ADDRESSES, $visibility = null)
{
if (count($pids) == 0) {
return array();
}
}
-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]->addPhones($phones);
- }
- if ($this->fields & Profile::FETCH_JOBS) {
- $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]->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 ($this->hasData(Profile::FETCH_PHONES, $vals)) {
+ $pf->setPhones($vals[Profile::FETCH_PHONES]);
+ }
+ if ($this->hasData(Profile::FETCH_ADDRESSES, $vals)) {
$pf->setAddresses($vals[Profile::FETCH_ADDRESSES]);
}
- if ($this->fields & Profile::FETCH_CORPS) {
- $pf->setCorps($vals[Profile::FETCH_CORPS]);
+ if ($this->hasData(Profile::FETCH_JOBS, $vals)) {
+ $pf->setJobs($vals[Profile::FETCH_JOBS]);
}
- if ($this->fields & Profile::FETCH_EDU) {
- $pf->setEdu($vals[Profile::FETCH_EDU]);
+
+ if ($this->hasData(Profile::FETCH_CORPS, $vals)) {
+ $pf->setCorps($vals[Profile::FETCH_CORPS]);
}
- if ($this->fields & Profile::FETCH_JOBS) {
- $pf->setJobs($vals[Profile::FETCH_JOBS]);
+ if ($this->hasData(Profile::FETCH_EDU, $vals)) {
+ $pf->setEducations($vals[Profile::FETCH_EDU]);
}
- if ($this->fields & Profile::FETCH_MEDALS) {
+ 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:
?>