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
是一个布尔值,您可以在 视图 中访问它以向客户显示消息。您还有更多代码需要编写,但希望这能帮助您有个好的开始。
关于销售数字下载的 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
是一个布尔值,您可以在 视图 中访问它以向客户显示消息。您还有更多代码需要编写,但希望这能帮助您有个好的开始。