2012-02-05 100 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的社区经理

相关问题