Странициране

teroristd

Registered
Здравейте, искам да направя странициране, но дори не знам как да почна. Ето каква е постановката при мен. Имам index controller, index model и index view. В модела селектирам базата и връщам масива. В контролера получавам масива, присвоявам го на една променлива и го пращам към вю-то, където го обхождам и вадя резултата. Урл-а ми е localhost/site/public/index/run/.

Код:
class IndexModel {

    public function viewImage() {

        $sql = $this->_database->prepare('SELECT * FROM images')->execute()->fetchAllAssoc();

        return $sql;
    }
}

Код:
class Index {

    public function run() {

        $this->layout();
    }

    private function layout() {

        $this->_view->_image = $this->_indexModel->viewImage();

        $this->_view->display('header');
        $this->_view->display('body');
        $this->_view->display('footer');
    }
}

Код:
<body>

    <?php
        foreach ($this->_image as $value)
        {
      ?>

          <img src="<?php echo $value['image']; ?>"/>

      <?php
        }
      ?>

</body>
 
Ами като за начало трябва да си промениш model-а и функцията viewImage() като и добавиш параметри, които да ти послужат да лимитираш заявката си. Заявката ти трябва да изглежда така, примерно:
PHP:
public function viewImage($limit, $offset) {

	$sql = $this->_database->prepare('SELECT * FROM images LIMIT '.(int)$limit.', '.(int)$offset.'')->execute()->fetchAllAssoc();

	return $sql;
	
}

Също така трябва да създадеш и функция, с която да взимаш общия брой на записите, което ще ти потрябва при билдването на страницирането. Би трябвало да бъде нещо подобно:
PHP:
public function getTotalImages() {
	
	$sql = $this->_database->prepare('SELECT COUNT(*) AS total FROM images')->execute()->fetchAllAssoc(); 

	return $sql; 
	
}

И от controller-а вече си билдваш самото странициране (може да си създадеш направо и един pagination class, но няма да изпадам в такива подробности) :


PHP:
private function layout() { 
	
	$total_records = $this->_indexModel->getTotalImages()->total; // тук трябва да изведеш total-а от mysql заявката. Не знам как си обработваш данните, за това го цопнах така.
		
	$page = isset($_GET['page']) ? $_GET['page'] : 1;
	$per_page = 10;
	$total_pages = ceil($total_records / $per_page);
		
	if($page > $total_pages)
	{
		$page = $total_pages;
	}
		
	$limit = ($page - 1) * $per_page;
		
	$this->_view->_image = $this->_indexModel->viewImage($limit, $per_page);
		
	// тук билдваш самата навигация
	$range = 3;
	$pagination = '';
		
	if($page != 1)
	{
		$pagination .= '<a href="?page=1">първа</a>';
	}
		
		
	for($x = ($page - $range); $x < (($page + $range) + 1); $x++)
	{
		if(($x > 0) && ($x <= $total_pages))
		{
			if($x == $page)
			{	
         		        $pagination .= " [<b>".$x."</b>] ";
			}	 
			else
			{
         			$pagination .= " <a href='?page=".$x."'>".$x."</a> ";
			} 
		} 
	} 
		
	if($page != $total_pages) 
	{
		$pagination .= " <a href='?page=".$total_pages."'>последна</a> ";
	}
		
	$this->_view->_pagination = $pagination;
		

        $this->_view->display('header'); 
        $this->_view->display('body'); 
        $this->_view->display('footer'); 
    } 
}

Не е тествано и не знам дали ще работи както трябва. Мисля, че поне ще успея да те насоча.
 
Благодаря за отговора, само че аз нямам ?page.
При мене урл-а е домейн/контролер/метод.
Демек localhost/site/public/ = домейн, index/ = контролер, run/ = метод.
Принципно след метода мога да добавям екстра параметри.
Ако се ориентирам правилно трябва да направя още в началото да ми зарежда примерно localhost/site/public/index/page/1, след което да взема параметъра от урл-а и да го пратя към модела който да направи заявката спрямо него, той да го върне обратно на контролера и според проверките да пращам към вю-то различна променлива.
 
Всъщност няма нужда да зареждаш за първа страница localhost/site/public/index/page/1 . Виж този ред -
PHP:
$page = isset($_GET['page']) ? $_GET['page'] : 1;
Ако не е сетнато "page" автоматично ти дава първа страница.
 
Би ли ми го написал това с иф елсе, че този съкратеният синтакс ме обърква и не знам какво става :) .
 
Благодаря, успях да го докарам да работи, но линка сега ми става http://localhost/market/public/index/run/?page=2

Има ли начин да го направя http://localhost/market/public/index/run/2
или http://localhost/market/public/index/run/page/2
 
Ти ли си си писал фреймуорка? Ако е така нямаш ли вариант да взимаш параметри?

PHP:
class Index {

          private $_page;

          public function run($someParamsHere = 1) {
                      $this->_page = $someParamsHere;
          }
}


Нещо такова да се получи.


И като цяло много странно е структуриран този фреймуорк, объркващ е, но ти си го познаваш как работи.
 
Не е странен фрейма. По-скоро аз не обяснявам като хората :D, и мога да взимам параметри.
 
Ами вземи параметъра, обработи го и го използвай. За първа страница просто го сложи да е по подразбиране, а от там нататък чети и го използвай, за да нямаш грозотии от рода ?page= при положение, че използваш RESTful...
 
Нали можеш да взимаш екстра параметри?

Ако можеш да вземеш това:

localhost/public/index/run/2

То тогава го взимай и го използвай в страницирането си. Не знам по какъв начин да го обясня. Виж кода по-горе, който дадох като примерен. Не знам ти как взимаш екстра параметрите, за това просто съм дал пример.

п.п. Просто замени $_GET['page'] с екстра параметъра.
 
Искам да попитам нещо. В момента например имам $total_pages = 9, а резултатите са за 3 страници, обаче излизат линкове за всичките 9. Как да го оправя това?
 

Горе