【问题标题】:OpenCart load Model outside ControllerOpenCart 在控制器外部加载模型
【发布时间】:2012-11-22 12:34:58
【问题描述】:

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

【问题讨论】:

  • 你有什么理由需要这样做?
  • 我在项目完成大约 70% 时加入了该项目。价格计算是完全自定义的,并且仅针对前端实现(该站点使用 AJAX 来获取有关它将花费多少的信息)。问题是,这些更改并未在后端实施。所以价格计算正常,但是当用户将产品添加到购物车时,它使用默认的 openCart 价格计算。我必须更改 getProducts() 函数,这样价格就可以了。
  • 在产品模型中计算自定义价格。所以现在我可以选择浏览所有文件并找到我必须更改代码的地方,或者我在 Cart 库中添加大约 10 行代码就可以了。这就是我问的原因。

标签: php opencart


【解决方案1】:

如果您只需要复制一个方法,最好将方法添加到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);
}

【讨论】:

  • 其实大概有5个函数。我试了一下并将所有需要的功能复制到购物车类(通过 vqmod),它正在工作。谢谢您的回答。但是,我会暂时保留这个问题,看看是否会有其他答案。我敢肯定会有其他人有类似的问题,他们应该得到尽可能多的信息。
  • 我在上面放了一个你可以使用的方法。这有点hackish,但会做你需要的。只需使用$model 而不是$this->model_catalog_product
【解决方案2】:

您可以在受控之外加载模型。

如果您需要在另一个模型中加载一个模型,您可以使用 $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,具体取决于您想要实现的范围和功能。

【讨论】:

  • 这是否适用于 OC 1.5.6.4?我试过了,它对我不起作用。
【解决方案3】:

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

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

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

图书馆/我的班级

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

admin/model/catalog/myModel

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

【讨论】:

    【解决方案4】:

    在文件“cart.php”中函数add()调用函数“getProduct”是这样使用的:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-17
      • 2016-08-25
      • 1970-01-01
      • 2013-07-28
      • 2020-04-08
      • 1970-01-01
      相关资源
      最近更新 更多