我有一个名为99bill_received.php
的脚本文件。
在该脚本中,我需要在名为update()
的类中调用方法ModelCheckoutOrder
,该类位于与此PHP脚本不同的路径中。
update()
方法所在的类名称为ModelCheckoutOrder
。
对于大多数OpenCart扩展,PHP文件是类文件,因此您可以在不初始化对象的情况下固有地调用此类文件。
/**
* Updates an existing order history using the order_id and the updated
* order_status
* @param $order_id
* @param $order_status
*/
function update_order_history($order_id, $order_status)
{
// load the order.php file
$this->load->model('checkout/order');
// Execute update()
$this->model_checkout_order->update(
$order_id,
$order_status,
"",
true
);
}
注意$this->load->model()
行。您不需要初始化ModelCheckoutOrder
对象以便使用它(如果我在这里错了,请纠正我)。
我的问题是 - 如何在PHP脚本文件中访问此类方法?我目前不在OpenCart .php
脚本中 - 只调用它,因为我需要访问 一个OpenCart文件的函数update()
。
我尝试使用ModelCheckoutOrder
初始化$model = new ModelCheckoutOrder()
类,但它没有按照我的意图工作(意思是,我不知道是对还是错)。请原谅我在OOPHP中的无知。
答案 0 :(得分:1)
首先 - 为什么您的文件只是脚本? OpenCart是使用MVC模式构建的,因此即使您的脚本也应该是控制器,如下所示:
class ControllerPayment99BillReceived extends Controller {
public function callback() {
if ($this->request->server['REQUEST_METHOD'] === 'POST' && isset($this->request->post['order_id'])) {
$this->update_order_history($this->request->post['order_id'], <ORDER_STATUS_ID>);
}
}
private function update_order_history($order_id, $order_status) {
// load the order.php file
$this->load->model('checkout/order');
// Execute update()
$this->model_checkout_order->update($order_id, $order_status, "", true);
}
}
现在有了这样的控制器和它的方法(在MVC中称为 action ),可以通过以下URL访问它:
http://example.com/index.php?route=payment/99bill_received/callback
而必要的值通过POST请求传输。当然应该有更多变量并进一步验证请求来自支付网关的响应,以便攻击者不会滥用它。
第二 - 你说对于大多数OpenCart扩展,PHP文件是类文件 - 不幸的是这是真的。我的意思是有些情况下扩展程序带有脚本而不是控制器(因此打破了MVC)。但这是一种坏习惯,缺乏经验/专业性。
所以回答你的(隐藏)问题:如果你在OpenCart的MVC(控制器或模型)内,你可以访问OpenCart的IoC实现(控制反转) - 到 registry - 您可以从中获取其他系统对象(客户,税,货币等)或模型(通过加载它们)。
因此你可以致电
$this->load->model('checkout/order');
但你必须在控制器内部(即扩展基础Controller
)。
编辑回答问题:
callback
应该在URL中,并且在请求期间会调用这个(已经更改了URL示例)。index
和来自支付网关的响应的方法callback
(可以在成功付款后调用或在错误的情况 - 但那时你应该处理那里的所有情况。)main
方法。但是在许多MVC框架中(我们现在可能认为OpenCart作为一个框架,即使它不是),它的实现方式是,如果你对没有定义显式动作(方法)的URL发出请求(至少是控制器)必须是)框架试图在该控制器上调用(执行)index
方法。答案 1 :(得分:0)
在opencart中使用以下结构是最好的。
用于加载ModelCheckoutOrder类
$this->load->model('checkout/order');
$this->model_checkout_order->update(
$order_id,
$order_status,
"",
true
);