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

时间:2018-11-16 02:10:04

标签: php opencart

关于销售数字下载的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产品页面中获得相似的结果。 (确切的页面和路径以及文件内的位置)

也尝试过此帖子:Opencart get product downloads 但这不适用于产品页面(product.php)

Opencart版本3.0.2.0

1 个答案:

答案 0 :(得分:0)

好吧,我会刺一下,但让我们澄清一些事情:

1)DB_PREFIX只是在config.php文件中声明的一个php常量。根据您提供的查询,它可能等于ocuk。关键是,您可以使用此常量编写查询,并且无论用户选择了哪种数据库前缀,查询都可以在整个安装环境中移植。

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

因此,我要做的就是编写函数并将其放入您的产品模型中-在这种情况下为catalog/model/catalog/product.php。该函数称为 method ,因为它现在是模型类的一部分。该函数将输出表中已登录客户已购买给定产品的行。同样重要的是要检查(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是一个布尔值,您可以在视图中访问该布尔值以向客户显示消息。还有更多代码需要您编写,但是希望这可以帮助您入门。