OpenCart在Controller外部加载模型

时间:2012-11-22 12:34:59

标签: php opencart

我正在开发一个OpenCart项目,需要大量的自定义。 对于我的项目,我必须更改购物车库中的内容(system / library / cart.php)。

我必须调用在产品模型(catalog / model / catalog / product.php)中定义的自定义函数。

在控制器中,加载模型并使用其功能很简单:

    $this->load->model("catalog/product");
    $this->model_catalog_product->customFunction();

但是如何在控制器外加载模型? 您无法创建模型的新实例,我已经尝试过:

    require_once("catalog/model/catalog/product.php");
    $a_model = new ModelCatalogProduct();

这显然不起作用,因为模型不打算以这种方式使用。

我还尝试使用范围解析运算符(ModelCatalogProduct :: customFunction()) 它也不起作用。

我可以将所有必需的信息作为参数传递,但我宁愿在购物车库类中使用该模型,因为更改将是全局的。

甚至可以在OpenCart中的控制器外加载模型吗?

3 个答案:

答案 0 :(得分:16)

如果只需要复制一种方法,最好将方法添加到Cart类本身。 Cart类可以使用$this->db->query()调用,因为它已经为$db分配了public function test() { global $loader, $registry; $loader->model('catalog/product'); $model = $registry->get('model_catalog_product'); $result = $model->getProduct(123); } ,即使它不是控制器/模型

修改

如果您希望这样做,您可以执行类似以下的操作

{{1}}

答案 1 :(得分:7)

您可以在受控制的范围之外加载模型。

如果您需要在另一个模型中加载模型,可以使用$this->load->model('my_module/my_model');以相同的方式加载模型。

如果您需要在模板文件或其他自定义PHP脚本中加载模型,请查看index.php实例化的Registry文件 - 您需要以相同的方式实例化它。所以您的自定义代码可能如下所示:

$registry = new Registry();
$my_model = $registry->load->model('my_module/my_model');
$my_model->customFunction();

无论如何,我强烈建议您不要编辑/更改核心库文件,除非您确定没有其他方法可以实现/执行您需要的工作。

正如 Jay Gilford 建议我实现该功能或调用catalog/checkout/cart.php,可能是confirmsuccess,具体取决于范围和功能喜欢实施。

答案 2 :(得分:0)

在OpenCart中,模型层的部分依赖于库。一个示例是需要当前客户(前端)或当前用户(后端)的ID。

为了保持结构清晰和清晰并减少代码重复,您不应该在另一个方向引入依赖关系。如果模型依赖于类用户并且类用户依赖于模型,则会创建恶性循环。

我建议将函数移动到库层中,并在模型层中删除它们的实现。要最小化影响,可以在模型中包装函数调用。

<强>库/ myClass的

function getValue($id){ 
 $sql = "select ..."; 
 $query = $this->db->query($sql); 
 return $query->rows;
}

系统管理员/模型/目录/基于myModel

function getValue($id){
 return $this->myClass->getValue();
}