PHP-класс пагинации - PullRequest
       57

PHP-класс пагинации

4 голосов
/ 18 марта 2010

Я ищу класс разбивки на страницы php, в прошлом я использовал довольно простой класс, и он больше не поддерживается.

Мне было интересно, есть ли у кого-нибудь какие-либо рекомендации?

Кажется бессмысленным строить свой собственный, когда там, наверное, так много хороших.

Ответы [ 7 ]

5 голосов
/ 23 марта 2010

После дальнейших поисков я решил, что перед тем, как использовать каркасную версию, я должен полностью понять, что входит в состав страницы. Так что я построил один сам. Спасибо за предложения, хотя!

5 голосов
/ 18 марта 2010

Я бы предложил Zend_Paginator по следующим причинам

  • Он слабо связан и не требует всей библиотеки.
  • Сообщество ZF больше, чем сообщество PEAR, и активно проводит проверки безопасности кода и выпускает версии для обслуживания.
  • Он разделяет источники данных с помощью шаблона адаптера, и в документации есть множество примеров реализации шаблонов интерфейса пользователя переднего плана.
2 голосов
/ 18 марта 2010

Вы пробовали PEAR :: Pager ? Примеры использования здесь .

1 голос
/ 24 июля 2017
public function make_pagination()
    {

    $total = 0;
    $query = "SELECT COUNT(downloads.dn_id) FROM downloads WHERE downloads.dn_type = 'audios'";
    $stmt = $this->conn->prepare($query);
    $stmt->execute();
    $total = $stmt->fetchColumn();
    //echo 'row_count = ' . $total;

    // How many items to list per page
    $limit = 11;

    // How many pages will there be
    $pages = ceil($total / $limit);

    // What page are we currently on?
    $page = min($pages, filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT, array(
        'options' => array(
            'default'   => 1,
            'min_range' => 1,
        ),
    )));

    // Calculate the offset for the query
    $offset = ($page - 1)  * $limit;

    // Some information to display to the user
    $start = $offset + 1;
    $end = min(($offset + $limit), $total);

    // The "back" link
    $prevlink = ($page > 1) ? '<a href="?page=1" title="First page">&laquo;</a> <a href="?page=' . ($page - 1) . '" title="Previous page">&lsaquo;</a>' : '<span class="disabled">&laquo;</span> <span class="disabled">&lsaquo;</span>';
    // The "forward" link
    $nextlink = ($page < $pages) ? '<a href="?page=' . ($page + 1) . '" title="Next page">&rsaquo;</a> <a href="?page=' . $pages . '" title="Last page">&raquo;</a>' : '<span class="disabled">&rsaquo;</span> <span class="disabled">&raquo;</span>';
    // Display the paging information
    echo '<div id="paging"><p>'.$prevlink.' Page '.$page.' of '.$pages. ' pages'. $nextlink.' </p></div>';


    //prepare the page query
    $query2 = "  
                SELECT * FROM downloads, map_artists, song_artists
                WHERE map_artists.dn_id = downloads.dn_id 
                AND song_artists.artist_id = map_artists.artist_id 
                AND downloads.dn_type = 'audios' GROUP BY downloads.dn_id 
                ORDER BY downloads.dn_time DESC LIMIT :limit OFFSET  :offset ";


    $stmt2 = $this->conn->prepare($query2);
    $stmt2->bindParam(':limit', $limit, PDO::PARAM_INT);
    $stmt2->bindParam(':offset', $offset, PDO::PARAM_INT);
    $stmt2->execute();

    // Do we have any results?
    if ($stmt2->rowCount() > 0) {
        // Define how we want to fetch the results
        $stmt2->setFetchMode(PDO::FETCH_ASSOC);
        $iterator = new IteratorIterator($stmt2);

        // Display the results
        foreach ($iterator as $row) {
            echo '<p>'. $row['dn_title'].' - '. $row['artist_name'].'</p>';
        }

    } else {
        echo '<p>No results could be displayed.</p>';
    }



}
1 голос
/ 01 июля 2016
// pagination class
class Pagination
{
    // database handle
    private $dbh;

    // total records in table
    private $total_records;

    // limit of items per page
    private $limit;

    // total number of pages needed
    private $total_pages;

    // first and back links
    private $firstBack;

    // next and last links
    private $nextLast;

    // where are we among all pages?
    private $where;

    public function __construct($dbh) {
        $this->dbh = $dbh;
    }

    // determines the total number of records in table
    public function totalRecords($query, array $params)
    {
        $stmt = $this->dbh->prepare($query);
        $stmt->execute($params);
        $this->total_records = $stmt->fetchAll(PDO::FETCH_COLUMN)[0];

        if (!$this->total_records) {
            echo 'No records found!';
            return;
        }
    }

    // sets limit and number of pages
    public function setLimit($limit)
    {
        $this->limit = $limit;

        // determines how many pages there will be
        if (!empty($this->total_records)) {
            $this->total_pages = ceil($this->total_records / $this->limit);
        }
    }

    // determine what the current page is also, it returns the current page
    public function page()
    {
        $pageno =  (int)(isset($_GET['pageno'])) ? $_GET['pageno'] : $pageno = 1;

        // out of range check
        if ($pageno > $this->total_pages) {
            $pageno = $this->total_pages;
        } elseif ($pageno < 1) {
            $pageno = 1;
        }

        // links
        if ($pageno > 1) {
            // backtrack
            $prevpage = $pageno -1;

            // 'first' and 'back' links
            $this->firstBack = "<div class='first-back'><a href='$_SERVER[PHP_SELF]?pageno=1'>First</a> <a href='$_SERVER[PHP_SELF]?pageno=$prevpage'>Back</a></div>";
        }

        $this->where =  "<div class='page-count'>(Page $pageno of $this->total_pages)</div>";

        if ($pageno < $this->total_pages) {
            // forward
            $nextpage = $pageno + 1;

            // 'next' and 'last' links
            $this->nextLast =  "<div class='next-last'><a href='$_SERVER[PHP_SELF]?pageno=$nextpage'>Next</a> <a href='$_SERVER[PHP_SELF]?pageno=$this->total_pages'>Last</a></div>";
        }

        return $pageno;
    }

    // get first and back links
    public function firstBack()
    {
        return $this->firstBack;
    }

    // get next and last links
    public function nextLast()
    {
        return $this->nextLast;
    }

    // get where we are among pages
    public function where()
    {
        return $this->where;
    }
}

Использование:

$pagination = new Pagination($dbh);
$pagination->totalRecords('SELECT COUNT(*) FROM `photos` WHERE `user` = :user', array(':user' => $_SESSION['id']));
$pagination->setLimit(12);
$pagination->page();
echo $pagination->firstBack();
echo $pagination->where();
echo $pagination->nextLast();

Результат:

<div class='first-back'><a href='/xampp/web_development/new_study_2014/imagebox2016/app/public/test.php?pageno=1'>First</a> <a href='/xampp/web_development/new_study_2014/imagebox2016/app/public/test.php?pageno=3'>Back</a></div>
<div class='page-count'>(Page 4 of 6)</div>
<div class='next-last'><a href='/xampp/web_development/new_study_2014/imagebox2016/app/public/test.php?pageno=5'>Next</a> <a href='/xampp/web_development/new_study_2014/imagebox2016/app/public/test.php?pageno=6'>Last</a></div>
1 голос
/ 26 марта 2016

вы можете попробовать это: Zebra_Pagination, универсальный, совместимый с Twitter Bootstrap класс разбиения на страницы, написанный на PHP проверьте ссылку ниже: http://stefangabos.ro/php-libraries/zebra-pagination

0 голосов
/ 15 февраля 2017

Вполне возможно, что ваш запрос оператора SQL SELECT может привести к 1000 записей. Но не стоит отображать все результаты на одной странице. Таким образом, мы можем разделить этот результат на множество страниц в соответствии с требованием класса пагинации.

СТРАНИЦЫ ДАННЫХ С КЛАССОМ ПАГИНАЦИИ ОЧЕНЬ ПРОСТО

Класс разбиения на страницы помогает генерировать пейджинг

Как использовать класс пагинации перейдите по этой ссылке для получения дополнительной информации http://utlearn.com/2017/02/15/pagination-class-use-pagination-class/

<?php

/**
 * @package pagination class
 * @version 1.0
 */
/*
@class Name: pagination 
@Author: Ahmed Mohamed
@Version: 1.0
@Author URI: https://www.fb.com/100002349977660
@Website URI: http://www.utlearn.com
@class page URI:  http://utlearn.com/2017/02/15/pagination-class-use-pagination-class
*/


include_once 'libs/config.php';
include_once 'libs/Database.php';
include_once 'libs/Model.php';
include_once 'libs/pagination.php';
if(!empty($_GET["page"]) and is_numeric($_GET["page"])){
    $page = htmlspecialchars(strip_tags($_GET["page"]));
}  else {
    $page = 1;
}
// news = table name / you page URL / current page / true or false for full query
// its false i just use table name  
$pag = new pagination("news", URL."?page=", 3, $page, false);
$pagination = $pag->pagination();
$data = $pag->data();

?>
<news>
    <?php foreach($data as $news){ ?>
    <header><h1><?=$news->title ?></h1> | <span><?=$news->date ?></span></header>
    <div>
        <?=$news->content ?>
    </div>
    <?php } ?>
</news>
<?=$pagination ?>
...