2012-02-05 96 views
2

我沒有prestashop的經驗。 我試圖獲得與其屬性的某些值相匹配的所有產品。如何獲得prestashop過濾產品的屬性

[編輯]

現在我用Product::getProducts得到的所有產品。之後,我通過array_filter過濾結果數組。我想知道直接檢索過濾產品的方法,在數據庫中進行過濾。例如。傳遞函數或字符串過濾器如 Product::getProductsBy('product_id > 10')

+0

您的問題是有點模糊。例如,是否要列出所有具有「顏色」屬性且值「藍色」的產品作爲可用選項? – 2012-02-05 18:48:51

+0

現在我通過使用'Product :: getProducts'獲取所有產品。之後,我用'array_filter'過濾結果數組。我想知道直接檢索過濾產品的方法,在數據庫中進行過濾。例如。傳遞函數過濾器或字符串過濾器。 Product :: getProductsByFilter('product_id> 10') – abuduba 2012-02-06 13:21:26

+0

@PaulCampbell你好先生我知道這是個老問題,但我有一個問題,請幫助我我已經在你的答案下面的評論中描述了它。 – siddhesh 2015-07-07 10:04:09

回答

7

簡短的回答是,沒有有沒有什麼內置可以做到這一點,但是,如果我理解正確的話,那麼你想要的產品列表,使用產品列表主題模板以適當的格式輸出特定的屬性值。

我假設你從一個組中屬性值的下拉列表開始,因此我們可以完全忽略屬性分組。例如,您可以使用可選值「M」和「L」的屬性組「Size」(id_attribute_group = 1),後者對應於XX_attribute表中的條目。

在XX_attribute表你會

id_attribute | id_attribute_group | color 
1   | 1     | #000000 
2   | 1     | #000000 

在XX_attribute_lang表你會

id_attribute | id_lang   | name 
1   | 1     | M 
2   | 1     | L 

假設你不關心的類別等等 - 讓所有的產品面世在大小「L」中,您可以使用簡單的查詢,例如:

​​

然後您必須對Prestashop內部使用的功能進行bascially複製,以檢索上面獲得的product_ids數組的產品詳細信息以傳遞到產品列表模板。在這個階段只獲得產品ID可能是最好的方法,因爲你需要後期處理的產品數據,無論如何,語言,貨幣,稅收等

爲了從內置ID數組拿到產品的詳細數據以上或類似的過濾查詢(例如,存儲在數組稱爲$product_ids),你將不得不做這樣的事情:

global $cookie; 
$id_lang = $cookie->id_lang; 
$product_list = array(); 

if (count($product_ids)) 
{ 
    $sql = ' 
    SELECT p.*, pa.`id_product_attribute`, pl.`description`, pl.`description_short`, pl.`available_now`, pl.`available_later`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, i.`id_image`, il.`legend`, m.`name` AS manufacturer_name, tl.`name` AS tax_name, t.`rate`, cl.`name` AS category_default, DATEDIFF(p.`date_add`, DATE_SUB(NOW(), INTERVAL '.(Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY)) > 0 AS new, 
    (p.`price` * IF(t.`rate`,((100 + (t.`rate`))/100),1)) AS orderprice 
    FROM `'._DB_PREFIX_.'category_product` cp 
    LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = cp.`id_product` 
    LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON (p.`id_product` = pa.`id_product` AND default_on = 1) 
    LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (p.`id_category_default` = cl.`id_category` AND cl.`id_lang` = '.(int)($id_lang).') 
    LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)($id_lang).') 
    LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1) 
    LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)($id_lang).') 
    LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (p.`id_tax_rules_group` = tr.`id_tax_rules_group` 
              AND tr.`id_country` = '.(int)Country::getDefaultCountryId().' 
               AND tr.`id_state` = 0) 
    LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = tr.`id_tax`) 
    LEFT JOIN `'._DB_PREFIX_.'tax_lang` tl ON (t.`id_tax` = tl.`id_tax` AND tl.`id_lang` = '.(int)($id_lang).') 
    LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON m.`id_manufacturer` = p.`id_manufacturer` 
    WHERE p.`active` = 1' : '').' 
     '.($id_supplier ? 'AND p.id_supplier = '.(int)($id_supplier) : '').' 
    AND p.`id_product` IN(' . implode(',', $product_ids) . ')'; 

    $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql); 


    /* Modify SQL result */ 
    $product_list = Product::getProductsProperties($id_lang, $result); 
} 

顯然我已經使用IN()篩選的結果,我們的產品集,這對於大量的產品是會得到棘手的,但它給出了一般的想法!另一個問題是,上面的查詢幾乎是從Prestashop其他地方的類似功能中提取出來的(道歉,如果我已經在任何地方對它進行了錯誤編輯!),並且因此可能會在升級時崩潰....

+0

,如果我們想要大小L顏色綠色(4),那麼應該如何做到這一點。基本上在過濾我們使用,並在組和團體值我的意思是說'在哪裏(顏色=紅色或顏色=綠色)和(大小= L或大小= M)'它的作品perfetly當你存儲的顏色和大小在一行,但如何可能在presta。 @PaulCampbell請幫我,我想這樣做。 – siddhesh 2015-07-07 10:00:27

0

正如Paul所述,您的問題非常模糊,可能很難在沒有附加信息的情況下正確回答。但是,我會嘗試提供一些可能的解決方案:

如果您要購買具有顏色和大小選項的特定產品(如iPod),可以使用屬性&組選項卡和目錄中的組合生成器。

如果您希望根據諸如價格,功能,顏色等參數縮小產品列表(例如,考慮您在Amazon.com上的購物方式),則可以使用內置分層導航模塊。

如果這些都不能解決您的問題,請發佈其他信息以幫助我們更好地瞭解您所問的內容。

來源:我PrestaShop的社區經理

相關問題