protected final function fixroute($a_route) { $r = new ZRoute($a_route); if (!$r->getModule()) { $r->setModule($this->getConfig()->getValue('module.default_name', self::DEFAULT_MODULE_NAME)); } if (!$r->getController()) { $r->setController($this->getConfig()->getValue('controller.default_name', self::DEFAULT_CONTROLLER_NAME)); } if (!$r->getAction()) { $r->setAction($this->getConfig()->getValue('controller.default_action', self::DEFAULT_ACTION_NAME)); } $o = (string) $r; unset($r); return $o; }
/** * Execute application */ private final function _execute() { $_errtype = E_ALL; // Set application plugin manager listen global event dispatcher $this->getPluginManager()->setTarget(Zoombi::getDispatcher()); $this->getDispatcher()->connect('_triggerError', array(&$this, '_error_trigger')); try { // Notify for start execution $this->emit(new ZEvent($this, 'preExecute')); // Attach error and exception handlers if applicatio execution mode is 'debug' if ($this->isMode(self::MODE_DEBUG)) { $old_errr = error_reporting($_errtype); set_error_handler(array($this, '_error_handler'), $_errtype); //set_exception_handler(array( $this, '_exception_handler' )); } // Notify befor route start //$this->emit(new ZEvent($this, 'preRoute')); if (!$this->getFlag(self::FLAG_NO_ROUTE)) { $request = null; // Process request info $req_qry = explode('?', $_SERVER['REQUEST_URI'], 2); $request = array_shift($req_qry); // Get content rewrite variabe $rt = $this->getConfig()->getValue('routevar', 'rt'); $rvar = null; if (isset($_GET[$rt])) { $rvar = $_GET[$rt]; unset($_GET[$rt]); } if ($req_qry) { $rvar .= '?' . $req_qry[0]; } // Attach routing rules to router $routes = new ZConfig(); $rs = $this->getConfig()->getValue('routes', null); switch (gettype($rs)) { case 'array': case 'object': $routes->setData($rs); break; case 'string': $routes->fromFile($this->fromBaseDir($rs)); break; } $this->getRouter()->setRules($routes->toArray()); unset($routes); $this->emit(new ZEvent($this, 'preRoute', $rvar)); $this->getRouter()->setRequest($rvar); $redir = $this->getRouter()->route($rvar); $p = new ZRoute($redir); if (!$this->getLoader()->hasModule($p->getModule()) and $p->getModule() != $this->getName()) { $p->push_start($this->getName()); } $fix = $this->fixroute($p); $this->getRouter()->setRedirect($fix)->setCurrent($fix)->setForward($fix); $this->emit(new ZEvent($this, 'postRoute', $fix)); $approute = true; if ($p->getModule() == $this->getName()) { $p->pop_start(); } $this->route($p, array('approute')); $approute = false; } } catch (ZException $e) { switch ($e->getCode()) { case ZControllerException::EXC_QUIT: $this->getConfig()->setValue('output', false); break; case ZControllerException::EXC_QUIT_OUTPUT: $this->getConfig()->setValue('output', true); break; case ZControllerException::EXC_LOAD: case ZControllerException::EXC_NO_FILE: case ZControllerException::EXC_ACTION: $this->emit(new ZEvent($this, 'onError', 404, $e)); $this->emit(new ZEvent($this, 'on404', $this->getRoute())); break; case ZControllerException::EXC_DENY: $this->emit(new ZEvent($this, 'onError', 403, $e)); $this->emit(new ZEvent($this, 'on403', $this->getRoute())); break; case ZControllerException::EXC_AUTH: $this->emit(new ZEvent($this, 'onError', 401, $e)); $this->emit(new ZEvent($this, 'on401', $this->getRoute())); break; default: $this->emit(new ZEvent($this, 'onError', 500, $e)); $this->emit(new ZEvent($this, 'on500', $e)); break; } } if (Zoombi::ack($this->getConfig()->getValue('output', false))) { ob_start(); if (Zoombi::ack($this->getConfig()->get('showerror', 'false'))) { foreach ($this->m_errors as $e) { $this->showError($e); } } $this->emit(new ZEvent($this, 'onOutput')); $cnt = ob_get_contents(); ob_end_clean(); ZResponse::getInstance()->setContent(ZResponse::getInstance()->getContent() . $cnt); } $this->emit(new ZEvent($this, 'postExecute')); if ($this->isMode(self::MODE_DEBUG)) { restore_error_handler(); error_reporting($old_errr); } ZResponse::getInstance()->output(); }
/** * Route path * @param string $a_path * @return ZModule */ public final function &route($a_path, $a_args = array()) { Zoombi::getApplication()->m_route_deep++; switch (gettype($a_path)) { case 'string': if (substr($a_path, 0, 1) == Zoombi::SS) { return $this->_reRoute(Zoombi::getApplication(), substr($a_path, 1), $a_args); } break; case 'object': if (!$a_path instanceof ZRoute) { return $this; } break; default: return $this; break; } $p = new ZRoute($a_path); $m = $p->getModule(); if (empty($m)) { $m = $this->getConfig()->getValue('module.default_name', self::DEFAULT_MODULE_NAME); } $this->emit(new ZEvent($this, 'preModule', $m)); if ($this->getLoader()->hasModule($m)) { $mod = $this->getLoader()->module($m); if (!$mod) { throw new ZModuleException('Bad module'); } $this->emit(new ZEvent($this, 'postModule', $mod)); return $this->_reRoute($mod, $p->pop_start(), $a_args); } $this->emit(new ZEvent($this, 'postModule', $this)); $p->push_start($this->getName()); $route = $p; $c = $route->getController(); $a = $route->getAction(); if (empty($c)) { $route->setController($this->getConfig()->getValue('controller.default_name', self::DEFAULT_CONTROLLER_NAME)); } if (empty($a)) { $route->setAction($this->getConfig()->getValue('controller.default_action', self::DEFAULT_ACTION_NAME)); } $c = $route->getController(); $a = $route->getAction(); $this->emit(new ZEvent($this, 'preController', $c)); $ctl = null; $ctl = $this->getLoader()->controller($c); if (!$ctl) { throw new ZModuleException('Module "' . $this->getName() . '" can\'t find controller "' . $c . '".'); } $this->emit(new ZEvent($this, 'postController', $c, $ctl)); if (!$ctl->hasAction($a)) { throw new ZModuleException('Module "' . $this->getName() . '" can\'t find controller "' . $c . '" action "' . $a . '".'); } $this->emit(new ZEvent($this, 'preAction', $a)); $this->setRoute($route)->setArgs($a_args); $this->m_return = $ctl->requestAction($a, $this->getRoute()->getParamsArray(), $this->m_output); return $this->emit(new ZEvent($this, 'postAction', $a)); }