Задать вопрос
@LikeSD
Системный администратор

Пагинация MVC PHP как передать параметр?

Изучаю 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 не принимает.

Помогите реализовать, а то уже мозг кипит, ничего понять не могу.
  • Вопрос задан
  • 1310 просмотров
Подписаться 2 Простой Комментировать
Решения вопроса 1
@LikeSD Автор вопроса
Системный администратор
Решил проблему.
Если сделать /ticket/main/?p=2, то все работает. В контроллере сделал пустой action_index, а нужный вывод отправил в action_main. Все работает, как и хотел.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@synapse_people
МОДЕЛЬ НЕ ДОЛЖНА РАБОТАТЬ С GET/POST ДАННЫМИ, И SQL
Ответ написан
Комментировать
@zim32
У вас в action name случайн опараметр p=2 не попадает?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы