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