Изучаю MVC PHP, нашел на хабре вполне годный пример. Стал разбираться. Вроде все работает, пока дело не дошло до пагинации. Имею следующее:
Роутер<?php
class Route
{
static function start()
{
// контроллер и действие по умолчанию
$controller_name = 'Main';
$action_name = 'index';
$params = [];
$routes = explode('/', $_SERVER['REQUEST_URI']);
// получаем имя контроллера
if ( !empty($routes[1]) )
{
$controller_name = $routes[1];
}
// получаем имя экшена
if ( !empty($routes[2]) )
{
$action_name = $routes[2];
}
// добавляем префиксы
$model_name = 'Model_'.$controller_name;
$controller_name = 'Controller_'.$controller_name;
$action_name = 'action_'.$action_name;
// подцепляем файл с классом модели (файла модели может и не быть)
$model_file = strtolower($model_name).'.php';
$model_path = "app/model/".$model_file;
if(file_exists($model_path))
{
include "app/model/".$model_file;
}
// подцепляем файл с классом контроллера
$controller_file = strtolower($controller_name).'.php';
$controller_path = "app/controller/".$controller_file;
if(file_exists($controller_path))
{
include "app/controller/".$controller_file;
}
else
{
Route::ErrorPage404();
}
// создаем контроллер
$controller = new $controller_name;
$action = $action_name;
if(method_exists($controller, $action))
{
// вызываем действие контроллера
$controller->$action();
}
else
{
// здесь также разумнее было бы кинуть исключение
Route::ErrorPage404();
}
}
function ErrorPage404()
{
$host = 'http://'.$_SERVER['HTTP_HOST'].'/';
header('HTTP/1.1 404 Not Found');
header("Status: 404 Not Found");
header('Location:'.$host.'404');
}
}
Модель<?php
$page = '';
$pages_count = '';
class Model_Ticket extends Model {
public static function SelectAllTicket() {
$q = Database::getConnection();
global $page, $pages_count;
$perpage = 10;
if (empty(@$_GET['p']) || ($_GET['p'] <= 0)) {
$page = 1;
} else {
$page = $_GET['p'];
}
$res = $q->query("SELECT COUNT(*) FROM ticket");
$count = $res->fetchColumn();
$pages_count = ceil($count / $perpage);
if ($page > $pages_count) $page = $pages_count;
$start_pos = ($page - 1) * $perpage;
$select_ticket = $q->prepare("SELECT id_ticket, status FROM ticket JOIN status ON ticket.status=status.id_status LIMIT :start, :limit");
$select_ticket->bindParam(':start', $start_pos, PDO::PARAM_INT);
$select_ticket->bindParam(':limit', $perpage, PDO::PARAM_INT);
$select_ticket->execute();
while($row = $select_ticket->fetch(PDO::FETCH_ASSOC)) {
$ticket[] = $row;
}
return $ticket;
}
public function Pager($page, $pages_count) {
global $page, $pages_count;
for ($j = 1; $j <= $pages_count; $j++) {
if ($j == $page) {
echo ' <li class="active"><a href=?p='.$j.'>'.$j.'</a></li> ';
} else {
echo ' <li><a href=?p='.$j.'>'.$j.'</a></li> ';
}
if ($j != $pages_count) echo ' ';
}
return true;
}
}
Контроллер<?php
class Controller_Ticket extends Controller
{
function action_index()
{
$model = new Model_Ticket();
$ticket['ticket'] = $model->SelectAllTicket();
$this->view->generate('ticket_view.php', 'template_view.php', [
'ticket'=>$ticket,
]);
}
}
Если просто открыть /ticket, то все выводит, пагинация считает страницы, выводит навигацию. Но если попробовать переключить страницу выкидывает 404. То есть просто ticket в URL принимает, а ticket?p=2 не принимает.
Помогите реализовать, а то уже мозг кипит, ничего понять не могу.