我没有prestashop的经验。 我正在尝试将所有符合其属性值的产品。
[编辑]
现在我使用Product::getProducts
获取所有产品。之后我通过array_filter过滤结果数组。我想知道直接检索过滤产品的方法,过滤在数据库中进行。例如。传递函数或字符串过滤器之类的
Product::getProductsBy( 'product_id > 10')
答案 0 :(得分:7)
简短的回答是,没有任何内置可以做到这一点,但是,如果我正确理解,那么你想要一个具有特定属性值的产品列表,以适当的格式输出产品列表主题模板。
我假设您从组中属性值的下拉列表开始,因此我们可以完全忽略属性分组。例如,您可能有一个属性组“Size”(id_attribute_group = 1
),其可选值为“M”和“L”,后者对应于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”的所有产品,您可以使用简单的查询,例如:
SELECT pa.`id_product` FROM `XX_product_attribute` pa
LEFT JOIN `XX_product_attribute_combination` pac ON pa.`id_product_attribute` = pac.`id_product_attribute`
WHERE pac.`id_attribute` = '2'
然后,您必须基本上复制Prestashop内部使用的功能,以检索上面获得的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其他地方的类似功能(如果我在任何地方错误编辑它,请道歉!)因此可能会在升级时中断....
答案 1 :(得分:0)
正如保罗上面提到的,你的问题非常模糊,如果没有其他信息,可能很难正确回答。但是,我将尝试提供一些可能的解决方案:
如果您想购买具有颜色和尺寸选项的特定产品(如iPod),可以使用属性和属性来购买。 “组”选项卡和目录中的“组合生成器”。
如果您希望根据价格,功能,颜色等参数缩小产品列表(例如,考虑如何在Amazon.com上购物),您可以使用内置配置-in分层导航模块。
如果这些都没有解决您的问题,请发布其他信息,以帮助我们更好地了解您的问题。
来源:我是PrestaShop的社区经理