VirtueMart获取指定分类商品:突破分页限制及指定页码加载方案
解决VirtueMart分类商品分页限制问题
我来帮你搞定这个VirtueMart拉取商品时的分页限制问题,下面分两种场景给你解决方案:
一、指定页码加载对应商品
VirtueMart的VirtueMartModelProduct模型支持通过设置limit(每页数量)和limitstart(起始偏移量)来控制分页。你只需要在调用getProductsInCategory前,给模型设置这两个状态参数即可。
比如要加载第2页(假设后台默认每页40条),代码修改如下:
include_once JPATH_ROOT . '/administrator/components/com_virtuemart/models/product.php'; $model = new VirtueMartModelProduct(); // 定义分页参数:这里加载第2页,每页40条 $targetPage = 2; $perPage = 40; // 和VM后台设置的每页商品数保持一致,也可以自定义(只要后台允许) $limitStart = ($targetPage - 1) * $perPage; // 设置模型的分页状态 $model->setState('limit', $perPage); $model->setState('limitstart', $limitStart); // 拉取指定页的商品 $items = $model->getProductsInCategory($this->input->get("catid")); // 你的后续处理逻辑保持不变 $output = []; foreach ($items as $key => $item) { $item = get_object_vars($item); $item['media'] = $mediaModel->getFiles("", "", $item['virtuemart_product_id']); $objekt = (object)[ "mf_name" => $item['mf_name'], 'product_name' => $item['product_name'], 'prices' => [ 'product_override_price' => $item['prices']['product_override_price'], 'product_price' => $item['prices']['product_price'], 'discountAmount' => $item['prices']['discountAmount'], ], 'file_url' => $item['media'][0]->file_url, 'virtuemart_category_id' => $item['categoryItem'][0]['virtuemart_category_id'], 'category_name' => $item['customfields'][0]->custom_title, 'link' => $item['link'] ]; $output[] = $objekt; }
解释一下:limitstart的计算逻辑是(目标页码-1)*每页数量,因为VirtueMart的偏移量是从0开始计数的(第1页起始位置是0,第2页是40,以此类推)。
二、一次性拉取分类下全部商品
如果想跳过VM的分页限制,一次性获取所有商品,你可以先获取分类下的商品总数,然后把limit设置为这个总数,limitstart设为0即可。
修改后的代码如下:
include_once JPATH_ROOT . '/administrator/components/com_virtuemart/models/product.php'; $model = new VirtueMartModelProduct(); $catId = $this->input->get("catid"); // 先获取当前分类下的商品总数 $model->setState('virtuemart_category_id', $catId); $totalProducts = $model->getTotal(); // 设置模型状态:拉取全部商品 $model->setState('limit', $totalProducts); $model->setState('limitstart', 0); // 拉取所有商品 $items = $model->getProductsInCategory($catId); // 后续处理逻辑不变 $output = []; foreach ($items as $key => $item) { $item = get_object_vars($item); $item['media'] = $mediaModel->getFiles("", "", $item['virtuemart_product_id']); $objekt = (object)[ "mf_name" => $item['mf_name'], 'product_name' => $item['product_name'], 'prices' => [ 'product_override_price' => $item['prices']['product_override_price'], 'product_price' => $item['prices']['product_price'], 'discountAmount' => $item['prices']['discountAmount'], ], 'file_url' => $item['media'][0]->file_url, 'virtuemart_category_id' => $item['categoryItem'][0]['virtuemart_category_id'], 'category_name' => $item['customfields'][0]->custom_title, 'link' => $item['link'] ]; $output[] = $objekt; }
注意:如果你的商品数量很大(比如上千条),一次性拉取可能会导致内存或性能问题,这种情况下更建议用第一种分页拉取的方式,自己实现前端分页逻辑。
内容的提问来源于stack exchange,提问作者Maka
相关产品推荐
相关产品推荐

