prestashop - 如何通过属性获取prestashop过滤产品

标签 prestashop

我没有使用 prestashop 的经验。 我正在尝试获取与其属性的某些值匹配的所有产品。

[编辑]

现在我使用 Product::getProducts 获取所有产品。之后,我通过 array_filter 过滤结果数组。我想知道直接检索过滤产品的方法,过滤是在数据库中进行的。例如。传递函数或字符串过滤器,例如 Product::getProductsBy('product_id > 10')

最佳答案

简短的回答是没有任何内置的东西可以做到这一点,但是,如果我理解正确,那么你想要一个具有特定属性值的产品列表,以合适的格式输出使用产品列表主题模板。

我假设您从一组属性值的下拉列表开始,因此我们可以完全忽略属性分组。例如,您可能有一个属性组“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_id 数组的产品详细信息,以传递给产品列表模板。在此阶段只获取产品 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 其他地方的类似功能中提取出来的(如果我在任何地方编辑错误,我深表歉意!)因此可能会在升级时中断....

关于prestashop - 如何通过属性获取prestashop过滤产品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9150417/

相关文章:

php - 创建模块 prestashop 1.5

php - 如果条件不能正常工作,聪明的嵌套?

mysql - 通过重新排序表来更新位置字段

php - 在 prestashop DB 的表内复制

php - Prestashop 1.7 block page_content

javascript - js占位符未定义消息错误

javascript - Prestashop - 如何添加内联脚本?

magento - 我应该使用 BlueSnap 管理我的产品目录吗

Prestashop 过滤器 date_add 在 web 服务中

php - PrestaShop 对类别中的多个字段进行排序