1

私はopencartにかなり慣れていないので、検索機能を変更してオプションまたは価格で製品を検索する方法を知りたい. 大学のプロジェクトがあり、そのような関数を作成する必要があります。

方法を教えてください。例が必要です。

ありがとう!

4

1 に答える 1

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

これを行うには、catalog/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)) . "%'";

検索すると、「Large」、「Red」などの商品オプション値の名前が「表示」されます。

価格を検索する方がはるかに簡単です。正確な一致を使用するには、WHERE 句にパラメーターを含めるだけです。

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

たとえば、特定の値までの価格値については、次を使用します。

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

希望、あなたはアイデアを得る。

さて、これは簡単で汚い例に過ぎず、あなたを動かすことを目的としています.

私はこれを最終的な解決策として提案していません。

オプションや価格を検索に含めるかどうかを制御するには、新しい GET 変数を追加することを検討する必要があります。また、価格ではなく価格帯を検索します。AND または OR 演算子を使用するかどうかを制御する変数を追加します。つまり、'red' と 'XL' の両方、または 2 つのいずれかを探します。

幸運を。

于 2012-12-19T06:55:32.930 に答える