ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

php-Opencart地址页面分页

2019-11-21 11:32:21  阅读:256  来源: 互联网

标签:opencart mysqli pagination php


我正在尝试将opencart地址列表分解为每页20个,但仍显示第1页和第2页的所有列表.请看一下代码,我必须做错什么.

分页看起来很好

1 2 > >|
Showing 1 to 20 of 31 (2 Pages)

受保护函数getList()中的控制器帐户address.php页面上的代码(我也尝试了公共函数index()).

if (isset($this->request->get['page'])) {
     $page = $this->request->get['page'];
  } else {
     $page = 1;
  }      

  $data = array(              
     'start' => ($page - 1) * 20,
     'limit' => 20
  );

  $address_total = $this->model_account_address->getTotalAddresses($data);
  $results = $this->model_account_address->getAddresses();

  $pagination = new Pagination();
  $pagination->total = $address_total;
  $pagination->page = $page;
  $pagination->limit = 20; 
  $pagination->text = $this->language->get('text_pagination');
  $pagination->url = $this->url->link('account/address', 'page={page}', 'SSL');

  $this->data['pagination'] = $pagination->render();

和模型帐户address.php上的代码

public function getDetails($data = array()) {
  $sql = $this->db->query("SELECT * FROM `" . DB_PREFIX . "address` WHERE customer_id = '" . (int)$this->customer->getId() . "'");

  if (isset($data['start']) || isset($data['limit'])) {
     if ($data['start'] < 0) {
        $data['start'] = 0;
     }         

     if ($data['limit'] < 1) {
        $data['limit'] = 20;
     }   

     $sql .= " LIMIT " . (int)$data['start'] . "," . (int)$data['limit'];
  }

  $query = $this->db->query($sql);

  $details = $query->rows;

return $details;
}   

这是在视图address_list.tpl上

<?php echo $pagination; ?>

请指教.

解决方法:

问题出在您的模型中.您在填写LIMIT和OFFSET之前运行查询,将模型更改为此:

public function getDetails($data = array()) {
    $sql = 'SELECT * FROM `' . DB_PREFIX . 'address` WHERE customer_id = ' . (int)$this->customer->getId();

    if (isset($data['start']) || isset($data['limit'])) {
        if ($data['start'] < 0) {
            $data['start'] = 0;
        }

        if ($data['limit'] < 1) {
            $data['limit'] = 20;
        }

        $sql .= ' LIMIT ' . (int)$data['start'] . ',' . (int)$data['limit'];
    }

    $query = $this->db->query($sql);

    return $query->rows;
}

这应该做.

实际上,在您第一次调用$sql = $this-> db-> query(“ …”);之后, (模型方法的第一行)$sql变量不包含SQL查询,而是包含属性行(第一行),行(所有检索到的行)和num_rows(检索到的行数)的OpenCart DB资源对象.因此,您的第二个调用$query = $this-> db-> query($sql);应该会给您一个错误-如果未显示该错误,则可能是您隐藏了PHP错误.检查您的PHP错误日志(或OpenCart的错误日志)以找出答案.

编辑:

然后,在您的控制器中,您将遇到此逻辑错误:您正在为getTotalAddresses($data)设置LIMIT和OFFSET,这应该计算所有地址-但这将始终返回数字20.另一方面,应该返回的方法获取这些参数,但不获取它们:getAddresses();

因此,请修复您的控制器以执行此操作:

$address_total = $this->model_account_address->getTotalAddresses();
// no $data here as we want all the addresses to be counted ----^^
$results = $this->model_account_address->getAddresses($data);
// we pass $data here so the LIMIT is applied --------^^^^^

还有一件事:在控制器中调用getAddresses,但在模型中定义了getDetails …是否确定不想将getDetails重命名为getAddresses?

标签:opencart,mysqli,pagination,php
来源: https://codeday.me/bug/20191121/2051293.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有