0

0

Magento 2 自定义页面添加分页功能的完整实现指南

花韻仙語

花韻仙語

发布时间:2026-02-24 09:39:11

|

998人浏览过

|

来源于php中文网

原创

Magento 2 自定义页面添加分页功能的完整实现指南

本文详解如何在 magento 2 自定义模块页面(如报价单列表页)中正确集成原生分页器,涵盖 collection 分页配置、block 中 pager 实例化、模板调用及关键注意事项,确保每页显示指定数量记录并支持页码跳转。

本文详解如何在 magento 2 自定义模块页面(如报价单列表页)中正确集成原生分页器,涵盖 collection 分页配置、block 中 pager 实例化、模板调用及关键注意事项,确保每页显示指定数量记录并支持页码跳转。

在 Magento 2 中为自定义页面(例如客户报价单列表页)添加分页,不能仅依赖前端渲染或手动切片数据——必须结合 EAV Collection 的分页机制与框架内置的 Magento\Theme\Block\Html\Pager 组件协同工作。以下是一个经过生产环境验证的完整实现方案。

✅ 核心步骤概览

  • 在 Block 类中重写 _prepareLayout(),动态创建并绑定 Pager 实例;
  • 确保 getSavedQuotes() 方法返回已配置分页参数(setPageSize + setCurPage)的 Collection;
  • 在 .phtml 模板中调用 = $block->getPagerHtml() ?> 渲染分页控件;
  • 注意请求参数解析、Collection 加载时机及模板输出位置。

? Block 层实现(推荐继承 \Magento\Framework\View\Element\Template)

<?php
namespace Vendor\Module\Block;

use Magento\Framework\View\Element\Template;
use Magento\Framework\View\Element\Template\Context;
use Magento\Customer\Model\Session as CustomerSession;

class QuoteList extends Template
{
    protected $customerSession;
    protected $_quoteMainFactory;

    public function __construct(
        Context $context,
        CustomerSession $customerSession,
        \Vendor\Module\Model\QuoteFactory $quoteMainFactory,
        array $data = []
    ) {
        $this->customerSession = $customerSession;
        $this->_quoteMainFactory = $quoteMainFactory;
        parent::__construct($context, $data);
    }

    protected function _prepareLayout()
    {
        parent::_prepareLayout();
        $this->pageConfig->getTitle()->set(__('My Quotes'));

        $collection = $this->getSavedQuotes();
        if ($collection && $collection->getSize()) {
            $pager = $this->getLayout()->createBlock(
                \Magento\Theme\Block\Html\Pager::class,
                'quotes.pager'
            )
                ->setAvailableLimit([10 => 10, 20 => 20, 30 => 30])
                ->setShowPerPage(true) // 启用「每页显示」下拉框(设为 false 则隐藏)
                ->setCollection($collection);

            $this->setChild('pager', $pager);
            // ⚠️ 关键:必须显式调用 load(),否则 pager 无法获取总条数
            $collection->load();
        }

        return $this;
    }

    public function getPagerHtml()
    {
        return $this->getChildHtml('pager');
    }

    public function getSavedQuotes()
    {
        $page = (int)$this->getRequest()->getParam('p', 1);
        $pageSize = (int)$this->getRequest()->getParam('limit', 10);

        $collection = $this->_quoteMainFactory->create()->getCollection()
            ->addFieldToFilter('is_deleted', 0)
            ->addFieldToFilter('status', 1)
            ->addFieldToFilter('customer_id', $this->customerSession->getCustomer()->getId());

        // 必须在 load() 前设置分页参数
        return $collection->setPageSize($pageSize)->setCurPage($page);
    }
}

? 对应 PHTML 模板(如 quote/list.phtml)

在循环展示数据的下方,插入分页 HTML:

<!-- 显示报价列表 -->
<?php foreach ($block->getSavedQuotes() as $quote): ?>
    <div class="quote-item">
        <h3><?= $block->escapeHtml($quote->getName()) ?></h3>
        <p>Status: <?= $block->escapeHtml($quote->getStatus()) ?></p><div class="aritcle_card flexRow">
                                                        <div class="artcardd flexRow">
                                                                <a class="aritcle_card_img" href="/xiazai/code/10660" title="标准小型企业网站"><img
                                                                                src="https://img.php.cn/upload/webcode/000/000/015/176318640731664.png" alt="标准小型企业网站"  onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
                                                                <div class="aritcle_card_info flexColumn">
                                                                        <a href="/xiazai/code/10660" title="标准小型企业网站">标准小型企业网站</a>
                                                                        <p>包括完整的产品展示,精美留言本,经理致辞,公司简介,联系我们等,其中本系统的产品展示可以实现三级分类,无限产品后台自由添加。包含产品快速导航,产品简介,下订单,产品成分说明,常见问题说明,大小缩略图等非常实用的功能 产品管理页面:/HBYYDS/product/admin/login.asp 管理帐号及密码均为admin</p>
                                                                </div>
                                                                <a href="/xiazai/code/10660" title="标准小型企业网站" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
                                                        </div>
                                                </div>
    </div>
<?php endforeach; ?>

<!-- 分页控件(务必放在循环之后) -->
<div class="toolbar toolbar-bottom">
    <?= $block->getPagerHtml() ?>
</div>

⚠️ 关键注意事项

  • load() 调用时机:$collection->load() 必须在 setCollection($collection) 后、$this->setChild() 前执行,否则 Pager 无法读取 getTotalCount();
  • 参数命名规范:Magento 默认识别 p(当前页)和 limit(每页条数),勿自定义为 page/size,否则需重写 Pager 的 getPageRouteParams();
  • Collection 复用风险:getSavedQuotes() 被多次调用时,避免重复 load();建议加缓存或使用 clone 避免状态污染;
  • 响应式适配:如需移动端优化,可在 CSS 中调整 .pages, .limiter 等 pager 默认类;
  • SEO 友好性:分页链接自动包含 canonical 标签,无需额外处理。

✅ 验证方式

访问页面后检查 URL 是否支持如下格式:

  • yourdomain.com/quotes/?p=2 → 第二页
  • yourdomain.com/quotes/?p=1&limit=20 → 每页 20 条,第一页

同时查看 HTML 源码,确认

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
ajax教程
ajax教程

php中文网为大家带来ajax教程合集,Ajax是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。php中文网还为大家带来ajax的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

165

2023.06.14

ajax中文乱码解决方法
ajax中文乱码解决方法

ajax中文乱码解决方法有设置请求头部的字符编码、在服务器端设置响应头部的字符编码和使用encodeURIComponent对中文进行编码。本专题为大家提供ajax中文乱码相关的文章、下载、课程内容,供大家免费下载体验。

168

2023.08.31

ajax传递中文乱码怎么办
ajax传递中文乱码怎么办

ajax传递中文乱码的解决办法:1、设置统一的编码方式;2、服务器端编码;3、客户端解码;4、设置HTTP响应头;5、使用JSON格式。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

122

2023.11.15

ajax网站有哪些
ajax网站有哪些

使用ajax的网站有谷歌、维基百科、脸书、纽约时报、亚马逊、stackoverflow、twitter、hacker news、shopify和basecamp等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

246

2024.09.24

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

687

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

22

2025.12.06

go语言 数组和切片
go语言 数组和切片

本专题整合了go语言数组和切片的区别与含义,阅读专题下面的文章了解更多详细内容。

49

2025.09.03

seo页面描述
seo页面描述

一个好的SEO页面描述应该包含关键词、简明扼要地概括网页的主题和内容、具有吸引力、与网页内容相符,并且是独特的。它不仅可以帮助搜索引擎了解网页的内容,还可以吸引用户点击进入网页。因此,编写一个优秀的SEO页面描述对于网页的排名和点击率都非常重要。

218

2023.08.31

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

1223

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号