在脚本中使用类方法

时间:2014-10-14 09:33:50

标签: php opencart

我有一个名为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中的无知。

2 个答案:

答案 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)。

编辑回答问题:

  1. 我的错,callback应该在URL中,并且在请求期间会调用这个(已经更改了URL示例)。
  2. 您可以拥有两个控制器或仅一个控制器(如在所有支付模块中一样)。在一个控制器的情况下,您可以使用为主要功能调用的方法index和来自支付网关的响应的方法callback(可以在成功付款后调用或在错误的情况 - 但那时你应该处理那里的所有情况。)
  3. 虽然看起来并非如此。 PHP没有像Java那样一直调用的main方法。但是在许多MVC框架中(我们现在可能认为OpenCart作为一个框架,即使它不是),它的实现方式是,如果你对没有定义显式动作(方法)的URL发出请求(至少是控制器)必须是)框架试图在该控制器上调用(执行)index方法。

答案 1 :(得分:0)

在opencart中使用以下结构是最好的。

用于加载ModelCheckoutOrder类

$this->load->model('checkout/order');

$this->model_checkout_order->update(
        $order_id,
        $order_status,
        "",
        true
    );