Как попасть в prestashop отфильтрованные товары по их атрибуту - PullRequest
2 голосов
/ 05 февраля 2012

У меня нет опыта работы в prestashop.Я пытаюсь получить все продукты, которые соответствуют некоторому значению его атрибута.

[править]

Теперь я получаю все продукты, используя Product::getProducts.После этого я фильтрую массив результатов по array_filter.Я задаюсь вопросом о методе извлечения этих отфильтрованных продуктов напрямую, где фильтрация выполняется в базе данных.Например.передача функции или строкового фильтра, например Product::getProductsBy( 'product_id > 10')

Ответы [ 2 ]

7 голосов
/ 07 февраля 2012

Короткий ответ: нет, там нет ничего встроенного, что может это сделать, однако, если я правильно понимаю, тогда вы хотите, чтобы список продуктов, имеющих определенное значение атрибута в подходящем формате, выводился с использованием шаблон темы списка товаров.

Я предполагаю, что вы начинаете с раскрывающегося списка значений атрибутов в группе, и поэтому мы можем полностью игнорировать группировку атрибутов. Например, у вас может быть группа атрибутов «Размер» (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, полученного выше, для передачи в шаблон списка продуктов. Получение только идентификаторов продуктов на этом этапе, вероятно, является наилучшим подходом, поскольку вам все равно нужно пост-обработать данные продукта для языка, валюты, налогов и т. Д.

Чтобы получить подробные данные о продукте из массива идентификаторов, созданного из приведенного выше, или аналогичного фильтрационного запроса (например, хранящегося в массиве с именем $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 голосов
/ 06 февраля 2012

Как упомянул Павел выше, ваш вопрос чрезвычайно расплывчатый, и на него трудно ответить без дополнительной информации.Однако я постараюсь предложить пару потенциальных решений:

Если вы хотите приобрести конкретный продукт, например, iPod, с вариантами цвета и размера, вы можете сделать это с помощью Атрибутов и группвкладка и Генератор комбинаций в вашем каталоге.

Если вы хотите сузить список продуктов на основе таких параметров, как цена, характеристики, цвет и т. д. (подумайте о том, как вы совершаете покупки на Amazon.comнапример), вы можете настроить это с помощью встроенного многоуровневого модуля навигации.

Если ни один из этих вопросов не отвечает на ваш вопрос, пожалуйста, опубликуйте дополнительную информацию, чтобы помочь нам лучше понять, о чем вы спрашиваете.

Источник: я менеджер сообщества PrestaShop

...