// }}}
// {{{ class UFC_AccountType
-/** Filters users who have the given account types
+/** Filters users who have one of the given account types
*/
class UFC_AccountType implements UserFilterCondition
{
return XDB::format('a.type IN {?}', $this->types);
}
}
+// }}}
+
+// {{{ class UFC_AccountPerm
+/** Filters users who have one of the given permissions
+ */
+class UFC_AccountPerm implements UserFilterCondition
+{
+ private $perms;
+
+ public function __construct()
+ {
+ $this->perms = pl_flatten(func_get_args());
+ }
+
+ public function buildCondition(PlFilter &$uf)
+ {
+ $uf->requirePerms();
+ $conds = array();
+ foreach ($this->perms as $perm) {
+ $conds[] = XDB::format('FIND_IN_SET({?}, IF(a.user_perms IS NULL, at.perms,
+ CONCAT(at.perms, \',\', a.user_perms)))',
+ $perm);
+ }
+ if (empty($conds)) {
+ return self::COND_TRUE;
+ } else {
+ return implode(' OR ', $conds);
+ }
+ }
+}
+// }}}
// {{{ class UFC_Hruid
/** Filters users based on their hruid
foreach ($this->tokens as $i => $token) {
$sub = $uf->addNameTokensFilter($token);
if ($this->soundex) {
- $c = XDB::format($sub . '.soundex = {?}', $token);
+ $c = XDB::format($sub . '.soundex = {?}', soundex_fr($token));
} else if ($this->exact) {
$c = XDB::format($sub . '.token = {?}', $token);
} else {
{
// Groups have AX visibility.
if ($uf->getVisibilityLevel() == ProfileVisibility::VIS_PUBLIC) {
- return PlFilter::COND_TRUE;
+ return self::COND_TRUE;
}
$sub = $uf->addGroupFilter($this->group);
$where = 'gpm' . $sub . '.perms IS NOT NULL';
{
// Binets are private.
if ($uf->getVisibilityLevel() != ProfileVisibility::VIS_PRIVATE) {
- return PlFilter::COND_TRUE;
+ return self::CONF_TRUE;
}
$sub = $uf->addBinetsFilter();
return XDB::format($sub . '.binet_id IN {?}', $this->val);
{
// Sections are private.
if ($uf->getVisibilityLevel() != ProfileVisibility::VIS_PRIVATE) {
- return PlFilter::COND_TRUE;
+ return self::CONF_TRUE;
}
$uf->requireProfiles();
return XDB::format('p.section IN {?}', $this->section);
}
// }}}
-// {{{ class UFC_Job_Sectorization
-/** Filters users based on the ((sub)sub)sector they work in
- * @param $val The ID of the sector, or an array of such IDs
- * @param $type The kind of search (subsubsector/subsector/sector)
- */
-class UFC_Job_Sectorization implements UserFilterCondition
-{
- private $val;
- private $type;
-
- public function __construct($val, $type = UserFilter::JOB_SECTOR)
- {
- self::assertType($type);
- if (!is_array($val)) {
- $val = array($val);
- }
- $this->val = $val;
- $this->type = $type;
- }
-
- private static function assertType($type)
- {
- if ($type != UserFilter::JOB_SECTOR && $type != UserFilter::JOB_SUBSECTOR && $type != UserFilter::JOB_SUBSUBSECTOR) {
- Platal::page()->killError("Type de secteur non valide.");
- }
- }
-
- public function buildCondition(PlFilter &$uf)
- {
- $sub = $uf->addJobSectorizationFilter($this->type);
- $cond = $sub . '.id = ' . XDB::format('{?}', $this->val);
- $jsub = $uf->addJobFilter();
- $cond .= ' AND ' . $uf->getVisibilityCondition($jsub . '.pub');
- return $cond;
- }
-}
-// }}}
-
// {{{ class UFC_Job_Terms
/** Filters users based on the job terms they assigned to one of their
* jobs.
// {{{ class UFC_Job_Description
/** Filters users based on their job description
* @param $description The text being searched for
- * @param $fields The fields to search for (user-defined, ((sub|)sub|)sector)
+ * @param $fields The fields to search for (CV, user-defined)
*/
class UFC_Job_Description implements UserFilterCondition
{
// don't do anything. Otherwise restrict to standard job visibility.
if ($this->fields == UserFilter::JOB_CV) {
if ($uf->getVisibilityLevel() != ProfileVisibility::VIS_PRIVATE) {
- return PlFilter::COND_TRUE;
+ return self::CONF_TRUE;
}
} else {
$conds[] = $uf->getVisibilityCondition($jsub . '.pub');
if ($this->fields & UserFilter::JOB_USERDEFINED) {
$conds[] = $jsub . '.description ' . XDB::formatWildcards(XDB::WILDCARD_CONTAINS, $this->description);
}
- if ($this->fields & UserFilter::JOB_CV && $uf->getVisibilityLevel == ProfileVisibility::VIS_PRIVATE) {
+ if ($this->fields & UserFilter::JOB_CV && $uf->getVisibilityLevel() == ProfileVisibility::VIS_PRIVATE) {
$uf->requireProfiles();
$conds[] = 'p.cv ' . XDB::formatWildcards(XDB::WILDCARD_CONTAINS, $this->description);
}
- if ($this->fields & UserFilter::JOB_SECTOR) {
- $sub = $uf->addJobSectorizationFilter(UserFilter::JOB_SECTOR);
- $conds[] = $sub . '.name ' . XDB::formatWildcards(XDB::WILDCARD_CONTAINS, $this->description);
- }
- if ($this->fields & UserFilter::JOB_SUBSECTOR) {
- $sub = $uf->addJobSectorizationFilter(UserFilter::JOB_SUBSECTOR);
- $conds[] = $sub . '.name ' . XDB::formatWildcards(XDB::WILDCARD_CONTAINS, $this->description);
- }
- if ($this->fields & UserFilter::JOB_SUBSUBSECTOR) {
- $sub = $uf->addJobSectorizationFilter(UserFilter::JOB_SUBSUBSECTOR);
- $conds[] = $sub . '.name ' . XDB::formatWildcards(XDB::WILDCARD_CONTAINS, $this->description);
- $sub = $uf->addJobSectorizationFilter(UserFilter::JOB_ALTERNATES);
- $conds[] = $sub . '.name ' . XDB::formatWildcards(XDB::WILDCARD_CONTAINS, $this->description);
- }
return implode(' OR ', $conds);
}
}
}
// }}}
-// {{{ class UFC_Mentor_Sectorization
-/** Filters users based on mentoring (sub|)sector
- * @param $sector ID of (sub)sector
- * @param $type Whether we are looking for a sector or a subsector
- */
-class UFC_Mentor_Sectorization implements UserFilterCondition
-{
- const SECTOR = 1;
- const SUBSECTOR = 2;
- private $sector;
- private $type;
-
- public function __construct($sector, $type = self::SECTOR)
- {
- $this->sector = $sector;
- $this->type = $type;
- }
-
- public function buildCondition(PlFilter &$uf)
- {
- $sub = $uf->addMentorFilter(UserFilter::MENTOR_SECTOR);
- if ($this->type == self::SECTOR) {
- $field = 'sectorid';
- } else {
- $field = 'subsectorid';
- }
- return $sub . '.' . $field . ' = ' . XDB::format('{?}', $this->sector);
- }
-}
-// }}}
-
// {{{ class UFC_UserRelated
/** Filters users based on a relation toward a user
* @param $user User to which searched users are related
$this->buildQuery();
$token = $this->grouper->getGroupToken($this);
- $groups = XDB::fetchAllRow('SELECT ' . $token . ', COUNT(a.uid)
- ' . $this->query . '
- GROUP BY ' . $token,
- 0);
+ $groups = XDB::rawFetchAllRow('SELECT ' . $token . ', COUNT(a.uid)
+ ' . $this->query . '
+ GROUP BY ' . $token,
+ 0);
return $groups;
}
$this->buildQuery();
$token = $this->grouper->getGroupToken($this);
- $groups = XDB::fetchAllRow('SELECT ' . $token . ', COUNT(p.pid)
- ' . $this->query . '
- GROUP BY ' . $token,
- 0);
+ $groups = XDB::rawFetchAllRow('SELECT ' . $token . ', COUNT(p.pid)
+ ' . $this->query . '
+ GROUP BY ' . $token,
+ 0);
return $groups;
}
if (!empty($uids)) {
$cond = XDB::format(' AND a.uid IN {?}', $uids);
}
- $fetched = XDB::fetchColumn('SELECT SQL_CALC_FOUND_ROWS a.uid
- ' . $this->query . $cond . '
- GROUP BY a.uid
- ' . $this->orderby . '
- ' . $lim);
+ $fetched = XDB::rawFetchColumn('SELECT SQL_CALC_FOUND_ROWS a.uid
+ ' . $this->query . $cond . '
+ GROUP BY a.uid
+ ' . $this->orderby . '
+ ' . $lim);
$this->lastusercount = (int)XDB::fetchOneCell('SELECT FOUND_ROWS()');
return $fetched;
}
if (!is_null($pids)) {
$cond = XDB::format(' AND p.pid IN {?}', $pids);
}
- $fetched = XDB::fetchColumn('SELECT SQL_CALC_FOUND_ROWS p.pid
- ' . $this->query . $cond . '
- GROUP BY p.pid
- ' . $this->orderby . '
- ' . $lim);
+ $fetched = XDB::rawFetchColumn('SELECT SQL_CALC_FOUND_ROWS p.pid
+ ' . $this->query . $cond . '
+ GROUP BY p.pid
+ ' . $this->orderby . '
+ ' . $lim);
$this->lastprofilecount = (int)XDB::fetchOneCell('SELECT FOUND_ROWS()');
return $fetched;
}
{
$this->requireAccounts();
$this->buildQuery();
- $count = (int)XDB::fetchOneCell('SELECT COUNT(*)
- ' . $this->query . XDB::format(' AND a.uid = {?}', $user->id()));
+ $count = (int)XDB::rawFetchOneCell('SELECT COUNT(*)
+ ' . $this->query
+ . XDB::format(' AND a.uid = {?}', $user->id()));
return $count == 1;
}
{
$this->requireProfiles();
$this->buildQuery();
- $count = (int)XDB::fetchOneCell('SELECT COUNT(*)
- ' . $this->query . XDB::format(' AND p.pid = {?}', $profile->id()));
+ $count = (int)XDB::rawFetchOneCell('SELECT COUNT(*)
+ ' . $this->query
+ . XDB::format(' AND p.pid = {?}', $profile->id()));
return $count == 1;
}
if (is_null($this->lastusercount)) {
$this->requireAccounts();
$this->buildQuery();
- return (int)XDB::fetchOneCell('SELECT COUNT(DISTINCT a.uid)
+ return (int)XDB::rawFetchOneCell('SELECT COUNT(DISTINCT a.uid)
' . $this->query);
} else {
return $this->lastusercount;
if (is_null($this->lastprofilecount)) {
$this->requireProfiles();
$this->buildQuery();
- return (int)XDB::fetchOneCell('SELECT COUNT(DISTINCT p.pid)
+ return (int)XDB::rawFetchOneCell('SELECT COUNT(DISTINCT p.pid)
' . $this->query);
} else {
return $this->lastprofilecount;
return $joins;
}
+ /** PERMISSIONS
+ */
+ private $at = false;
+ public function requirePerms()
+ {
+ $this->requireAccounts();
+ $this->at = true;
+ return 'at';
+ }
+
+ protected function permJoins()
+ {
+ if ($this->at) {
+ return array('at' => PlSqlJoin::left('account_types', '$ME.type = a.type'));
+ } else {
+ return array();
+ }
+ }
+
/** DISPLAY
*/
const DISPLAY = 'display';
/** JOBS
*/
- const JOB_SECTOR = 0x0001;
- const JOB_SUBSECTOR = 0x0002;
- const JOB_SUBSUBSECTOR = 0x0004;
- const JOB_ALTERNATES = 0x0008;
- const JOB_USERDEFINED = 0x0010;
- const JOB_CV = 0x0020;
-
- const JOB_SECTORIZATION = 0x000F;
- const JOB_ANY = 0x003F;
+ const JOB_USERDEFINED = 0x0001;
+ const JOB_CV = 0x0002;
+ const JOB_ANY = 0x0003;
/** Joins :
* pj => profile_job
* pje => profile_job_enum
- * pjse => profile_job_sector_enum
- * pjsse => profile_job_subsector_enum
- * pjssse => profile_job_subsubsector_enum
- * pja => profile_job_alternates
* pjt => profile_job_terms
*/
- private $with_pj = false;
+ private $with_pj = false;
private $with_pje = false;
- private $with_pjse = false;
- private $with_pjsse = false;
- private $with_pjssse = false;
- private $with_pja = false;
private $with_pjt = 0;
public function addJobFilter()
return 'pje';
}
- public function addJobSectorizationFilter($type)
- {
- $this->addJobFilter();
- if ($type == self::JOB_SECTOR) {
- $this->with_pjse = true;
- return 'pjse';
- } else if ($type == self::JOB_SUBSECTOR) {
- $this->with_pjsse = true;
- return 'pjsse';
- } else if ($type == self::JOB_SUBSUBSECTOR) {
- $this->with_pjssse = true;
- return 'pjssse';
- } else if ($type == self::JOB_ALTERNATES) {
- $this->with_pja = true;
- return 'pja';
- }
- }
-
/**
* Adds a filter on job terms of profile.
* @param $nb the number of job terms to use
if ($this->with_pje) {
$joins['pje'] = PlSqlJoin::left('profile_job_enum', '$ME.id = pj.jobid');
}
- if ($this->with_pjse) {
- $joins['pjse'] = PlSqlJoin::left('profile_job_sector_enum', '$ME.id = pj.sectorid');
- }
- if ($this->with_pjsse) {
- $joins['pjsse'] = PlSqlJoin::left('profile_job_subsector_enum', '$ME.id = pj.subsectorid');
- }
- if ($this->with_pjssse) {
- $joins['pjssse'] = PlSqlJoin::left('profile_job_subsubsector_enum', '$ME.id = pj.subsubsectorid');
- }
- if ($this->with_pja) {
- $joins['pja'] = PlSqlJoin::left('profile_job_alternates', '$ME.subsubsectorid = pj.subsubsectorid');
- }
if ($this->with_pjt > 0) {
for ($i = 1; $i <= $this->with_pjt; ++$i) {
$joins['pjt_'.$i] = PlSqlJoin::left('profile_job_term', '$ME.pid = $PID');
const MENTOR = 1;
const MENTOR_EXPERTISE = 2;
const MENTOR_COUNTRY = 3;
- const MENTOR_SECTOR = 4;
- const MENTOR_TERM = 5;
+ const MENTOR_TERM = 4;
public function addMentorFilter($type)
{
case self::MENTOR_COUNTRY:
$this->pms['pmc'] = 'profile_mentor_country';
return 'pmc';
- case self::MENTOR_SECTOR:
- $this->pms['pms'] = 'profile_mentor_sector';
- return 'pms';
case self::MENTOR_TERM:
$this->pms['pmt'] = 'profile_mentor_term';
$this->mjtr = true;