* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
***************************************************************************/
-class ProfileVisibility
-{
- static private $v_values = array(self::VIS_PUBLIC => array(self::VIS_PUBLIC),
- self::VIS_AX => array(self::VIS_AX, self::VIS_PUBLIC),
- self::VIS_PRIVATE => array(self::VIS_PRIVATE, self::VIS_AX, self::VIS_PUBLIC));
-
- const VIS_PUBLIC = 'public';
- const VIS_AX = 'ax';
- const VIS_PRIVATE = 'private';
-
- private $level;
-
- public function __construct($level = null)
- {
- $this->setLevel($level);
- }
-
- public function setLevel($level = self::VIS_PUBLIC)
- {
- if ($level != null && $level != self::VIS_PRIVATE && $level != self::VIS_AX && $level != self::VIS_PUBLIC) {
- Platal::page()->kill("Invalid visibility: " . $level);
- }
-
- if (!S::logged()) {
- $level = self::VIS_PUBLIC;
- } else if ($level == null) {
- $level = self::VIS_PRIVATE;
- }
-
- if ($this->level == null || $this->level == self::VIS_PRIVATE) {
- $this->level = $level;
- } else if ($this->level == self::VIS_AX && $level == self::VIS_PRIVATE) {
- return;
- } else {
- $this->level = self::VIS_PUBLIC;
- }
- }
-
- public function level()
- {
- if ($this->level == null) {
- return self::VIS_PUBLIC;
- } else {
- return $this->level;
- }
- }
-
- public function levels()
- {
- return self::$v_values[$this->level()];
- }
-
- public function isVisible($visibility)
- {
- return in_array($visibility, $this->levels());
- }
-}
-
class Profile
{
self::FIRSTNAME => array(self::VN_ORDINARY, self::VN_INI, self::VN_OTHER)
);
- const ADDRESS_MAIN = 0x000001;
- const ADDRESS_PERSO = 0x000002;
- const ADDRESS_PRO = 0x000004;
- const ADDRESS_ALL = 0x000006;
- const ADDRESS_POSTAL = 0x000008;
-
- const EDUCATION_MAIN = 0x000010;
- const EDUCATION_EXTRA = 0x000020;
- const EDUCATION_ALL = 0x000040;
- const EDUCATION_FINISHED = 0x000080;
- const EDUCATION_CURRENT = 0x000100;
-
- const JOBS_MAIN = 0x001000;
- const JOBS_ALL = 0x002000;
- const JOBS_FINISHED = 0x004000;
- const JOBS_CURRENT = 0x008000;
-
- const NETWORKING_ALL = 0x000000;
- const NETWORKING_WEB = 0x010000;
- const NETWORKING_IM = 0x020000;
- const NETWORKING_SOCIAL = 0x040000;
+ const ADDRESS_MAIN = 0x00000001;
+ const ADDRESS_PERSO = 0x00000002;
+ const ADDRESS_PRO = 0x00000004;
+ const ADDRESS_ALL = 0x00000006;
+ const ADDRESS_POSTAL = 0x00000008;
+
+ const EDUCATION_MAIN = 0x00000010;
+ const EDUCATION_EXTRA = 0x00000020;
+ const EDUCATION_ALL = 0x00000040;
+ const EDUCATION_FINISHED = 0x00000080;
+ const EDUCATION_CURRENT = 0x00000100;
+
+ const JOBS_MAIN = 0x00001000;
+ const JOBS_ALL = 0x00002000;
+ const JOBS_FINISHED = 0x00004000;
+ const JOBS_CURRENT = 0x00008000;
+
+ const NETWORKING_ALL = 0x00070000;
+ const NETWORKING_WEB = 0x00010000;
+ const NETWORKING_IM = 0x00020000;
+ const NETWORKING_SOCIAL = 0x00040000;
+
+ const PHONE_LINK_JOB = 0x00100000;
+ const PHONE_LINK_ADDRESS = 0x00200000;
+ const PHONE_LINK_PROFILE = 0x00400000;
+ const PHONE_LINK_COMPANY = 0x00800000;
+ const PHONE_LINK_ANY = 0x00F00000;
+
+ const PHONE_TYPE_FAX = 0x01000000;
+ const PHONE_TYPE_FIXED = 0x02000000;
+ const PHONE_TYPE_MOBILE = 0x04000000;
+ const PHONE_TYPE_ANY = 0x07000000;
+
+ const PHONE_ANY = 0x07F00000;
const FETCH_ADDRESSES = 0x000001;
const FETCH_CORPS = 0x000002;
const FETCH_JOBS = 0x000008;
const FETCH_MEDALS = 0x000010;
const FETCH_NETWORKING = 0x000020;
- const FETCH_MENTOR_SECTOR = 0x000040;
const FETCH_MENTOR_COUNTRY = 0x000080;
const FETCH_PHONES = 0x000100;
+ const FETCH_JOB_TERMS = 0x000200;
+ const FETCH_MENTOR_TERMS = 0x000400;
const FETCH_MINIFICHES = 0x00012D; // FETCH_ADDRESSES | FETCH_EDU | FETCH_JOBS | FETCH_NETWORKING | FETCH_PHONES
- const FETCH_ALL = 0x0001FF; // OR of FETCH_*
+ const FETCH_ALL = 0x0007FF; // OR of FETCH_*
private $fetched_fields = 0x000000;
return $this->owner;
}
+ public function isActive()
+ {
+ if ($this->owner()) {
+ return $this->owner->isActive();
+ }
+ return false;
+ }
+
public function promo()
{
return $this->promo;
return intval(substr($this->promo, 1, 4));
}
+ /** Check if user is an orange (associated with several promos)
+ */
+ public function isMultiPromo()
+ {
+ return $this->grad_year != $this->entry_year + $this->mainEducationDuration();
+ }
+
+ /** Returns an array with all associated promo years.
+ */
+ public function yearspromo()
+ {
+ $promos = array();
+ $d = -$this->deltaPromoToGradYear();
+ for ($g = $this->entry_year + $this->mainEducationDuration(); $g <= $this->grad_year; ++$g) {
+ $promos[] = $g + $d;
+ }
+ return $promos;
+ }
+
public function mainEducation()
{
- return $this->promo{0};
+ if (empty($this->promo)) {
+ return null;
+ } else {
+ return $this->promo{0};
+ }
+ }
+
+ public function mainGrade()
+ {
+ switch ($this->mainEducation()) {
+ case 'X':
+ return UserFilter::GRADE_ING;
+ case 'M':
+ return UserFilter::GRADE_MST;
+ case 'D':
+ return UserFilter::GRADE_PHD;
+ default:
+ return null;
+ }
}
public function mainEducationDuration()
}
}
+ /** Number of years between the promotion year until the
+ * graduation year. In standard schools it's 0, but for
+ * Polytechnique the promo year is the entry year.
+ */
+ public function deltaPromoToGradYear()
+ {
+ if ($this->mainEducation() == 'X') {
+ return $this->mainEducationDuration();
+ }
+ return 0;
+ }
+
/** Print a name with the given formatting:
* %s = • for women
* %f = firstname
public function nationalities()
{
$nats = array();
+ $countries = DirEnum::getOptions(DirEnum::COUNTRIES);
if ($this->nationality1) {
- $nats[] = $this->nationality1;
+ $nats[$this->nationality1] = $countries[$this->nationality1];
}
if ($this->nationality2) {
- $nats[] = $this->nationality2;
+ $nats[$this->nationality2] = $countries[$this->nationality2];
}
if ($this->nationality3) {
- $nats[] = $this->nationality3;
+ $nats[$this->nationality3] = $countries[$this->nationality3];
}
return $nats;
}
return property_exists($this, $name) || isset($this->data[$name]);
}
+ public function __unset($name)
+ {
+ if (property_exists($this, $name)) {
+ $this->$name = null;
+ } else {
+ unset($this->data[$name]);
+ }
+ }
+
+
+ /**
+ * Clears a profile.
+ * *always deletes in: profile_addresses, profile_binets, profile_job,
+ * profile_langskills, profile_mentor, profile_networking,
+ * profile_phones, profile_skills, watch_profile
+ * *always keeps in: profile_corps, profile_display, profile_education,
+ * profile_medals, profile_name, profile_photos, search_name
+ * *modifies: profiles
+ */
+ public function clear()
+ {
+ $tables = array(
+ 'profile_job', 'profile_langskills', 'profile_mentor',
+ 'profile_networking', 'profile_skills', 'watch_profile',
+ 'profile_phones', 'profile_addresses', 'profile_binets');
+
+ foreach ($tables as $t) {
+ XDB::execute('DELETE FROM ' . $t . '
+ WHERE pid = {?}',
+ $this->id());
+ }
+
+ XDB::execute("UPDATE profiles
+ SET cv = NULL, freetext = NULL, freetext_pub = 'private',
+ medals_pub = 'private', alias_pub = 'private',
+ email_directory = NULL
+ WHERE pid = {?}",
+ $this->id());
+ }
+
/** Sets the level of visibility of the profile
* Sets $this->visibility to a list of valid visibilities.
* @param one of the self::VIS_* values
$this->fetched_fields = $fields;
}
+ /** Have we already fetched this field ?
+ */
private function fetched($field)
{
if (!array_key_exists($field, ProfileField::$fields)) {
*/
private function getProfileField($field)
{
+ if (!array_key_exists($field, ProfileField::$fields)) {
+ Platal::page()->kill("Invalid field: $field");
+ }
if ($this->fetched($field)) {
return null;
} else {
*/
private function consolidateFields()
{
+ // Link phones to addresses
if ($this->phones != null) {
if ($this->addresses != null) {
$this->addresses->addPhones($this->phones);
}
}
+ // Link addresses to jobs
if ($this->addresses != null && $this->jobs != null) {
$this->jobs->addAddresses($this->addresses);
}
+
+ // Link jobterms to jobs
+ if ($this->jobs != null && $this->jobterms != null) {
+ $this->jobs->addJobTerms($this->jobterms);
+ }
}
/* Photo
$this->consolidateFields();
}
- public function getAddresses($flags, $limit = null)
+ private function fetchAddresses()
{
if ($this->addresses == null && !$this->fetched(self::FETCH_ADDRESSES)) {
- $this->setAddresses($this->getProfileField(self::FETCH_ADDRESSES));
+ $addr = $this->getProfileField(self::FETCH_ADDRESSES);
+ if ($addr) {
+ $this->setAddresses($addr);
+ $this->fetchPhones();
+ }
}
+ }
+
+ public function getAddresses($flags, $limit = null)
+ {
+ $this->fetchAddresses();
if ($this->addresses == null) {
return array();
public function getMainAddress()
{
- $addr = $this->getAddresses(self::ADDRESS_PERSO | self::ADDRESS_MAIN);
- if (count($addr) == 0) {
- return null;
+ $main = $this->getAddresses(self::ADDRESS_MAIN);
+ $perso = $this->getAddresses(self::ADDRESS_PERSO);
+
+ if (count($main)) {
+ return array_pop($main);
+ } else if (count($perso)) {
+ return array_pop($perso);
} else {
- return array_pop($addr);
+ return null;
}
}
$this->consolidateFields();
}
- public function getPhones($flags, $limit = null)
+ private function fetchPhones()
{
if ($this->phones == null && !$this->fetched(self::FETCH_PHONES)) {
- $this->setPhones($this->getProfileField(self::FETCH_PHONES));
+ $phones = $this->getProfileField(self::FETCH_PHONES);
+ if (isset($phones)) {
+ $this->setPhones($phones);
+ }
}
+ }
+ public function getPhones($flags, $limit = null)
+ {
+ $this->fetchPhones();
if ($this->phones == null) {
return array();
}
public function getNetworking($flags, $limit = null)
{
if ($this->networks == null && !$this->fetched(self::FETCH_NETWORKING)) {
- $this->setNetworking($this->getProfileField(self::FETCH_NETWORKING));
+ $nw = $this->getProfileField(self::FETCH_NETWORKING);
+ if ($nw) {
+ $this->setNetworking($nw);
+ }
}
if ($this->networks == null) {
return array();
return null;
}
$site = array_pop($site);
- return $site['address'];
+ return $site;
}
$this->consolidateFields();
}
- public function getJobs($flags, $limit = null)
+ private function fetchJobs()
{
if ($this->jobs == null && !$this->fetched(self::FETCH_JOBS)) {
- $this->setJobs($this->getProfileField(self::FETCH_JOBS));
+ $jobs = $this->getProfileField(self::FETCH_JOBS);
+ if ($jobs) {
+ $this->setJobs($jobs);
+ $this->fetchAddresses();
+ }
}
+ }
+
+ public function getJobs($flags, $limit = null)
+ {
+ $this->fetchJobs();
if ($this->jobs == null) {
return array();
return array_pop($job);
}
- /* Mentoring
+ /** JobTerms
*/
- private $mentor_sectors = null;
- public function setMentoringSectors(ProfileMentoringSectors $sectors)
- {
- $this->mentor_sectors = $sectors;
- }
-
- public function getMentoringSectors()
+ private $jobterms = null;
+ public function setJobTerms(ProfileJobTerms $jobterms)
{
- if ($this->mentor_sectors == null && !$this->fetched(self::FETCH_MENTOR_SECTOR)) {
- $this->setMentoringSectors($this->getProfileField(self::FETCH_MENTOR_SECTOR));
- }
-
- if ($this->mentor_sectors == null) {
- return array();
- } else {
- return $this->mentor_sectors->sectors;
- }
+ $this->jobterms = $jobterms;
+ $this->consolidateFields();
}
private $mentor_countries = null;
}
}
+ /** List of job terms to specify mentoring */
+ private $mentor_terms = null;
+ /**
+ * set job terms to specify mentoring
+ * @param $terms a ProfileMentoringTerms object listing terms only for this profile
+ */
+ public function setMentoringTerms(ProfileMentoringTerms $terms)
+ {
+ $this->mentor_terms = $terms;
+ }
+ /**
+ * get all job terms that specify mentoring
+ * @return an array of JobTerms objects
+ */
+ public function getMentoringTerms()
+ {
+ if ($this->mentor_terms == null && !$this->fetched(self::FETCH_MENTOR_TERMS)) {
+ $this->setMentoringTerms($this->getProfileField(self::FETCH_MENTOR_TERMS));
+ }
+
+ if ($this->mentor_terms == null) {
+ return array();
+ } else {
+ return $this->mentor_terms->get();
+ }
+ }
+
+
/* Binets
*/
public function getBinets()
{
- return XDB::fetchColumn('SELECT binet_id
- FROM profile_binets
- WHERE pid = {?}', $this->id());
+ if ($this->visibility->isVisible(ProfileVisibility::VIS_PRIVATE)) {
+ return XDB::fetchColumn('SELECT binet_id
+ FROM profile_binets
+ WHERE pid = {?}', $this->id());
+ } else {
+ return array();
+ }
}
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());
+ if ($this->visibility->isVisible(ProfileVisibility::VIS_PRIVATE)) {
+ 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());
+ } else {
+ return array();
+ }
}
/* Medals
private static function fetchProfileData(array $pids, $respect_order = true, $fields = 0x0000, $visibility = null)
{
if (count($pids) == 0) {
- return array();
+ return null;
}
if ($respect_order) {
$visibility = new ProfileVisibility($visibility);
- $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,
+ $it = XDB::Iterator('SELECT p.pid, p.hrpid, p.xorg_id, p.ax_id, p.birthdate, p.birthdate_ref,
+ p.next_birthday, p.deathdate, p.deathdate_rec, p.sex = \'female\' AS sex,
+ IF ({?}, p.cv, NULL) AS cv, p.medals_pub, p.alias_pub, p.email_directory,
+ p.last_change, p.nationality1, p.nationality2, p.nationality3,
+ IF (p.freetext_pub IN {?}, p.freetext, NULL) AS freetext,
+ pe.entry_year, pe.grad_year,
+ IF ({?}, pse.text, NULL) AS section,
+ pn_f.name AS firstname, pn_l.name AS lastname,
+ IF( {?}, pn_n.name, NULL) 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.promo AS promo, pd.short_name, pd.directory_name AS full_name,
- pd.directory_name, IF(pp.pub IN {?}, pp.display_tel, NULL) AS mobile,
+ pd.yourself, pd.promo, pd.short_name, pd.public_name AS full_name,
+ pd.directory_name, pd.public_name, pd.private_name,
+ IF(pp.pub IN {?}, pp.display_tel, NULL) AS mobile,
(ph.pub IN {?} AND ph.attach IS NOT NULL) AS has_photo,
ph.x AS photo_width, ph.y AS photo_height,
p.last_change < DATE_SUB(NOW(), INTERVAL 365 DAY) AS is_old,
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) . '
+ WHERE p.pid IN {?}
GROUP BY p.pid
- ' . $order, $visibility->levels(), $visibility->levels());
+ ' . $order,
+ $visibility->isVisible(ProfileVisibility::VIS_PRIVATE), // CV
+ $visibility->levels(), // freetext
+ $visibility->isVisible(ProfileVisibility::VIS_PRIVATE), // section
+ $visibility->isVisible(ProfileVisibility::VIS_PRIVATE), // nickname
+ $visibility->levels(), // mobile
+ $visibility->levels(), // photo
+ $pids
+ );
return new ProfileIterator($it, $pids, $fields, $visibility);
}
|| $name == self::DN_SHORT || $name == self::DN_SORT;
}
+ /** Returns the closest "accounts only" name type for $name
+ */
+ public static function getAccountEquivalentName($name)
+ {
+ switch ($name)
+ {
+ case self::DN_DIRECTORY:
+ case self::DN_SORT:
+ return 'directory_name';
+ case self::DN_FULL:
+ case self::DN_PUBLIC:
+ return 'full_name';
+ case self::DN_PRIVATE:
+ case self::DN_SHORT:
+ case self::DN_YOURSELF:
+ default:
+ return 'display_name';
+ }
+ }
+
public static function getNameTypeId($type, $for_sql = false)
{
if (!S::has('name_types')) {
}
}
- public static function rebuildSearchTokens($pid)
+ public static function rebuildSearchTokens($pids)
{
- XDB::execute('DELETE FROM search_name
- WHERE pid = {?}',
- $pid);
- $keys = XDB::iterator("SELECT CONCAT(n.particle, n.name) AS name, e.score,
- FIND_IN_SET('public', e.flags) AS public
- FROM profile_name AS n
- INNER JOIN profile_name_enum AS e ON (n.typeid = e.id)
- WHERE n.pid = {?}",
- $pid);
-
- foreach ($keys as $i => $key) {
+ if (!is_array($pids)) {
+ $pids = array($pids);
+ }
+ $keys = XDB::iterator("(SELECT n.pid AS pid, n.name AS name, e.score AS score,
+ IF(FIND_IN_SET('public', e.flags), 'public', '') AS public
+ FROM profile_name AS n
+ INNER JOIN profile_name_enum AS e ON (n.typeid = e.id)
+ WHERE n.pid IN {?} AND NOT FIND_IN_SET('not_displayed', e.flags))
+ UNION
+ (SELECT n.pid AS pid, n.particle AS name, 0 AS score,
+ IF(FIND_IN_SET('public', e.flags), 'public', '') AS public
+ FROM profile_name AS n
+ INNER JOIN profile_name_enum AS e ON (n.typeid = e.id)
+ WHERE n.pid IN {?} AND NOT FIND_IN_SET('not_displayed', e.flags))
+ ",
+ $pids, $pids);
+ $names = array();
+ while ($key = $keys->next()) {
if ($key['name'] == '') {
continue;
}
- $toks = preg_split('/[ \'\-]+/', $key['name']);
+ $pid = $key['pid'];
+ $toks = preg_split('/[ \'\-]+/', strtolower(replace_accent($key['name'])),
+ -1, PREG_SPLIT_NO_EMPTY);
+ $toks = array_reverse($toks);
+
+ /* Split the score between the tokens to avoid the user to be over-rated.
+ * Let says my user name is "Machin-Truc Bidule" and I also have a user named
+ * 'Machin Truc'. Distributing the score force "Machin Truc" to be displayed
+ * before "Machin-Truc" for both "Machin Truc" and "Machin" searches.
+ */
+ $eltScore = ceil(((float)$key['score'])/((float)count($toks)));
$token = '';
- $first = 5;
- while ($toks) {
- $token = strtolower(replace_accent(array_pop($toks) . $token));
- $score = ($toks ? 0 : 10 + $first) * ($key['score'] / 10);
- XDB::execute('REPLACE INTO search_name (token, pid, soundex, score, flags)
- VALUES ({?}, {?}, {?}, {?}, {?})',
- $token, $pid, soundex_fr($token), $score, $key['public']);
- $first = 0;
+ foreach ($toks as $tok) {
+ $token = $tok . $token;
+ $names["$pid-$token"] = XDB::format('({?}, {?}, {?}, {?}, {?})',
+ $token, $pid, soundex_fr($token),
+ $eltScore, $key['public']);
}
}
+ XDB::startTransaction();
+ XDB::execute('DELETE FROM search_name
+ WHERE pid IN {?}',
+ $pids);
+ if (count($names) > 0) {
+ XDB::rawExecute('INSERT INTO search_name (token, pid, soundex, score, flags)
+ VALUES ' . implode(', ', $names));
+ }
+ XDB::commit();
}
/** The school identifier consists of 6 digits. The first 3 represent the
* promotion entry year. The last 3 indicate the student's rank.
- *
+ *
* Our identifier consists of 8 digits and both half have the same role.
* This enables us to deal with bigger promotions and with a wider range
* of promotions.
private $fields;
private $visibility;
+ const FETCH_ALL = 0x000033F; // FETCH_ADDRESSES | FETCH_CORPS | FETCH_EDU | FETCH_JOBS | FETCH_MEDALS | FETCH_NETWORKING | FETCH_PHONES | FETCH_JOB_TERMS
+
public function __construct(PlIterator $it, array $pids, $fields = 0x0000, ProfileVisibility $visibility = null)
{
require_once 'profilefields.inc.php';
$callbacks[0] = PlIteratorUtils::arrayValueCallback('pid');
$cb = PlIteratorUtils::objectPropertyCallback('pid');
- if ($fields & Profile::FETCH_ADDRESSES) {
- $callbacks[Profile::FETCH_ADDRESSES] = $cb;
- $subits[Profile::FETCH_ADDRESSES] = new ProfileFieldIterator('ProfileAddresses', $pids, $visibility);
- }
-
- if ($fields & Profile::FETCH_CORPS) {
- $callbacks[Profile::FETCH_CORPS] = $cb;
- $subits[Profile::FETCH_CORPS] = new ProfileFieldIterator('ProfileCorps', $pids, $visibility);
- }
-
- if ($fields & Profile::FETCH_EDU) {
- $callbacks[Profile::FETCH_EDU] = $cb;
- $subits[Profile::FETCH_EDU] = new ProfileFieldIterator('ProfileEducation', $pids, $visibility);
- }
-
- if ($fields & Profile::FETCH_JOBS) {
- $callbacks[Profile::FETCH_JOBS] = $cb;
- $subits[Profile::FETCH_JOBS] = new ProfileFieldIterator('ProfileJobs', $pids, $visibility);
- }
-
- if ($fields & Profile::FETCH_MEDALS) {
- $callbacks[Profile::FETCH_MEDALS] = $cb;
- $subits[Profile::FETCH_MEDALS] = new ProfileFieldIterator('ProfileMedals', $pids, $visibility);
- }
-
- if ($fields & Profile::FETCH_NETWORKING) {
- $callbacks[Profile::FETCH_NETWORKING] = $cb;
- $subits[Profile::FETCH_NETWORKING] = new ProfileFieldIterator('ProfileNetworking', $pids, $visibility);
- }
-
- if ($fields & Profile::FETCH_PHONES) {
- $callbacks[Profile::FETCH_PHONES] = $cb;
- $subits[Profile::FETCH_PHONES] = new ProfileFieldIterator('ProfilePhones', $pids, $visibility);
+ $fields = $fields & self::FETCH_ALL;
+ for ($field = 1; $field < $fields; $field *= 2) {
+ if (($fields & $field) ) {
+ $callbacks[$field] = $cb;
+ $subits[$field] = new ProfileFieldIterator($field, $pids, $visibility);
+ }
}
$this->iterator = PlIteratorUtils::parallelIterator($subits, $callbacks, 0);
if ($this->hasData(Profile::FETCH_JOBS, $vals)) {
$pf->setJobs($vals[Profile::FETCH_JOBS]);
}
+ if ($this->hasData(Profile::FETCH_JOB_TERMS, $vals)) {
+ $pf->setJobTerms($vals[Profile::FETCH_JOB_TERMS]);
+ }
if ($this->hasData(Profile::FETCH_CORPS, $vals)) {
$pf->setCorps($vals[Profile::FETCH_CORPS]);