X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=classes%2FPlatal.php;h=c34d34d0e7d3e915f8d8c48743e8a94c6a145fc0;hb=c99ef281118de7ab4b45de299701925ad5ebb26c;hp=b5874588c96302efbb09ee1dbda1073dd529139f;hpb=b62f88580b5d5a12e804094ddc46033b62a8dbff;p=platal.git diff --git a/classes/Platal.php b/classes/Platal.php index b587458..c34d34d 100644 --- a/classes/Platal.php +++ b/classes/Platal.php @@ -19,8 +19,6 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * ***************************************************************************/ -define('PL_OK', 0); -define('PL_NEEDLOGIN', 1); define('PL_FORBIDDEN', 403); define('PL_NOT_FOUND', 404); @@ -29,72 +27,107 @@ class Platal var $__mods; var $__hooks; + var $ns; var $path; - var $menu; - var $auth; + var $argv; function Platal() { - $this->path = Get::_get('p', null); + $modules = func_get_args(); + $this->path = trim(Get::_get('n', null), '/'); $this->__mods = array(); $this->__hooks = array(); - $this->menu = array(); - foreach (glob(dirname(__FILE__).'/../modules/*.php') as $module) { - $module = basename($module, '.php'); - $m =& PLModule::factory($this, $module); - $this->__mods[$module] =& $m; + array_unshift($modules, 'core'); + foreach ($modules as $module) { + $this->__mods[$module] = $m = PLModule::factory($module); $this->__hooks += $m->handlers(); - $this->menu = array_merge($this->menu, $m->menu_entries()); } - - krsort($this->__hooks); - usort($this->menu, array($this, '_menu_cmp')); } - function load_class($cls) + function pl_self($n = null) { - require_once dirname(__FILE__).'/../classes/'.$cls.'.php'; - } + if (is_null($n)) + return $this->path; - function _menu_cmp($a, $b) - { - return strcasecmp($a['path'], $b['path']); + if ($n >= 0) + return join('/', array_slice($this->argv, 0, $n + 1)); + + if ($n <= -count($this->argv)) + return $this->argv[0]; + + return join('/', array_slice($this->argv, 0, $n)); } - function call_hook(&$page) + function find_hook() { $p = $this->path; - while ($path) { + while ($p) { if (array_key_exists($p, $this->__hooks)) break; $p = substr($p, 0, strrpos($p, '/')); } + if (empty($this->__hooks[$p])) { + return null; + } + + $hook = $this->__hooks[$p]; + + if (!is_callable($hook['hook'])) { + return null; + } + + $this->argv = explode('/', substr($this->path, strlen($p))); + $this->argv[0] = $p; + + return $hook; + } + + function call_hook(&$page) + { + $hook = $this->find_hook(); + + if (is_null($hook)) { return PL_NOT_FOUND; } - $args = array_merge(array(&$page), - explode('/', substr($this->path, strlen($p) + 1))); + $args = $this->argv; + $args[0] = &$page; - $hook = $this->__hooks[$p]; - if ($hook['auth'] > Session::get('auth', AUTH_PUBLIC)) { - $_SESSION['session']->doAuth($page); + if ($hook['auth'] > S::v('auth', AUTH_PUBLIC)) { + // FIXME: don't use 'session' object anymore + if (!$_SESSION['session']->doAuth()) { + $this->force_login($page); + } } + return call_user_func_array($hook['hook'], $args); } + function force_login(&$page) + { + if (S::logged() and !$new_name) { + $page->changeTpl('password_prompt_logged.tpl'); + $page->addJsLink('do_challenge_response_logged.js'); + } else { + $page->changeTpl('password_prompt.tpl'); + $page->addJsLink('do_challenge_response.js'); + } + $page->run(); + } + function run() { global $page; - new_skinned_page('index.tpl', AUTH_PUBLIC); + new_skinned_page('index.tpl'); if (empty($this->path)) { - $page->run(); + $this->path = 'index'; } switch ($this->call_hook($page)) { @@ -106,8 +139,19 @@ class Platal $this->__mods['core']->handler_404($page); break; } + $page->assign_by_ref('platal', $this); $page->run(); } + + function on_subscribe($forlife, $uid, $promo, $pass) + { + $args = func_get_args(); + foreach ($this->__mods as $mod) { + if (!is_callable($mod, 'on_subscribe')) + continue; + call_user_func_array(array($mod, 'on_subscribe'), $args); + } + } } ?>