如何在管理控制器中加载目录模型

问题描述 投票:0回答:4

我使用的是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;
    }

我想在管理控制器中加载这个模型。做这个的最好方式是什么? 我也应该在管理中重写这个模型吗?但我不想重写相同的功能。如果有好的方法请推荐!

opencart
4个回答
2
投票

好吧,有一个丑陋的伎俩可以实现你想要的。例如,如果您想从管理控制器使用前端的目录/产品模型,那么您可以:

require_once DIR_CATALOG . "model/catalog/product.php";
$product = new ModelCatalogProduct($this->registry);

当您想从前端控制器使用管理模型时,这也将起作用,只需更改

require
语句即可。


2
投票

我还需要从

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';
}

0
投票

我建议您在管理文件夹中创建模型的副本。 如果您确定要使用哪些功能,则仅复制它们。


0
投票

另一种方法是使用 ajax 从管理员调用前端控制器/模型,如果您不希望用户运行它,请添加一些长字符串 get 或基于 url 的密码。

© www.soinside.com 2019 - 2024. All rights reserved.