如何在OpenCart 3的标准featured精选模块中展示商品选项
OpenCart 3 featured模块商品选项展示故障排查与修复方案
常见未生效原因
- 缓存未清理:OpenCart 3默认开启twig模板缓存、modification修改缓存以及数据缓存,修改文件后未清缓存会导致旧代码仍在运行
- 控制器查询逻辑错误:商品选项关联查询时未过滤有效选项,或者未关联
product_option_value表获取选项值,导致返回的options数组为空或结构错误 - modification文件修改规则错误:
modification目录是OCMOD修改的自动生成目录,直接修改该目录下的文件会在下次刷新修改缓存后被覆盖,无效修改自然不会生效 - 模板变量调用错误:twig模板中调用选项变量时层级错误,或者循环时未判断选项是否存在,导致渲染失败
- 商品后台配置问题:对应精选商品未设置启用状态的单选类型商品选项,或者选项库存不足且开启了库存校验
修复步骤
1. 控制器代码修正
直接修改原控制器文件catalog/controller/extension/module/featured.php,在获取产品数据的循环内插入以下查询逻辑:
// 仅筛选启用状态的单选类型商品选项 $product_options = $this->model_catalog_product->getProductOptions($product['product_id']); $filter_options = []; foreach ($product_options as $product_option) { if ($product_option['type'] == 'radio' && $product_option['status']) { $option_values = []; foreach ($product_option['product_option_value'] as $option_value) { // 过滤库存不足的选项(按需保留判断) if ($option_value['quantity'] > 0 || !$this->config->get('config_stock_checkout')) { $option_values[] = [ 'product_option_value_id' => $option_value['product_option_value_id'], 'name' => $option_value['name'], 'price' => $this->currency->format($this->tax->calculate($option_value['price'], $product['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']), 'price_prefix' => $option_value['price_prefix'] ]; } } if (!empty($option_values)) { $filter_options[] = [ 'product_option_id' => $product_option['product_option_id'], 'name' => $product_option['name'], 'required' => $product_option['required'], 'option_values' => $option_values ]; } } } // 写入产品数组 $data['products'][$key]['options'] = $filter_options;
如果使用OCMOD修改,需要将上述逻辑写入xml补丁的替换规则中,禁止直接修改modification目录下的生成文件。
2. 模板代码修正
在template/extension/module/featured.twig的商品卡片循环内加入渲染逻辑,先判断选项是否存在避免报错:
{% if product.options %} <div class="product-options mt-2 mb-2"> {% for option in product.options %} <div class="form-group"> <label class="control-label">{{ option.name }} {% if option.required %}<span class="text-danger">*</span>{% endif %}</label> <div class="radio-list"> {% for value in option.option_values %} <div class="radio"> <label> <input type="radio" name="option[{{ option.product_option_id }}]" value="{{ value.product_option_value_id }}" {% if loop.first %}checked{% endif %}> {{ value.name }} {% if value.price %}<small>({{ value.price_prefix }}{{ value.price }})</small>{% endif %} </label> </div> {% endfor %} </div> </div> {% endfor %} </div> {% endif %}
3. 缓存清理操作
修改完成后进入后台依次执行三个操作:
- 点击右上角齿轮图标,清空
模板缓存 - 进入「扩展 - 扩展安装 - OCMOD」,点击右上角刷新按钮,清空修改缓存
- 进入「系统 - 维护 - 缓存管理」,清空所有数据缓存
内容的提问来源于stack exchange,提问作者Alexandr
相关产品推荐
相关产品推荐

