2012-12-15 163 views
1

我是opencart的新手,我想知道如何修改搜索功能以按选项或价格搜索产品。我有一个适合我的大学的项目,我需要创建这样一个功能。Opencart按价格或按产品选项筛选产品

你能告诉我怎么样?我需要一个例子。

Thanx!

+0

这不是真的,你可以显示一个例子。它需要相当多的编码。 OpenCart扩展存储上有扩展可以满足您的需求。我的建议是将其中一个分开看看它是如何完成的 –

+0

@JayGilford以及我不能使用任何模块,因为我的教授有一个反plagiation软件,所以我不能使用任何其他功能。他还购买了一些最重要的高级搜索模块。这就是为什么我需要一个例子。我知道我必须修改控制器和搜索功能,但我需要了解宏观,因为这是我第二次使用opencart。这就是为什么我需要一个例子。例如,在尺寸(S,M,L,XL等)后,我必须搜索一件T恤。尺寸是一个产品选项。请帮助我:) –

+1

那么,我会踢那个教授到他的屁股那种项目。除非您对PHP + MySQL编程非常满意,并且知道OpenCart相当好,否则几乎不可能完成它......您必须知道OpenCart中的产品选项如何工作,并且它不像产品属性... – shadyyx

回答

3

我使用Opencart的1.5.3.1这个例子

您需要修改的getProducts()函数。搜索查询看起来像这样建在:

SELECT p.product_id, (SELECT AVG(rating) AS total FROM review r1 WHERE r1.product_id = 
p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating FROM product p LEFT 
JOIN product_description pd ON (p.product_id = pd.product_id) LEFT JOIN product_to_store 
p2s ON (p.product_id = p2s.product_id) LEFT JOIN product_tag pt ON (p.product_id = 
pt.product_id) WHERE pd.language_id = '1' AND p.status = '1' AND p.date_available <= NOW 
() AND p2s.store_id = '0' AND (LCASE(pd.name) LIKE '%large%' OR LCASE(pt.tag) LIKE 
'%large%' AND pt.language_id = '1') GROUP BY p.product_id ORDER BY p.sort_order ASC, LCASE 
(pd.name) ASC LIMIT 0,15 

您需要的选项值说明添加到查询以及添加参数WHERE子句:

SELECT p.product_id, (SELECT AVG(rating) AS total FROM review r1 WHERE r1.product_id = 
p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating FROM product p LEFT 
JOIN product_description pd ON (p.product_id = pd.product_id) LEFT JOIN 
product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN product_option_value 
pov ON (p.product_id = pov.product_id) LEFT JOIN option_value_description ovd ON 
(pov.option_value_id = ovd.option_value_id) LEFT JOIN product_tag pt ON (p.product_id 
= pt.product_id) WHERE pd.language_id = '1' AND p.status = '1' AND p.date_available <= 
NOW() AND p2s.store_id = '0' AND (LCASE(pd.name) LIKE '%large%' OR LCASE(ovd.name) 
LIKE '%large%' OR LCASE(pt.tag) LIKE '%large%' AND pt.language_id = '1') GROUP BY 
p.product_id ORDER BY p.sort_order ASC, LCASE(pd.name) ASC LIMIT 0,15 

要做到这一点,编辑目录/model/catalog/product.php。查找线路37,38:

 if (!$product_data) { 
     $sql = "SELECT p.product_id, (SELECT AVG(rating) AS total FROM 
" .  DB_PREFIX . "review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' 
GROUP BY r1.product_id) AS rating FROM " . DB_PREFIX . "product p LEFT JOIN " . 
DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . 
DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id)"; 

添加后:

  //add option values to search query 
     $sql.= " LEFT JOIN " . DB_PREFIX . "product_option_value pov ON (p.product_id = pov.product_id)"; 
     $sql.= " LEFT JOIN " . DB_PREFIX . "option_value_description ovd ON (pov.option_value_id = ovd.option_value_id)";  
     // - - - - - - - - - - - - - 

查找行70:

$implode[] = "LCASE(pd.name) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%'"; 

将其更改为:

$implode[] = "LCASE(pd.name) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%' 
OR LCASE(ovd.name) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%'"; 

现在搜索将“请参阅“大”,“红”等产品选项值名称。

要搜索的价格是非常容易,只包括在参数的WHERE子句 完全匹配使用:

"pd.price = '" . $this->db->escape(utf8_strtolower($word)) . "' 

的,比方说,价格值达到一定值时,使用:

"pd.price <= '" . $this->db->escape(utf8_strtolower($word)) . "' 

希望,你明白了。

现在,这是一个快速和肮脏的例子只有,打算让你去。

我不是建议这是最终的解决方案。

您需要考虑添加新的GET变量以控制是否在搜索中包含选项和/或价格。此外,搜索价格范围,而不是价格。添加变量以控制是否使用AND或OR运算符 - 即查找“红色”和“XL”或两者中的任何一个。

祝你好运。

+0

感谢它在版本2.3.0.2中的工作 –