}
}
+class UFC_ProfileUpdated implements UserFilterCondition
+{
+ private $comparison;
+ private $date;
+
+ public function __construct($comparison = null, $date = null)
+ {
+ $this->comparison = $comparison;
+ $this->date = $date;
+ }
+
+ public function buildCondition(UserFilter &$uf)
+ {
+ return 'p.last_change ' . $this->comparison . XDB::format(' {?}', date('Y-m-d H:i:s', $this->date));
+ }
+}
+
+class UFC_Birthday implements UserFilterCondition
+{
+ private $comparison;
+ private $date;
+
+ public function __construct($comparison = null, $date = null)
+ {
+ $this->comparison = $comparison;
+ $this->date = $date;
+ }
+
+ public function buildCondition(UserFilter &$uf)
+ {
+ return 'p.next_birthday ' . $this->comparison . XDB::format(' {?}', date('Y-m-d', $this->date));
+ }
+}
+
class UFC_Sex implements UserFilterCondition
{
private $sex;
}
}
-class UFC_Contact implements UserFilterCondition
+abstract class UFC_UserRelated implements UserFilterCondition
{
- private $uid;
- public function __construct($uid = null)
- {
- if (is_null($uid)) {
- $this->uid = S::i('uid');
- } else if ($uid instanceof PlUser) {
- $this->uid = $uid->id();
- } else if (ctype_digit($uid)) {
- $this->uid = (int)$uid;
+ protected $user;
+ public function __construct(PlUser &$user)
+ {
+ $this->user =& $user;
+ }
+}
+
+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 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 {
- Platal::page()->kill("Invalid contact type");
+ return '$UID IN (' . implode(', ', $uids) . ')';
}
}
+}
+
+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)
{
- $sub = $uf->addContactFilter($this->uid);
- return 'c' . $sub . '.contact IS NOT NULL';
+ $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 (' . implode(', ', $promos) . ')';
+ }
+ }
+}
+
+class UFC_WatchContact extends UFC_Contact
+{
+ public function buildCondition(UserFilter &$uf)
+ {
+ if (!$this->user->watchContacts()) {
+ return UserFilterCondition::COND_FALSE;
+ }
+ return parent::buildCondition($uf);
}
}
+
/******************
* ORDERS
******************/
abstract class UserFilterOrder
{
protected $desc = false;
+ public function __construct($desc = false)
+ {
+ $this->desc = $desc;
+ }
public function buildSort(UserFilter &$uf)
{
public function __construct($grade = null, $desc = false)
{
+ parent::__construct($desc);
$this->grade = $grade;
- $this->desc = $desc;
}
protected function getSortTokens(UserFilter &$uf)
public function __construct($type, $variant = null, $particle = false, $desc = false)
{
+ parent::__construct($desc);
$this->type = $type;
$this->variant = $variant;
$this->particle = $particle;
- $this->desc = $desc;
}
protected function getSortTokens(UserFilter &$uf)
class UFO_Registration extends UserFilterOrder
{
- public function __construct($desc = false)
+ protected function getSortTokens(UserFilter &$uf)
{
- $this->desc = $desc;
+ return 'a.registration_date';
}
+}
+class UFO_Birthday extends UserFilterOrder
+{
protected function getSortTokens(UserFilter &$uf)
{
- return 'a.registration_date';
+ return 'p.next_birthday';
}
}
+class UFO_ProfileUpdate extends UserFilterOrder
+{
+ protected function getSortTokens(UserFilter &$uf)
+ {
+ return 'p.last_change';
+ }
+}
+
+class UFO_Death extends UserFilterOrder
+{
+ protected function getSortTokens(UserFilter &$uf)
+ {
+ return 'p.deathdate';
+ }
+}
+
+
/***********************************
*********************************
USER FILTER CLASS
{
if (is_null($this->lastcount)) {
$this->buildQuery();
- return (int)XDB::fetchOneCell('SELECT COUNT(*)
- ' . $this->query . '
- GROUP BY a.uid');
+ return (int)XDB::fetchOneCell('SELECT COUNT(DISTINCT a.uid)
+ ' . $this->query);
} else {
return $this->lastcount;
}
}
return $joins;
}
+
+
+ /** CARNET
+ */
+ private $wn = array();
+ public function addWatchRegistrationFilter($uid = null)
+ {
+ return $this->register_optional($this->wn, is_null($uid) ? null : 'user_' . $uid);
+ }
+
+ private $wp = array();
+ public function addWatchPromoFilter($uid = null)
+ {
+ return $this->register_optional($this->wp, is_null($uid) ? null : 'user_' . $uid);
+ }
+
+ private $w = array();
+ public function addWatchFilter($uid = null)
+ {
+ return $this->register_optional($this->w, is_null($uid) ? null : 'user_' . $uid);
+ }
+
+ private function watchJoins()
+ {
+ $joins = array();
+ foreach ($this->w as $sub=>$key) {
+ if (is_null($key)) {
+ $joins['w' . $sub] = array('left', 'watch');
+ } else {
+ $joins['w' . $sub] = array('left', 'watch', XDB::format('$ME.uid = {?}', substr($key, 5)));
+ }
+ }
+ foreach ($this->wn as $sub=>$key) {
+ if (is_null($key)) {
+ $joins['wn' . $sub] = array('left', 'watch_nonins', '$ME.ni_id = $UID');
+ } else {
+ $joins['wn' . $sub] = array('left', 'watch_nonins', XDB::format('$ME.uid = {?} AND $ME.ni_id = $UID', substr($key, 5)));
+ }
+ }
+ foreach ($this->wn as $sub=>$key) {
+ if (is_null($key)) {
+ $joins['wn' . $sub] = array('left', 'watch_nonins', '$ME.ni_id = $UID');
+ } else {
+ $joins['wn' . $sub] = array('left', 'watch_nonins', XDB::format('$ME.uid = {?} AND $ME.ni_id = $UID', substr($key, 5)));
+ }
+ }
+ foreach ($this->wp as $sub=>$key) {
+ if (is_null($key)) {
+ $joins['wp' . $sub] = array('left', 'watch_promo');
+ } else {
+ $joins['wp' . $sub] = array('left', 'watch_promo', XDB::format('$ME.uid = {?}', substr($key, 5)));
+ }
+ }
+ return $joins;
+ }
}