16

我正在开发一个需要大量定制的 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 的控制器之外加载模型吗?

4

4 回答 4

21

如果它只是您需要复制的一种方法,则最好将方法添加到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);
}
于 2012-11-22T13:03:44.480 回答
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取决于您想要实现的范围和功能。

于 2012-11-22T16:22:42.767 回答
0

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

为了保持结构清晰整洁并减少代码重复,您不应该在另一个方向上引入依赖关系。如果一个模型依赖于类用户,而类用户又依赖于模型,那么就形成了一个恶性循环。

我建议将函数移动到库层并在模型层中删除它们的实现。为了尽量减少影响,您可以将函数调用包装在模型中。

图书馆/我的班级

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

管理员/模型/目录/myModel

function getValue($id){
 return $this->myClass->getValue();
}
于 2013-01-18T15:29:34.573 回答
0

在函数 add() 中的文件“cart.php”中调用函数“getProduct”以这种方式使用:

$this->load->model('catalog/product');
$product_info = $this->model_catalog_product->getProduct($product_id);

因此,在任何其他部分使用相同的方式,例如函数 index() 中的文件是可能的并且可以工作。

例如,如果输入的数量超过库存,则会发出警告。使用上述访问数量。

于 2021-09-03T06:47:22.537 回答