PrestaShop 1.7.8.6如何通过分类ID获取指定分类产品
PrestaShop 1.7.8.6 按指定分类ID取产品的实现方案
Smarty模板层没有可直接调用的、支持按分类ID拉取产品的原生函数,你现在遍历$products输出全站产品,是因为你覆写模块时没有对这个默认模板变量做正确的筛选赋值——模板层只负责渲染已经传入的变量,不适合直接写数据查询逻辑。
正确实现步骤
- 所有产品查询逻辑放在你覆写的模块/控制器PHP代码中完成,使用PrestaShop原生的
Category类内置的getProducts()方法拉取指定分类下的产品,这个方法原生兼容1.7.8.6版本,会自动处理语言关联、店铺权限、产品上下架状态的过滤。 - PHP层示例代码:
// 传入你需要展示的指定分类ID,实例化分类对象 $targetCategory = new Category( $specified_category_id, // 替换成你自己的目标分类ID $this->context->language->id, $this->context->shop->id ); // 拉取分类下的产品 $targetProducts = $targetCategory->getProducts( $this->context->language->id, 1, // 页码,取全量可传1后把每页数量设为足够大的值 100, // 单页产品数量 null, // 排序字段,默认按后台设置排序传null即可 null, // 排序方向 false, // 过滤已下架产品 true, // 统计产品总数 true, // 关联读取产品属性等必要信息 false // 不返回分页相关的附加数组 ); // 把查询结果赋值给模板变量 $this->context->smarty->assign('target_category_products', $targetProducts);
- 模板层(.tpl文件)修改:不要直接复用全局默认的
$products变量,遍历你自己传入的新变量即可:
{foreach from=$target_category_products item=product name=products} {$product.name|escape:'htmlall':'UTF-8'} {/foreach}
注意事项
getProducts()方法默认会递归读取目标分类下所有子分类关联的产品,如果只需要展示当前分类直属的产品,可在调用方法时将递归查询参数设为false。- 不要直接在Smarty模板中嵌入PHP代码调用类查询数据,会破坏MVC结构,容易出现上下文不匹配、权限校验遗漏的问题。
内容的提问来源于stack exchange,提问作者sudogo
相关产品推荐
相关产品推荐

