OpenCart如何访问其库类?

时间:2014-04-02 10:57:47

标签: php opencart

我目前正在尝试更多地了解OpenCart的核心以及它的类实际如何工作。我还试图提高我的OOP技能,因为我仍然在该领域学习,所以也许是我看不到的明显的东西。

我想知道控制器文件如何知道如何找到购物车类(例如)。

E.g。

在目录/控制器/结帐车中(显然删除了代码)

class ControllerCheckoutCart extends Controller {
    public function index() {
      $this->cart->update();
    }

}

Controller类可以在system / engine / controller.php中找到

update()可以找到system / library / cart。

我假设在controller.php中会有一个指向购物车类的链接,或者是一个由它制作的对象。 (我的基础是使用$this->)。

那么如何从控制器中找到购物车类?

谢谢

3 个答案:

答案 0 :(得分:5)

首先,您的ControllerCheckoutCart扩展了Controller类,因此这是我们需要关注的类。您可以在/system/engine/controller.php

中找到此课程

在这个课程中,有两个我们感兴趣的magic methods。第一个是__construct,因为在这里加载了一个"注册表"课程(在/system/engine/registry.php中找到,如果您有兴趣选择那个 - 它非常简单)。

您可以将此视为对商店使用的所有类的查找,例如模型文件,库文件等。在构造中,注册表被传递给控制器​​,因此它具有对它的引用

public function __construct($registry) {
    $this->registry = $registry;
}

第二个也是更重要的魔术方法是__get方法。当类属性不存在时调用它,如果您希望这样做,您可以自己处理它。 OpenCart使用它来尝试从注册表中获取具有该键的类

public function __get($key) {
    return $this->registry->get($key);
}

因此,任何控制器中的$this->cart都会尝试从注册表中获取具有密钥cart的对象。如果您查看index.php文件,您会看到它已在那里分配

// Cart
$registry->set('cart', new Cart($registry));

答案 1 :(得分:0)

ControllerCheckoutCart 扩展 Controller,这意味着它会继承Controller中您未在此处看到的所有代码。 Controller中的某些代码(可能在Controller::__construct中)正在创建$this->cart对象。例如:

class Controller {

    public function __construct() {
        $this->cart = new Cart;
    }

}

由于此构造函数由所有子类继承,因此它们也构造自己的$this->cart并可以使用自己的方法访问它。

答案 2 :(得分:0)

如Jay Gilford所述,您需要在 index.php 和/或 admin / index.php 中注册新添加的库类文件(具体取决于是否你在目录或管理员中使用它)

$registry->set('yourlibraryclass', new YourLibraryClass());

因此,在系统加载时,Opencart知道您的类存在,然后您可以通过以下方式调用其所有函数:

$this->yourlibraryfilename->function();

请注意,您的库文件名通常与您的类名相同,因此在此示例中使用它。

在index.php文件中完成更改后,您需要注销并再次登录才能看到更改。