X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=include%2Freminder.inc.php;h=72b987d26bdc6f30320d303fc70655ca44b4bff1;hb=f0a52f1beb8dc550526ffaddd33144acccfff534;hp=b689656e8020b7902b997f4c0f796df0aac82048;hpb=fb0ee2e864b3a5ffca27b5b6a1cd5c5308c60fe8;p=platal.git diff --git a/include/reminder.inc.php b/include/reminder.inc.php index b689656..72b987d 100644 --- a/include/reminder.inc.php +++ b/include/reminder.inc.php @@ -1,6 +1,6 @@ user = &$user; @@ -69,27 +69,30 @@ abstract class Reminder // Updates (or creates) the reminder line for the pair (|user|, |reminder_id|) // using the |status| as status, and the |next_ask| as the delay between now // and the next ask (if any). - private function UpdateStatus($status, $next_ask) + private static function UpdateStatus($uid, $type_id, $status, $next_ask) { - XDB::execute('REPLACE INTO reminder - SET uid = {?}, type_id = {?}, status = {?}, - remind_last = NOW(), remind_next = FROM_UNIXTIME({?})', - $this->user->id(), $this->type_id, $status, + XDB::execute('INSERT INTO reminder (uid, type_id, status, remind_last, remind_next) + VALUES ({?}, {?}, {?}, NOW(), {?}) + ON DUPLICATE KEY UPDATE status = VALUES(status), remind_last = VALUES(remind_last), remind_next = VALUES(remind_next)', + $uid, $type_id, $status, ($next_ask > 0 ? time() + $next_ask * 24 * 60 * 60 : null)); } // Updates the status of the reminder for the current user. protected function UpdateOnYes() { - $this->UpdateStatus('yes', $this->remind_delay_yes); + $this->UpdateStatus($this->user->id(), $this->type_id, + 'yes', $this->remind_delay_yes); } protected function UpdateOnNo() { - $this->UpdateStatus('no', $this->remind_delay_no); + $this->UpdateStatus($this->user->id(), $this->type_id, + 'no', $this->remind_delay_no); } protected function UpdateOnDismiss() { - $this->UpdateStatus('dismiss', $this->remind_delay_dismiss); + $this->UpdateStatus($this->user->id(), $this->type_id, + 'dismiss', $this->remind_delay_dismiss); } // Display and http handling helpers -------------------------------------- @@ -98,60 +101,92 @@ abstract class Reminder // method below). abstract public function HandleAction($action); - // Returns the content of the onebox reminder. Default implementation displays - // a text and three links (yes, no, dismiss); it uses the text from method - // GetDisplayText. - public function Display(&$page) + // Displays a reduced version of the reminder and notifies that the action + // has been taken into account. + public function NotifiesAction($page) { - header('Content-Type: text/html; charset=utf-8'); - $page->changeTpl('reminder/default.tpl', NO_SKIN); - $page->assign('text', $this->GetDisplayText()); - $page->assign('baseurl', $this->GetBaseUrl()); + pl_content_headers("text/html"); + $page->changeTpl('reminder/notification.tpl', NO_SKIN); + $page->assign('previous_reminder', $this->title()); } - // Helper for returning the content as a string, instead of using the existing - // globale XorgPage instance. - public function GetDisplayAsString() + // Displays the reminder as a standalone html snippet. It should be used + // when the reminder is the only output of a page. + public function DisplayStandalone($page, $previous_reminder = null) { - $page = new XorgPage(); - $this->Display($page); - return $page->raw(); + pl_content_headers("text/html"); + $page->changeTpl('reminder/base.tpl', NO_SKIN); + $this->Prepare($page); + if ($previous_reminder) { + $page->assign('previous_reminder', $previous_reminder); + } + } + + // Prepares the display by assigning template variables. + public function Prepare($page) + { + $page->assign_by_ref('reminder', $this); } - // Returns the text to display in the onebox. - abstract protected function GetDisplayText(); + // Returns the name of the inner template, or null if a simple text obtained + // from GetText should be printed. + public function template() { return null; } + + // Returns the text to display in the onebox, or null if a + public function text() { return ''; } + + // Returns the title of the onebox. + public function title() { return ''; } + + // Should return true if this onebox needs to be considered as a warning and + // not just as a subscription offer. + public function warning() { return false; } // Returns the base url for the reminder module. - protected function GetBaseUrl() + public function baseurl() { return 'ajax/reminder/' . $this->name; } + // Returns the url for the information page. + public function info() { return ''; } + + // Static status update methods ------------------------------------------- + + // Marks the candidate reminder as having been accepted for user |uid|. + // It is intended to be used when a reminder box has been bypassed, and when + // it should behave as if the user had clicked on 'yes'. + protected static function MarkCandidateAsAccepted($uid, $candidate) + { + Reminder::UpdateStatus($uid, $candidate['type_id'], + 'yes', $candidate['remind_delay_yes']); + } + // Static factories ------------------------------------------------------- // Returns a chosen class using the user data from |user|, and from the database. - public static function GetCandidateReminder(User &$user) + public static function GetCandidateReminder(User $user) { $res = XDB::query('SELECT rt.*, r.status, r.remind_last FROM reminder_type AS rt LEFT JOIN reminder AS r ON (rt.type_id = r.type_id AND r.uid = {?}) - WHERE r.uid IS NULL OR r.remind_next < NOW() - ORDER BY RAND()', + WHERE r.uid IS NULL OR r.remind_next < NOW()', $user->id()); - $candidates = $res->fetchAllAssoc(); - $priority = rand(1, 100); - while (count($candidates) > 0 && $priority > 0) { + + $weight_map = create_function('$a', 'return $a["weight"];'); + while (count($candidates) > 0) { + $position = rand(1, array_sum(array_map($weight_map, $candidates))); foreach ($candidates as $key => $candidate) { - if ($candidate['weight'] > $priority) { + $position -= $candidate['weight']; + if ($position <= 0) { $class = self::GetClassName($candidate['name']); - if ($class && call_user_func(array($class, 'IsCandidate'), $user)) { + if ($class && call_user_func(array($class, 'IsCandidate'), $user, $candidate)) { return new $class($user, $candidate); } unset($candidates[$key]); } } - $priority = (int) ($priority / 2); } return null; @@ -159,7 +194,7 @@ abstract class Reminder // Returns an instantiation of the reminder class which name is |name|, using // user data from |user|, and from the database. - public static function GetByName(User &$user, $name) + public static function GetByName(User $user, $name) { if (!($class = self::GetClassName($name))) { return null; @@ -181,7 +216,7 @@ abstract class Reminder // the class. private static function GetClassName($name) { - @require_once "reminder/$name.inc.php"; + include_once "reminder/$name.inc.php"; $class = 'Reminder' . str_replace(' ', '', ucwords(str_replace('_', ' ', $name))); return (class_exists($class) ? $class : null); }