我使用的是Opencart版本2.1.0.1,如何在管理控制器中加载前端模型,
我有一个模型函数,可以告诉外部预订 ID
class ModelShippingParcelled extends Model {
public function getParcelledBooking($order_id) {
$query = $this->db->query("SELECT booking_id FROM " . DB_PREFIX . "parcelled WHERE order_id = '" . (int)$order_id . "'");
return $query->row;
}
我想在管理控制器中加载这个模型。做这个的最好方式是什么? 我也应该在管理中重写这个模型吗?但我不想重写相同的功能。如果有好的方法请推荐!
好吧,有一个丑陋的伎俩可以实现你想要的。例如,如果您想从管理控制器使用前端的目录/产品模型,那么您可以:
require_once DIR_CATALOG . "model/catalog/product.php";
$product = new ModelCatalogProduct($this->registry);
当您想从前端控制器使用管理模型时,这也将起作用,只需更改
require
语句即可。
我还需要从
catalog/model
内部 admin/model
调用函数(无需复制)。 需要一个函数在 php 中是不可能的。
但我发现我可以将函数移动到 system/library
中,例如在 /system/library/cart/cart.php
中。
尽管购物车功能从未在管理中调用,但它恰好是可能的。所以我这样称呼它
$this->cart->functionName($params)
为了确保功能仍在目录中工作,我通过 shell 进行了替换
find catalog -type f -print0 | xargs -0 sed -i '' -e 's/this->model_catalog_filter->functionName/this->cart->functionName/g'
编辑:要求函数体来自一个公共位置也应该可行。不过我没有在生产中进行测试:
public function functionName(){
require_once DIR_ROOT.'path/to/function/body.php';
}
我建议您在管理文件夹中创建模型的副本。 如果您确定要使用哪些功能,则仅复制它们。
另一种方法是使用 ajax 从管理员调用前端控制器/模型,如果您不希望用户运行它,请添加一些长字符串 get 或基于 url 的密码。