2012-12-15 203 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中的工作 –