Opencart 2.x - 如果类别为空,则显示特色模块

Opencart 2.x - show featured module if category is empty

我希望在空类别页面(没有可用产品的类别)中显示模块(例如:特色产品)。

我一直在寻找解决方案(使用 PHP 或 extension/mod),但没有成功。 谢谢

如果存在扩展或 mod 来执行此操作

我从来没有听说过这样的扩展,我认为没有这种类型的扩展(无论如何,看看 extensions store

如果没有,到达那里的方式就足够了

基本上我们将使用两个文件:
类别控制器文件:<OC_ROOT>/catalog/controller/product/category.php
分类查看文件:<OC_ROOT>/catalog/view/theme/xxx/template/product/category.tpl

我们只需要:

(1) 判断是否加载module(控制器中)
使用一个简单的 if 语句,您可以检查当前类别中的产品数量是否为零,然后您可以继续构建 mod 规则,幸运的是我们已经在该行中获得了产品数量: $product_total = $this->model_catalog_product->getTotalProducts($filter_data);
所以你只需要检查是否 $product_total == 0

(2) 以适当的方式构造mod规则HTML(在控制器中)
如果你打开任何控制器,你会注意到有一行总是用于执行某个控制器并且 return 它作为字符串输出,这一行是:
$this->load->controller('controller route')
您甚至可以在同一个文件中注意到它:
$data['column_left'] = $this->load->controller('common/column_left');

所以您只需要复制该行并使用它来加载您想要的 module(使用 module 路由,对于您的情况是 module/featured),但是,OC 中的一些 mod 规则希望将一些参数传递给 index() 函数,没有它就无法工作,不要惊慌 :D,你只需要打开任何使用的文件mod 规则(例如 common/column_left.php)并执行相同的操作,我为您复制了它(略微 mod 化):

if ($this->config->get($module_code . '_status')) 
{
  $data['module_html'] = $this->load->controller('module/' . $module_code);
}
else
{
  $this->load->model('extension/module');
  $setting_info = $this->model_extension_module->getModule($module_id);
  if ($setting_info) 
  {
    $data['module_html'] = $this->load->controller('module/' . $module_code, $setting_info);
  }
}

$module_id$module_code 的值可以在 table <DB_PREFIX>_module 中找到,对于您的情况,它们将是:

$module_id = 28;
$module_code = 'featured';

(3) 在页面中显示module(在视图中)
只需检查是否设置了$module_html的值,然后将其显示在容器div中


P.S:这个artice非常好,为open cart 1.5.x开发代码提供了很好的基础5.x,也可以用于OC2.x 几乎 mod化,祝你好运!