OpenCart - PHP - 检查产品(下载)是否已购买

OpenCart - PHP - Check if a product (download) is already purchased

关于销售数字下载的 OpenCart 商店。

我正在尝试向产品页面添加一个脚本,以在该特定产品(下载)已购买并且存在于“帐户”>“下载”中时警告客户。 原因是为了避免客户重复购买同一产品。

感谢您的帮助。

编辑: 我尝试使用 SQL 查询获取客户所有订单的产品 ID,这在外部工作正常,但在 OpenCart 内部我遇到了问题。 查询如:

SELECT product_id
FROM ocuk_order_product
WHERE order_id IN (
    SELECT order_id
    FROM ocuk_order
    WHERE customer_id = 'xxxx'
)

我的主要问题是不确定如何在 OpenCart 产品页面中获得类似的结果。 (确切的页面和路径以及文件中的位置)

也试过这个post:Opencart get product downloads 但它并不完全适用于产品页面 (product.php)

Opencart 版本 3.0.2.0

好的,我会尝试一下,但让我们澄清一些事情:

1) DB_PREFIX 只是一个在 config.php 文件中声明的 php 常量。根据您提供的查询,它可能等于 ocuk。关键是,您使用此常量编写查询,并且无论用户选择的数据库前缀如何,它们都会在安装过程中变为 portable。

2) Opencart 基于 MCVL(MVC 的扩展,包括语言文件)结构。执行查询的地方在模型中。调用模型方法的地方在controller中。控制器将输出传递给 view 并经常使用来自 language 文件的语言变量。

所以我要做的是编写函数并将其放入您的产品模型中——在本例中是 catalog/model/catalog/product.php。此函数称为 方法 ,因为它现在是模型的一部分 class。该函数将在您的 table 中输出登录客户已购买给定产品的行。检查 (a) 客户是否已登录以及 (b) 您要查询的订单是 真实 订单也很重要 - order_status_id > 0。我们可以深入了解,但足以说明如果您想了解实际完成的订单,您总是需要检查 order_status_id。这种方法可能看起来像这样:

public function getOrderProductHistory($product_id) {
    $result = [];
    if ($customer_id = $this->customer->getId()) {
        $sql = "
            SELECT *
            FROM " . DB_PREFIX . "order o
            JOIN " . DB_PREFIX . "order_product op USING (order_id)
            WHERE o.order_status_id > 0
                AND o.customer_id = '" . (int)$customer_id . "'
        ";
        $query = $this->db->query($sql);
        $result = $query->rows;
    }
    return $result;
}

现在在您的控制器中(在 catalog/controller/product/product.php 的产品页面上)您可以调用此方法来获得如下结果:

$order_product_history = $this->model_catalog_product->getOrderProductHistory($product_id);

然后根据输出做一些事情:

if ($order_product_history) {
    $data['has_been_ordered'] = true;
} else {
    $data['has_been_ordered'] = false;
}

现在 $has_been_ordered 是一个布尔值,您可以在 视图 中访问它以向客户显示消息。您还有更多代码需要编写,但希望这能帮助您有个好的开始。