/** * Entry point for app * * @return bool false - not found * @throws router_exception */ function dispatch($url = false) { if ($this->cfg('options.log_requests')) { $this->logger->log('request', $url); } $request = $url ? $url : urldecode($_SERVER['REQUEST_URI']); self::event('dispatch_before', array('url' => &$request)); $skip_site_check = false; if (preg_match('@users/(login|logout)/\\z@', $request)) { $this->set_cfg_var('in_login', true); $skip_site_check = true; } // returns HTTP_HOST if main_domain not set $domain = $_SERVER['HTTP_HOST']; //$this->get_main_domain(); $subdomain = $_SERVER['HTTP_HOST'] != $domain ? substr($_SERVER['HTTP_HOST'], 0, -1 + -1 * strlen($domain)) : false; if ('www' === $subdomain) { $subdomain = false; } $this->set_cfg_var('subdomain', $subdomain); $cname = false; // check for cname if ($domain != substr($_SERVER['HTTP_HOST'], -1 * ($sl = strlen($domain)), $sl)) { $cname = preg_replace('/^.*\\.([^\\.]+\\.[\\w]+)$/', '$1', $_SERVER['HTTP_HOST']); $this->set_cfg_var('cname', $cname); } // @todo fix tails or errors if (false !== ($qpos = strpos($request, '?'))) { $request = substr($request, 0, $qpos); } $dispatcher = self::$modules->get_main(); if (!$dispatcher) { throw new module_exception('Main module not set'); } $this->append_base_url($this->router->get_protocol()); $this->append_base_url($this->cfg('main_domain'), true); if ($dispatcher && functions::is_callable(array($dispatcher, 'predispatch'))) { $dispatcher->predispatch($domain, $request); } /** * /domain/module+alias/ * check path against * - modules list * - alias list */ $request_array = explode('/', $request); // remove empty parts array_splice($request_array, 0, 1); if (empty($request_array[count($request_array) - 1])) { array_splice($request_array, -1, 1); } $request_count = count($request_array); // Output filters if ($request_count >= 2 && $request_array[$request_count - 2] == 'outfilter') { $filter = $request_array[$request_count - 1]; if (!$this->set_output_filter($filter)) { throw new router_exception('Invalid filter - ' . $filter, router_exception::NOT_FOUND); } array_splice($request_array, -2); // @todo slice $request } $router_module = null; if ($this->in_index()) { // override frontpage layout if ($template = $this->cfg('site.frontpage.template')) { $this->renderer->set_page_template($template); } } $root = isset($request_array[0]) ? array_shift($request_array) : false; if (!empty($root) && !preg_match('/^[\\w_\\.\\-\\%а-я[:space:]]+$/ui', $root)) { throw new router_exception('Root route error'); } if (empty($root)) { // use default module as router self::$modules->get_main()->set_is_router(); } else { // core module calls if ('core' == $root) { $this->set_is_router(true); $router_module = $this; } else { if (self::$modules->is_registered($root)) { self::$modules->set_router($root); } else { /** @var core_module */ $pmod = self::$modules->get_by_alias($root); if ($pmod) { $pmod->set_is_router(true); } else { // default, inject root element array_unshift($request_array, $root); self::$modules->get_main()->set_is_router(); // no module found, route to default router (with main flag) } } } } // nothing routed? $router_module = $router_module ? $router_module : self::$modules->get_router(); if (!$router_module) { throw new router_exception('No router module found'); } $router = $router_module->get_router(); self::event('route_before', $router); if ($router) { self::dprint('[ROUTER] using ' . $router_module->get_name()); $result = $router->route($request_array); if (!$result) { throw new router_exception('Requested page doesnt exists'); } /*deprecated*/ /* self::lib('renderer')->set_main_template( $router_module->get_controller()->get_template() ); */ } else { throw new router_exception('No router available for ' . ($router_module ? $router_module->get_name() : ''), 0); } }