* 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
{
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;
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;
}
$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
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);
+ }
}
}
return array_pop($job);
}
+ /** JobTerms
+ */
+ private $jobterms = null;
+ public function setJobTerms(ProfileJobTerms $jobterms)
+ {
+ $this->jobterms = $jobterms;
+ $this->consolidateFields();
+ }
+
/* Mentoring
*/
private $mentor_sectors = 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()
$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,
- p.cv, p.medals_pub, p.alias_pub, p.email_directory, p.last_change,
- p.nationality1, p.nationality2, p.nationality3,
+ 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,
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.yourself, pd.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,
WHERE p.pid IN {?}
GROUP BY p.pid
' . $order,
- $visibility->levels(),
- $visibility->isVisible(ProfileVisibility::VIS_PRIVATE),
- $visibility->isVisible(ProfileVisibility::VIS_PRIVATE),
- $visibility->levels(),
- $visibility->levels(),
+ $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')) {
/** 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]);