Не так давно начал изучать ООП и решил попробовать сделать постраничный вывод новостей с использованием mvc, вроде бы все получилось, но возникла одна проблема: Есть главная страница http://news.mvc/ здесь отображаются 5 новостей + пагинация внизу 1,2,3,4,5.... При щелчке на нужную страницу перекидывает на пустую страницу http://news.mvc/page=1 , как сделать, чтобы изначальный адрес был http://news.mvc/news/ или как сделать чтобы в адресную строку добавлялось /news/ при переходе на страницы?Или хотя бы подскажите, где это сделать, а там постараюсь сам решить проблему Если открыть http://news.mvc/ и сначала щелкнуть на конкретную новость открывается http://news.mvc/news/id_новости , а потом вернуться на все новости то переход уже будет работать http://news.mvc/news/page-1 Код (Text): class Pagination { private $max = 114; private $index = 'page'; private $current_page; private $total; private $limit; // Запуск необходимых данных для навигации public function __construct($total, $currentPage, $limit, $index) { // Устанавливаем общее количество записей $this->total = $total; // Устанавливаем количество записей на страницу $this->limit = $limit; // Устанавливаем ключ в url $this->index = $index; // Устанавливаем количество страниц $this->amount = $this->amount(); // Устанавливаем номер текущей страницы $this->setCurrentPage($currentPage); } // Для вывода ссылок.HTML-код со ссылками навигации public function get() { // Для записи ссылок $links = null; // Получаем ограничения для цикла $limits = $this->limits(); $html = '<div class="pagination">'; // Генерируем ссылки for ($page = $limits[0]; $page <= $limits[1]; $page++) { // Если это текущая страница, ссылки нет и добавляется класс active if ($page == $this->current_page) { $links .= '<a href="#" class="selected">' . $page . '</a>'; } else { // Иначе генерируем ссылку $links .= $this->generateHtml($page); } } $html .= $links . '</div>'; // Возвращаем html return $html; } //Для генерации HTML-кода ссылки.$page - номер страницы private function generateHtml($page, $text = null) { // Указываем, что текст - цифра страницы $text = $page; $currentURI = rtrim($_SERVER['REQUEST_URI'], '/') . '/'; $currentURI = preg_replace('~/page-[0-9]+~', '', $currentURI); // Формируем HTML код ссылки и возвращаем return '<a href="'.$currentURI. $this->index . $page . '">' . $text . '</a>'; } // Для получения, откуда стартовать private function limits() { // Конец - общее количество страниц $end = $this->amount; // Начало - минус $this->max от конца $start = $this->amount - $this->max > 0 ? $this->amount - $this->max : 1; // Возвращаем return array($start, $end); } //Для установки текущей страницы private function setCurrentPage($currentPage) { # Получаем номер страницы $this->current_page = $currentPage; # Если текущая страница больше нуля if ($this->current_page > 0) { # Если текущая страница меньше общего количества страниц if ($this->current_page > $this->amount) # Устанавливаем страницу на последнюю $this->current_page = $this->amount; } else # Устанавливаем страницу на первую $this->current_page = 1; } // Для получения общего числа страниц private function amount() { // Делим и возвращаем return ceil($this->total / $this->limit); } } routes: return array( 'news/([0-9]+)' => 'news/view/$1', 'news' =>'news/index', 'news/page-([0-9]+)' => 'news/index/$1', '' => 'news/index', ); [code] Класс Route [code] class Router { private $routes; //Маршруты public function __construct() { $routesPath = ROOT . '/config/routes.php'; $this->routes = include($routesPath); } //Возвращает строку запроса private function getUri() { if(!empty($_SERVER['REQUEST_URI'])) { return trim($_SERVER['REQUEST_URI'],'/'); } } public function run() { // Получить строку запроса $uri = $this->getUri(); // Проверить наличие такого запроса в routes.php foreach ($this->routes as $uriPattern=>$path){ // Сравниваем $uriPattern и $uri if (preg_match("~^$uriPattern$~",$uri)){ // Получаем внутренний путь из внешнего согласно правилу. $internalRoute = preg_replace("~^$uriPattern~",$path,$uri); // Определить контроллер, action, параметры $segments = explode('/',$internalRoute); $controllerName = array_shift($segments) . 'Controller'; $controllerName = ucfirst($controllerName); $actionName = 'action'.ucfirst(array_shift($segments)); $parameters = $segments; // Подключить файл класса-контроллера $controllerFile = ROOT.'/controllers/'. $controllerName.'.php'; if (file_exists($controllerFile)){ include_once($controllerFile); } // Создать объект, вызвать метод (т.е. action) $controllerObject = new $controllerName; $result = call_user_func_array(array($controllerObject, $actionName),$parameters) ; if ($result!=null){ break; } } } } } [code] Заранее благодарю! [B][/B]
Вопрос, откуда вообще взялись дубли / и /news/ (про /page=1 – WTF Пропустили вопросительный знак или написали = вместо черточки? – я уже молчу, как и про /news/page-1). У вас должна быть ф-ция представления, которая собирает адреса по каким-то исходным данным, например: PHP: href="<?= pagelink(1,'','news') ?>" Это, предположительно, для трехкомпонентных адресов, например /news[/100500][?page=2], при этом параметры ф-ции имеют обратный порядок относительно расположения компонентов в адресе. Использование дефолтных значений параметров, учитывающих адрес текущей страницы, тоже вполне допустимо, например pagelink(1) на странице /news?page=2 и т.п. В этой же ф-ции уместно делать «ротацию», скрывая параметр page при поступлении 0 или 1.