我尝试在客户插入最小值和最大值时过滤产品价格。
product.php
public function getProducts($data = array()) {
....
if (!empty($data['min'])) {
$sql .= " AND p.price BETWEEN '" .$data['min']. "' AND 9999 ";
}
使用此代码,类别页面将列出从价格x到9999的所有产品。
问题是某些产品有tax
,而值存储在另一个表(oc_tax_rate
)中。 那么如何在查询中获得产品的最终价格? (p.price + tax),如下所示:
if (!empty($data['min'])) {
$sql .= " AND final_price BETWEEN '" .$data['min']. "' AND 9999 ";
}
当我检查页面控制器/ category.php
$this->tax->calculate($result['price'], $result['tax_class_id'], $this->config->get('config_tax'))
以上代码将返回最终价格。
OC:v1.5.6
答案 0 :(得分:1)
首先,当您使用min
和max
过滤器值时,您的查询不应该选择between min and 9999
和between 0 and max
,但您应该这样做:
if (!empty($data['min'])) {
$sql .= " AND p.price >= " . (int)$data['min'];
// ^^^^^ - against SQL injection!!!
}
和
if (!empty($data['max'])) {
$sql .= " AND p.price <= " . (int)$data['max'];
// ^^^^^ - against SQL injection!!!
}
另外,正如评论中所提到的,不要忘记治愈你的代码反对SQL注入!
现在,对于您真正的问题:无法获得税收并计算纳税价格以及产品进入一个查询。但你可以在你的模型中做到这一点 - 找到这部分代码
foreach ($query->rows as $result) {
$product_data[$result['product_id']] = $this->getProduct($result['product_id']);
}
我们会这样修改:
foreach ($query->rows as $result) {
if (!empty($data['min'])
&& $this->tax->calculate($result['price'], $result['tax_class_id'], $this->config->get('config_tax')) >= $data['min']) {
$product_data[$result['product_id']] = $this->getProduct($result['product_id']);
} else if (!empty($data['max'])
&& $this->tax->calculate($result['price'], $result['tax_class_id'], $this->config->get('config_tax')) <= $data['max']) {
$product_data[$result['product_id']] = $this->getProduct($result['product_id']);
} else {
$product_data[$result['product_id']] = $this->getProduct($result['product_id']);
}
}