我正在开发一个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中的控制器外加载模型吗?
答案 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
,可能是confirm
或success
,具体取决于范围和功能喜欢实施。
答案 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();
}