- Странициране
12
WT форуми -> PHP MySQL ASP.NET -> Странициране
Създайте нова тема Напишете отговор 
Автор Съобщение
teroristd
Редовен
Редовен

Регистриран на: 18/02/2010 1:50 pm

Support: 80
Bonus: 172
Мнения: 1561
Мнение 07/07/2017 4:30 pm     Странициране Отговорете с цитат


Здравейте, искам да направя странициране, но дори не знам как да почна. Ето каква е постановката при мен. Имам 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>
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
flafy
Нов
Нов

Регистриран на: 22/09/2013 6:36 pm

Support: 7
Bonus: 14
Мнения: 58
Мнение 08/07/2017 11:15 am      Отговорете с цитат


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

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

return $sql;

}


Също така трябва да създадеш и функция, с която да взимаш общия брой на записите, което ще ти потрябва при билдването на страницирането. Би трябвало да бъде нещо подобно:
PHP code:
public function getTotalImages() {

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

return $sql;

}


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


PHP code:
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');
}
}


Не е тествано и не знам дали ще работи както трябва. Мисля, че поне ще успея да те насоча.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
teroristd
Редовен
Редовен

Регистриран на: 18/02/2010 1:50 pm

Support: 80
Bonus: 172
Мнения: 1561
Мнение 08/07/2017 3:59 pm      Отговорете с цитат


Благодаря за отговора, само че аз нямам ?page.
При мене урл-а е домейн/контролер/метод.
Демек localhost/site/public/ = домейн, index/ = контролер, run/ = метод.
Принципно след метода мога да добавям екстра параметри.
Ако се ориентирам правилно трябва да направя още в началото да ми зарежда примерно localhost/site/public/index/page/1, след което да взема параметъра от урл-а и да го пратя към модела който да направи заявката спрямо него, той да го върне обратно на контролера и според проверките да пращам към вю-то различна променлива.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
flafy
Нов
Нов

Регистриран на: 22/09/2013 6:36 pm

Support: 7
Bonus: 14
Мнения: 58
Мнение 08/07/2017 4:10 pm      Отговорете с цитат


Всъщност няма нужда да зареждаш за първа страница localhost/site/public/index/page/1 . Виж този ред -
PHP code:
$page = isset($_GET['page']) ? $_GET['page'] : 1;
Ако не е сетнато "page" автоматично ти дава първа страница.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
teroristd
Редовен
Редовен

Регистриран на: 18/02/2010 1:50 pm

Support: 80
Bonus: 172
Мнения: 1561
Мнение 08/07/2017 4:55 pm      Отговорете с цитат


Би ли ми го написал това с иф елсе, че този съкратеният синтакс ме обърква и не знам какво става Smile .
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
flafy
Нов
Нов

Регистриран на: 22/09/2013 6:36 pm

Support: 7
Bonus: 14
Мнения: 58
Мнение 08/07/2017 5:02 pm      Отговорете с цитат


PHP code:
if(isset($_GET['page']))
{
$page = $_GET['page'];
}
else
{
$page = 1;
}
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
teroristd
Редовен
Редовен

Регистриран на: 18/02/2010 1:50 pm

Support: 80
Bonus: 172
Мнения: 1561
Мнение 08/07/2017 5:36 pm      Отговорете с цитат


Благодаря, успях да го докарам да работи, но линка сега ми става http://localhost/market/public/index/run/?page=2

Има ли начин да го направя http://localhost/market/public/index/run/2
или http://localhost/market/public/index/run/page/2
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Revelation
Турист
Турист

Регистриран на: 24/03/2013 3:23 pm

Support: 39
Bonus: 78
Мнения: 559
Мнение 08/07/2017 6:11 pm      Отговорете с цитат


Ти ли си си писал фреймуорка? Ако е така нямаш ли вариант да взимаш параметри?

PHP code:

class Index {

private $_page;

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



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


И като цяло много странно е структуриран този фреймуорк, объркващ е, но ти си го познаваш как работи.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
teroristd
Редовен
Редовен

Регистриран на: 18/02/2010 1:50 pm

Support: 80
Bonus: 172
Мнения: 1561
Мнение 08/07/2017 6:21 pm      Отговорете с цитат


Не е странен фрейма. По-скоро аз не обяснявам като хората Very Happy, и мога да взимам параметри.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Revelation
Турист
Турист

Регистриран на: 24/03/2013 3:23 pm

Support: 39
Bonus: 78
Мнения: 559
Мнение 08/07/2017 6:26 pm      Отговорете с цитат


Ами вземи параметъра, обработи го и го използвай. За първа страница просто го сложи да е по подразбиране, а от там нататък чети и го използвай, за да нямаш грозотии от рода ?page= при положение, че използваш RESTful...
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
teroristd
Редовен
Редовен

Регистриран на: 18/02/2010 1:50 pm

Support: 80
Bonus: 172
Мнения: 1561
Мнение 08/07/2017 6:52 pm      Отговорете с цитат


Не можах да те разбера, какво имаш предвид.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Revelation
Турист
Турист

Регистриран на: 24/03/2013 3:23 pm

Support: 39
Bonus: 78
Мнения: 559
Мнение 08/07/2017 6:56 pm      Отговорете с цитат


Нали можеш да взимаш екстра параметри?

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

localhost/public/index/run/2

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

п.п. Просто замени $_GET['page'] с екстра параметъра.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Покажи мнения от преди:    
Създайте нова тема   Напишете отговор    web-tourist.net Форуми -> PHP MySQL ASP.NET Часовете са според зоната GMT + 2 Часа
12
Страница 1 от 2


 
Идете на:  
Не Можете да пускате нови теми
Не Можете да отговаряте на темите
Не Можете да променяте съобщенията си
Не Можете да изтривате съобщенията си
Не Можете да гласувате в анкети