- $this->fields = $fields;
- $this->description = $description;
- }
-
- public function buildCondition(UserFilter &$uf)
- {
- $conds = array();
- if ($this->fields & UserFilter::JOB_USERDEFINED) {
- $sub = $uf->addJobFilter();
- $conds[] = $sub . '.description LIKE ' . XDB::format('CONCAT(\'%\', {?}, \'%\')', $this->description);
- }
- if ($this->fields & UserFilter::JOB_SECTOR) {
- $sub = $uf->addJobSectorizationFilter(UserFilter::JOB_SECTOR);
- $conds[] = $sub . '.name LIKE ' . XDB::format('CONCAT(\'%\', {?}, \'%\')', $this->description);
- }
- if ($this->fields & UserFilter::JOB_SUBSECTOR) {
- $sub = $uf->addJobSectorizationFilter(UserFilter::JOB_SUBSECTOR);
- $conds[] = $sub . '.name LIKE ' . XDB::format('CONCAT(\'%\', {?}, \'%\')', $this->description);
- }
- if ($this->fields & UserFilter::JOB_SUBSUBSECTOR) {
- $sub = $uf->addJobSectorizationFilter(UserFilter::JOB_SUBSUBSECTOR);
- $conds[] = $sub . '.name LIKE ' . XDB::format('CONCAT(\'%\', {?}, \'%\')', $this->description);
- $sub = $uf->addJobSectorizationFilter(UserFilter::JOB_ALTERNATES);
- $conds[] = $sub . '.name LIKE ' . XDB::format('CONCAT(\'%\', {?}, \'%\')', $this->description);
- }
- return implode(' OR ', $conds);
- }
-}
-// }}}
-
-// {{{ class UFC_Networking
-/** Filters users based on network identity (IRC, ...)
- * @param $type Type of network (-1 for any)
- * @param $value Value to search
- */
-class UFC_Networking extends UserFilterCondition
-{
- private $type;
- private $value;
-
- public function __construct($type, $value)
- {
- $this->type = $type;
- $this->value = $value;
- }
-
- public function buildCondition(UserFilter &$uf)
- {
- $sub = $uf->addNetworkingFilter();
- $conds = array();
- $conds[] = $sub . '.address = ' . XDB::format('CONCAT(\'%\', {?}, \'%\')', $this->value);
- if ($this->type != -1) {
- $conds[] = $sub . '.network_type = ' . XDB::format('{?}', $this->type);
- }
- return implode(' AND ', $conds);
- }
-}
-// }}}
-
-// {{{ class UFC_Phone
-/** Filters users based on their phone number
- * @param $num_type Type of number (pro/user/home)
- * @param $phone_type Type of phone (fixed/mobile/fax)
- * @param $number Phone number
- */
-class UFC_Phone extends UserFilterCondition
-{
- const NUM_PRO = 'pro';
- const NUM_USER = 'user';
- const NUM_HOME = 'address';
- const NUM_ANY = 'any';
-
- const PHONE_FIXED = 'fixed';
- const PHONE_MOBILE = 'mobile';
- const PHONE_FAX = 'fax';
- const PHONE_ANY = 'any';
-
- private $num_type;
- private $phone_type;
- private $number;
-
- public function __construct($number, $num_type = self::NUM_ANY, $phone_type = self::PHONE_ANY)
- {
- require_once('profil.inc.php');
- $this->number = $number;
- $this->num_type = $num_type;
- $this->phone_type = format_phone_number($phone_type);
- }
-
- public function buildCondition(UserFilter &$uf)
- {
- $sub = $uf->addPhoneFilter();
- $conds = array();
- $conds[] = $sub . '.search_tel = ' . XDB::format('{?}', $this->number);
- if ($this->num_type != self::NUM_ANY) {
- $conds[] = $sub . '.link_type = ' . XDB::format('{?}', $this->num_type);
- }
- if ($this->phone_type != self::PHONE_ANY) {
- $conds[] = $sub . '.tel_type = ' . XDB::format('{?}', $this->phone_type);
- }
- return implode(' AND ', $conds);
- }
-}
-// }}}
-
-// {{{ class UFC_Medal
-/** Filters users based on their medals
- * @param $medal ID of the medal
- * @param $grade Grade of the medal (null for 'any')
- */
-class UFC_Medal extends UserFilterCondition
-{
- private $medal;
- private $grade;
-
- public function __construct($medal, $grade = null)
- {
- $this->medal = $medal;
- $this->grade = $grade;
- }
-
- public function buildCondition(UserFilter &$uf)
- {
- $conds = array();
- $sub = $uf->addMedalFilter();
- $conds[] = $sub . '.mid = ' . XDB::format('{?}', $this->medal);
- if ($this->grade != null) {
- $conds[] = $sub . '.gid = ' . XDB::format('{?}', $this->grade);
- }
- return implode(' AND ', $conds);
- }
-}
-// }}}
-
-// {{{ class UFC_Mentor_Expertise
-/** Filters users by mentoring expertise
- * @param $expertise Domain of expertise
- */
-class UFC_Mentor_Expertise extends UserFilterCondition
-{
- private $expertise;
-
- public function __construct($expertise)
- {
- $this->expertise = $expertise;
- }
-
- public function buildCondition(UserFilter &$uf)
- {
- $sub = $uf->addMentorFilter(UserFilter::MENTOR_EXPERTISE);
- return $sub . '.expertise LIKE ' . XDB::format('CONCAT(\'%\', {?}, \'%\'', $this->expertise);
- }
-}
-// }}}
-
-// {{{ class UFC_Mentor_Country
-/** Filters users by mentoring country
- * @param $country Two-letters code of country being searched
- */
-class UFC_Mentor_Country extends UserFilterCondition
-{
- private $country;
-
- public function __construct($country)
- {
- $this->country = $country;
- }
-
- public function buildCondition(UserFilter &$uf)
- {
- $sub = $uf->addMentorFilter(UserFilter::MENTOR_COUNTRY);
- return $sub . '.country = ' . XDB::format('{?}', $this->country);
- }
-}
-// }}}
-
-// {{{ class UFC_Mentor_Sectorization
-/** Filters users based on mentoring (sub|)sector
- * @param $sector ID of sector
- * @param $subsector Subsector (null for any)
- */
-class UFC_Mentor_Sectorization extends UserFilterCondition
-{
- private $sector;
- private $subsector;
-
- public function __construct($sector, $subsector = null)
- {
- $this->sector = $sector;
- $this->subsubsector = $subsector;
- }
-
- public function buildCondition(UserFilter &$uf)
- {
- $sub = $uf->addMentorFilter(UserFilter::MENTOR_SECTOR);
- $conds = array();
- $conds[] = $sub . '.sectorid = ' . XDB::format('{?}', $this->sector);
- if ($this->subsector != null) {
- $conds[] = $sub . '.subsectorid = ' . XDB::format('{?}', $this->subsector);
- }
- return implode(' AND ', $conds);
- }
-}
-// }}}
-
-// {{{ class UFC_UserRelated
-/** Filters users based on a relation toward a user
- * @param $user User to which searched users are related
- */
-abstract class UFC_UserRelated implements UserFilterCondition
-{
- protected $user;
- public function __construct(PlUser &$user)
- {
- $this->user =& $user;
- }
-}
-// }}}
-
-// {{{ class UFC_Contact
-/** Filters users who belong to selected user's contacts
- */
-class UFC_Contact extends UFC_UserRelated
-{
- public function buildCondition(UserFilter &$uf)
- {
- $sub = $uf->addContactFilter($this->user->id());
- return 'c' . $sub . '.contact IS NOT NULL';
- }
-}
-// }}}
-
-// {{{ class UFC_WatchRegistration
-/** Filters users being watched by selected user
- */
-class UFC_WatchRegistration extends UFC_UserRelated
-{
- public function buildCondition(UserFilter &$uf)
- {
- if (!$this->user->watch('registration')) {
- return UserFilterCondition::COND_FALSE;
- }
- $uids = $this->user->watchUsers();
- if (count($uids) == 0) {
- return UserFilterCondition::COND_FALSE;
- } else {
- return '$UID IN ' . XDB::formatArray($uids);
- }
- }
-}
-// }}}
-
-// {{{ class UFC_WatchPromo
-/** Filters users belonging to a promo watched by selected user
- * @param $user Selected user (the one watching promo)
- * @param $grade Formation the user is watching
- */
-class UFC_WatchPromo extends UFC_UserRelated
-{
- private $grade;
- public function __construct(PlUser &$user, $grade = UserFilter::GRADE_ING)
- {
- parent::__construct($user);
- $this->grade = $grade;
- }
-
- public function buildCondition(UserFilter &$uf)
- {
- $promos = $this->user->watchPromos();
- if (count($promos) == 0) {
- return UserFilterCondition::COND_FALSE;
- } else {
- $sube = $uf->addEducationFilter(true, $this->grade);
- $field = 'pe' . $sube . '.' . UserFilter::promoYear($this->grade);
- return $field . ' IN ' . XDB::formatArray($promos);
- }
- }
-}
-// }}}
-
-// {{{ class UFC_WatchContact
-/** Filters users watched by selected user
- */
-class UFC_WatchContact extends UFC_Contact
-{
- public function buildCondition(UserFilter &$uf)
- {
- if (!$this->user->watchContacts()) {
- return UserFilterCondition::COND_FALSE;
- }
- return parent::buildCondition($uf);
- }
-}
-// }}}
-
-
-/******************
- * ORDERS
- ******************/
-
-// {{{ class UserFilterOrder
-abstract class UserFilterOrder
-{
- protected $desc = false;
- public function __construct($desc = false)
- {
- $this->desc = $desc;
- }
-
- public function buildSort(UserFilter &$uf)
- {
- $sel = $this->getSortTokens($uf);
- if (!is_array($sel)) {
- $sel = array($sel);
- }
- if ($this->desc) {
- foreach ($sel as $k=>$s) {
- $sel[$k] = $s . ' DESC';
- }
- }
- return $sel;
- }
-
- abstract protected function getSortTokens(UserFilter &$uf);
-}
-// }}}
-
-// {{{ class UFO_Promo
-/** Orders users by promotion
- * @param $grade Formation whose promotion users should be sorted by (restricts results to users of that formation)
- * @param $desc Whether sort is descending
- */
-class UFO_Promo extends UserFilterOrder
-{
- private $grade;
-
- public function __construct($grade = null, $desc = false)
- {
- parent::__construct($desc);
- $this->grade = $grade;
- }
-
- protected function getSortTokens(UserFilter &$uf)
- {
- if (UserFilter::isGrade($this->grade)) {
- $sub = $uf->addEducationFilter($this->grade);
- return 'pe' . $sub . '.' . UserFilter::promoYear($this->grade);
- } else {
- $sub = $uf->addDisplayFilter();
- return 'pd' . $sub . '.promo';
- }
- }
-}
-// }}}
-
-// {{{ class UFO_Name
-/** Sorts users by name
- * @param $type Type of name on which to sort (firstname...)
- * @param $variant Variant of that name to use (marital, ordinary...)
- * @param $particle Set to true if particles should be included in the sorting order
- * @param $desc If sort order should be descending
- */
-class UFO_Name extends UserFilterOrder
-{
- private $type;
- private $variant;
- private $particle;
-
- public function __construct($type, $variant = null, $particle = false, $desc = false)
- {
- parent::__construct($desc);
- $this->type = $type;
- $this->variant = $variant;
- $this->particle = $particle;
- }
-
- protected function getSortTokens(UserFilter &$uf)
- {
- if (UserFilter::isDisplayName($this->type)) {
- $sub = $uf->addDisplayFilter();
- return 'pd' . $sub . '.' . $this->type;
- } else {
- $sub = $uf->addNameFilter($this->type, $this->variant);
- if ($this->particle) {
- return 'CONCAT(pn' . $sub . '.particle, \' \', pn' . $sub . '.name)';
- } else {
- return 'pn' . $sub . '.name';
- }
- }
- }
-}
-// }}}
-
-// {{{ class UFO_Registration
-/** Sorts users based on registration date
- */
-class UFO_Registration extends UserFilterOrder
-{
- protected function getSortTokens(UserFilter &$uf)
- {
- return 'a.registration_date';
- }
-}
-// }}}
-
-// {{{ class UFO_Birthday
-/** Sorts users based on next birthday date
- */
-class UFO_Birthday extends UserFilterOrder
-{
- protected function getSortTokens(UserFilter &$uf)
- {
- return 'p.next_birthday';
- }
-}
-// }}}
-
-// {{{ class UFO_ProfileUpdate
-/** Sorts users based on last profile update
- */
-class UFO_ProfileUpdate extends UserFilterOrder
-{
- protected function getSortTokens(UserFilter &$uf)
- {
- return 'p.last_change';
- }
-}
-// }}}
-
-// {{{ class UFO_Death
-/** Sorts users based on death date
- */
-class UFO_Death extends UserFilterOrder
-{
- protected function getSortTokens(UserFilter &$uf)
- {
- return 'p.deathdate';
- }
-}
-// }}}
-
-
-/***********************************
- *********************************
- USER FILTER CLASS
- *********************************
- ***********************************/
-
-// {{{ class UserFilter
-class UserFilter
-{
- static private $joinMethods = array();
-
- private $root;
- private $sort = array();
- private $query = null;
- private $orderby = null;
-
- private $lastcount = null;
-
- public function __construct($cond = null, $sort = null)
- {
- if (empty(self::$joinMethods)) {
- $class = new ReflectionClass('UserFilter');
- foreach ($class->getMethods() as $method) {
- $name = $method->getName();
- if (substr($name, -5) == 'Joins' && $name != 'buildJoins') {
- self::$joinMethods[] = $name;
- }
- }
- }
- if (!is_null($cond)) {
- if ($cond instanceof UserFilterCondition) {
- $this->setCondition($cond);
- }
- }
- if (!is_null($sort)) {
- if ($sort instanceof UserFilterOrder) {
- $this->addSort($sort);
- } else if (is_array($sort)) {
- foreach ($sort as $s) {
- $this->addSort($s);
- }
- }
- }
- }
-
- private function buildQuery()
- {
- if (is_null($this->orderby)) {
- $orders = array();
- foreach ($this->sort as $sort) {
- $orders = array_merge($orders, $sort->buildSort($this));
- }
- if (count($orders) == 0) {
- $this->orderby = '';
- } else {
- $this->orderby = 'ORDER BY ' . implode(', ', $orders);
- }
- }
- if (is_null($this->query)) {
- $where = $this->root->buildCondition($this);
- $joins = $this->buildJoins();
- $this->query = 'FROM accounts AS a
- LEFT JOIN account_profiles AS ap ON (ap.uid = a.uid AND FIND_IN_SET(\'owner\', ap.perms))
- LEFT JOIN profiles AS p ON (p.pid = ap.pid)
- ' . $joins . '
- WHERE (' . $where . ')';
- }