我沒有prestashop的經驗。 我試圖獲得與其屬性的某些值相匹配的所有產品。如何獲得prestashop過濾產品的屬性
[編輯]
現在我用Product::getProducts
得到的所有產品。之後,我通過array_filter過濾結果數組。我想知道直接檢索過濾產品的方法,在數據庫中進行過濾。例如。傳遞函數或字符串過濾器如 Product::getProductsBy('product_id > 10')
我沒有prestashop的經驗。 我試圖獲得與其屬性的某些值相匹配的所有產品。如何獲得prestashop過濾產品的屬性
[編輯]
現在我用Product::getProducts
得到的所有產品。之後,我通過array_filter過濾結果數組。我想知道直接檢索過濾產品的方法,在數據庫中進行過濾。例如。傳遞函數或字符串過濾器如 Product::getProductsBy('product_id > 10')
簡短的回答是,沒有有沒有什麼內置可以做到這一點,但是,如果我理解正確的話,那麼你想要的產品列表,使用產品列表主題模板以適當的格式輸出特定的屬性值。
我假設你從一個組中屬性值的下拉列表開始,因此我們可以完全忽略屬性分組。例如,您可以使用可選值「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其他地方的類似功能中提取出來的(道歉,如果我已經在任何地方對它進行了錯誤編輯!),並且因此可能會在升級時崩潰....
,如果我們想要大小L顏色綠色(4),那麼應該如何做到這一點。基本上在過濾我們使用,並在組和團體值我的意思是說'在哪裏(顏色=紅色或顏色=綠色)和(大小= L或大小= M)'它的作品perfetly當你存儲的顏色和大小在一行,但如何可能在presta。 @PaulCampbell請幫我,我想這樣做。 – siddhesh 2015-07-07 10:00:27
正如Paul所述,您的問題非常模糊,可能很難在沒有附加信息的情況下正確回答。但是,我會嘗試提供一些可能的解決方案:
如果您要購買具有顏色和大小選項的特定產品(如iPod),可以使用屬性&組選項卡和目錄中的組合生成器。
如果您希望根據諸如價格,功能,顏色等參數縮小產品列表(例如,考慮您在Amazon.com上的購物方式),則可以使用內置分層導航模塊。
如果這些都不能解決您的問題,請發佈其他信息以幫助我們更好地瞭解您所問的內容。
來源:我PrestaShop的社區經理
您的問題是有點模糊。例如,是否要列出所有具有「顏色」屬性且值「藍色」的產品作爲可用選項? – 2012-02-05 18:48:51
現在我通過使用'Product :: getProducts'獲取所有產品。之後,我用'array_filter'過濾結果數組。我想知道直接檢索過濾產品的方法,在數據庫中進行過濾。例如。傳遞函數過濾器或字符串過濾器。 Product :: getProductsByFilter('product_id> 10') – abuduba 2012-02-06 13:21:26
@PaulCampbell你好先生我知道這是個老問題,但我有一個問題,請幫助我我已經在你的答案下面的評論中描述了它。 – siddhesh 2015-07-07 10:04:09