public static function execRouterHook(_Core_Request $request, &$class, &$method, array &$chunks, &$templateEngine) { $access = new _Core_Access(_User::getCurrent()); if (!$access->isAllowed($request->uri)) { // Редирект через заголовок. Дабы явно сменился урл в браузере оО _Core_Router::redirect($access->defaultPage, true, 403); } }
public function performRequest() { // Формируем массив для разбора (substr отрезает "/" в начале) $uri = substr($this->request->uri, 1); $uriArr = explode('/', $uri); // Предопределяем переменную для хранения последней части запроса $lastPart = null; // Цикл по реверсивному поиску класса\метода оО (ниже понятнее) =) $iterations = sizeof($uriArr); for ($i = $iterations; $i >= 1; $i--) { // Пытаемся сформировать название класса из запроса $className = $this->formClassName($uriArr); // если таковой существует ... if (class_exists($className)) { $this->className = $className; // Проверяем нет ли метода с имененем = последнему элементу запроса if (method_exists($this->className, $lastPart)) { $this->methodName = $lastPart; // Не забываем подчистить остатки array_shift($this->requestRemains); } else { $this->methodName = 'index'; } break; } // Перед переходом на последующую итерацию обрезаем последний элемент запроса $lastPart = array_pop($uriArr); // И пропихиваем его в массив остатков array_unshift($this->requestRemains, $lastPart); // Если итерация = 1 а класс ещё не определён if ($i == 1 && empty($this->className)) { //Подкидываем ещё один элемент в запрос array_unshift($uriArr, 'index'); // Увеличиваем счётчик... $i++; } } // Вызов подключённых хуков foreach ($this->hooks as $className) { call_user_func_array(array($className, 'execRouterHook'), array($this->request, &$this->className, &$this->methodName, &$this->requestRemains, &$this->templateEngine)); } $controller = new $this->className($this->templateEngine, $this->request); // Svel: добавил редирект, только ему пофигу на GET-POST, будет 404ые генерить if (method_exists($controller, $this->methodName)) { call_user_func(array($controller, $this->methodName), $this->requestRemains); } else { $url = sprintf("%smy/%s", URL_ROOT, $uri); _Core_Router::redirect($url, true, 302); die; } unset($controller); }
/** * Удаляет указанный счет * @param $args array mixed * @return void */ function delete($args) { if (isset($_REQUEST['confirmed']) && $_REQUEST['confirmed']) { $params = $_REQUEST; // Предупреждение перед удалением if (count($this->user->getUserAccounts()) == 1) { $this->renderJsonError('Перед удалением последнего счета создайте нужные Вам счета'); } $account = Account::getTypeByID($params); $er = $account->delete($this->user, $params); if (!$er) { $this->renderJsonError('Счёт не удалён'); } if ($er === 'cel') { $this->renderJsonError('Невозможно удалить счёт, к которому привязана фин.цель'); } else { //@XXX Тут как бы хз.. Нужно проверять какую конструкцию поставить. //Сильно смущает строка ниже, передающая в шаблонизатор переменную $this->tpl->assign('result', array('text' => 'Счёт удален')); } $this->tpl->assign('name_page', 'info_panel/info_panel'); } elseif (!isset($_POST['confirmed'])) { $confirm = array('title' => 'Удаление счёта', 'message' => 'Вы действительно хотите удалить выбранный счёт?', 'yesLink' => '/accounts/delete/?id=' . $args[0] . '&confirmed=1', 'noLink' => $_SERVER['HTTP_REFERER']); // Сохраняем в сессии адрес куда идти если согласится $_SESSION['redirect'] = $_SERVER['HTTP_REFERER']; $this->tpl->assign('confirm', $confirm); $this->tpl->assign('name_page', 'confirm'); // Видимо передумали удалять и наша логика не сработала - редиректим на инфо } else { _Core_Router::redirect('/info'); } }
/** * Делает редирект на указанную страницу. Нужна для тестов * * @param string $url * @return void */ protected function _redirect($url) { _Core_Router::redirect($url); }
/** * Удаляет указанную категорию * @param $args array mixed * @return void */ function del($args) { $catId = 0; if (array_key_exists(0, $args) && is_numeric($args[0]) && $args[0]) { $catId = (int) $args[0]; } elseif (isset($this->request->post['id']) && $this->request->post['id']) { $catId = (int) $this->request->post['id']; } // Проверяем, есть ли по категории операции if (isset($this->request->post['confirm']) && $this->request->post['confirm'] === 'false' && $this->model->getCountOperationByCategory(Core::getInstance()->user, $catId) > 0) { die(json_encode(array("confirm" => array("text" => "Эта категория содержит операции. " . "При удалении категории все операции по ней будут удалены!" . "\n\nВы действительно хотите удалить категорию?", "id" => $catId)))); } // Если удаление подтверждено.... if (isset($this->request->get['confirmed']) && $this->request->get['confirmed']) { // Отмечаем операции неподтверждёнными $operation = new Operation_Model(); $operation->deleteOperationsByCategory(Core::getInstance()->user, $catId); // Удаляем категорию (делаем невидимой) if ($this->model->del($catId)) { $this->tpl->assign('result', array('text' => "Категория успешно удалена.", 'id' => $catId)); } else { $this->tpl->assign('error', array('text' => "Не удалось удалить категорию.")); } //возвращаемся if (array_key_exists('redirect', $_SESSION)) { _Core_Router::redirect($_SESSION['redirect'], true); unset($_SESSION['redirect']); } } elseif (!isset($request->get['confirmed'])) { $confirm = array('title' => 'Удаление категории', 'message' => 'Вы действительно хотите удалить категорию?', 'yesLink' => '/category/del/' . $catId . '?confirmed=1', 'noLink' => $_SERVER['HTTP_REFERER']); if ($this->model->getCountOperationByCategory(Core::getInstance()->user, $catId) > 0) { $confirm['message'] = "<b>Эта категория содержит операции.</b><br/>" . "При удалении категории все операции по ней будут удалены!<br/><br/>" . "Вы действительно хотите удалить категорию?"; } // Сохраняем в сессии адрес куда идти если согласится $_SESSION['redirect'] = $_SERVER['HTTP_REFERER']; $this->tpl->assign('confirm', $confirm); $this->tpl->assign('name_page', 'confirm'); } else { _Core_Router::redirect('/info'); } }
/** * Удаляет выбранное событие * @param $args array mixed Какие-нибудь аргументы * @return void */ function del($args) { $operationId = 0; if (array_key_exists(0, $args) && is_numeric($args[0]) && $args[0]) { $operationId = (int) $args[0]; } elseif (isset($this->request->post['id']) && $this->request->post['id']) { $operationId = $this->request->post['id']; } // Если удаление подтверждено.... if (isset($this->request->get['confirmed']) && $this->request->get['confirmed']) { if ($this->model->deleteOperation($operationId)) { $this->tpl->assign('result', array('text' => "Операция успешно удалена.")); } else { $this->tpl->assign('error', array('text' => "Не удалось удалить операцию.")); } //возвращаемся if (array_key_exists('redirect', $_SESSION)) { _Core_Router::redirect($_SESSION['redirect'], true); unset($_SESSION['redirect']); } } elseif (!isset($this->request->get['confirmed'])) { $confirm = array('title' => 'Удаление операции', 'message' => 'Вы действительно хотите удалить операцию?', 'yesLink' => '/operation/del/' . $operationId . '?confirmed=1', 'noLink' => $_SERVER['HTTP_REFERER']); // Сохраняем в сессии адрес куда идти если согласится $_SESSION['redirect'] = $_SERVER['HTTP_REFERER']; $this->tpl->assign('confirm', $confirm); $this->tpl->assign('name_page', 'confirm'); } else { _Core_Router::redirect('/info'); } }
$templateEngine->display('index.html'); } else { if (!IS_DEMO) { // Если пользователь зашёл с мобильного браузера if (_Core_Request::getCurrent()->host . '/' != HOST_ROOT_PDA && Helper_DetectBrowser::detectMobile() && !isset($_COOKIE['DO_WHANT_FULL_VERSION'])) { if (isset($_SERVER['HTTP_REFERER']) && strpos($_SERVER['HTTP_REFERER'], HOST_ROOT_PDA) === false) { header('Location: ' . URL_ROOT_PDA); exit; } else { setcookie('DO_WHANT_FULL_VERSION', true); } } } $templateEngine->display('index.html'); } // Применение модификаций\удалений моделей _Core_ObjectWatcher::getInstance()->performOperations(); } catch (Exception $e) { // Вывод отладочной информации if (DEBUG) { if (strtolower(ini_get('html_errors')) == 'on') { highlight_string("<?php\n #" . $e->getMessage() . "\n\n in " . $e->getFile() . ':' . $e->getLine() . "\n\n" . $e->getTraceAsString()); } else { print $e->getMessage() . "\n\n in " . $e->getFile() . ':' . $e->getLine() . "\n\n" . $e->getTraceAsString(); } } elseif ('/notfound' == $request->uri) { //exit(); } else { _Core_Router::redirect('/notfound', false, 404); } }