分页

MixPHP 的分页类采用的一种非常灵活的设计方式,分页的构建都由视图层完成,可以构建任意结构的分页式样。

调用
mix\web\Pagination new Pagination([配置]);

配置参数放在配置文件 objects 字段,再使用 \Mix::app()->createObject($name) 实例化对象是更好的方式。

模型范例

MixPHP 建议用户在模型中使用分页类,因为在模型内更加方便获取分页数据,分页数据可随分页对象由控制器传递至视图。

// 模型内的方法
public function getPagination($page)
{
    return new Pagination([
        // 数据结果集
        'items'       => $data,
        // 数据总行数
        'totalItems'  => 987,
        // 当前页,值 >= 1
        'currentPage' => $page,
        // 每页显示数量
        'perPage'     => 10,
        // 固定最小最大页码
        'fixedMinMax' => true,
        // 数字页码展示数量
        'numberLinks' => 5,
    ]);
}

视图范例

我们设计了三个常用的分页式样,使用 bootstrap 的用户可直接复制代码使用,使用其他前端框架的用户只需修改相关的 HTML 即可。

1. 带上下页且固定最小最大页

<?php if ($pagination->display()): ?>
    <nav aria-label="Page navigation">
        <ul class="pagination">
            <?php if ($pagination->hasPrev()): ?>
                <li><a href="/?page=<?= $pagination->prev(); ?>">上一页</a></li>
            <?php else: ?>
                <li class="disabled"><span>上一页</span></a></li>
            <?php endif; ?>
            <?php foreach ($pagination->numbers() as $number): ?>
                <?php if ($number->text == 'ellipsis'): ?>
                    <li class="disabled"><span>...</span></li>
                <?php else: ?>
                    <li <?= $number->selected ? 'class="active"' : ''; ?>><a href="/?page=<?= $number->text; ?>"><?= $number->text; ?></a></li>
                <?php endif; ?>
            <?php endforeach; ?>
            <?php if ($pagination->hasNext()): ?>
                <li><a href="/?page=<?= $pagination->next(); ?>">下一页</a></li>
            <?php else: ?>
                <li class="disabled"><span>下一页</span></a></li>
            <?php endif; ?>
        </ul>
    </nav>
    <p><?php echo "当前第 ", $pagination->currentPage, " 页,共 ", $pagination->totalPages, " 页"; ?></p>
<?php endif; ?>

2. 纯数字固定最小最大页

<?php if ($pagination->display()): ?>
    <nav aria-label="Page navigation">
        <ul class="pagination">
            <?php foreach ($pagination->numbers() as $number): ?>
                <?php if ($number->text == 'ellipsis'): ?>
                    <li class="disabled"><span>...</span></li>
                <?php else: ?>
                    <li <?= $number->selected ? 'class="active"' : ''; ?>><a href="/?page=<?= $number->text; ?>"><?= $number->text; ?></a></li>
                <?php endif; ?>
            <?php endforeach; ?>
        </ul>
    </nav>
    <p><?php echo "当前第 ", $pagination->currentPage, " 页,共 ", $pagination->totalPages, " 页"; ?></p>
<?php endif; ?>

3. 带首尾页上下页

<?php if ($pagination->display()): ?>
    <nav aria-label="Page navigation">
        <ul class="pagination">
            <?php if ($pagination->hasFirst()): ?>
                <li><a href="/">首页</a></li>
            <?php else: ?>
                <li class="disabled"><span>首页</span></a></li>
            <?php endif; ?>
            <?php if ($pagination->hasPrev()): ?>
                <li><a href="/?page=<?= $pagination->prev(); ?>">上一页</a></li>
            <?php else: ?>
                <li class="disabled"><span>上一页</span></a></li>
            <?php endif; ?>
            <?php foreach ($pagination->numbers() as $number): ?>
                <li <?= $number->selected ? 'class="active"' : ''; ?>><a href="/?page=<?= $number->text; ?>"><?= $number->text; ?></a></li>
            <?php endforeach; ?>
            <?php if ($pagination->hasNext()): ?>
                <li><a href="/?page=<?= $pagination->next(); ?>">下一页</a></li>
            <?php else: ?>
                <li class="disabled"><span>下一页</span></a></li>
            <?php endif; ?>
            <?php if ($pagination->hasLast()): ?>
                <li><a href="/?page=<?= $pagination->totalPages; ?>">尾页</a></li>
            <?php else: ?>
                <li class="disabled"><span>尾页</span></a></li>
            <?php endif; ?>
        </ul>
    </nav>
    <p><?php echo "当前第 ", $pagination->currentPage, " 页,共 ", $pagination->totalPages, " 页"; ?></p>
<?php endif; ?>