Создание кода купона для продукта с пользовательскими опциями


Мне нужно сгенерировать коды купонов для продуктов с определенными пользовательскими опциями. В моих правилах продаж есть условия для артикулов и количеств товаров. Однако я не знаю хорошего способа получить артикул для продукта, у которого есть определенные опции. Я попробовал решение, изложенное на этом сайте: http://inchoo.net/magento/magento-shopping-cart-promotion-rule-for-product-with-custom-options/

К сожалению, генерация артикулов в формате [main product SKU]-[first option SKU]-... является полностью ненадежно, так как даже в тестовой базе данных Magento есть продукты с разными артикулами. Например, футболка XL chealsea должна иметь артикул mtk000-XL, но фактический артикул mtk000xl.

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

  • Объект продукта, который загружается по его URL-адресу с помощью приведенного ниже метода
  • Массив, содержащий пользовательские параметры

Загрузить товар по URL:

public function getItemByUrl($url) {

    $itemUrl = str_replace(Mage::getBaseUrl(), "", $url);
    if (strpos($itemUrl, "/" === 0)) {
        $itemUrl = substr($itemUrl, 1);
    }

    $oRewrite = Mage::getModel('core/url_rewrite')
        ->setStoreId(Mage::app()->getStore()->getId())
        ->loadByRequestPath($itemUrl);

    if ($oRewrite == null) return null;

    $item_id = $oRewrite->getProductId();

    if ($item_id == null) return null;

    $product  = Mage::getModel('catalog/product')->load($item_id);

    return $product;

}

Формат массива:

attribute id => selected option id

Например, с рубашкой цвета хаки среднего цвета связан следующий массив параметров:

array(2) {
   [92]  => "28"
   [180] => "78"
}

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

Author: Soma Deáki, 2015-07-21

1 answers

В конце концов, я смог придумать метод, который делает именно то, что мне нужно.

private function getSkuForOptions($product, $options) {

    $usedProducts = $product->getTypeInstance(true)->getUsedProducts(null, $product);

    $sku = -1;

    foreach ($usedProducts as $childProduct) {
        if (!$childProduct->isSaleable()) {
            continue;
        }

        $data = $childProduct->getData();
        $match = true;
        foreach ($options as $id => $value) {
            if (!isset($data[$id]) || $data[$id] !== $value) {
                $match = false;
            }
        }

        if ($match) {
            $sku = $childProduct->getSku();
            break;
        }

    }

    return $sku;

}

Параметр $product - это объект, возвращаемый методом getItemByUrl, описанным в моем первоначальном вопросе. Параметр $options представляет собой массив в следующем формате:

attribute_code => value_id

Например, красная рубашка XL связана со следующим массивом опций:

array(2) {
  'color'  => 28
  'size'   => 78
}

Мой метод ищет продаваемые экземпляры базового продукта и пытается сопоставить их параметры с теми предоставленный.

Эта идея пришла ко мне после многих часов обратного проектирования ядра magento и чтения этой статьи: http://www.divisionlab.com/solvingmagento/magento-configurable-product-type-tutorial/

 3
Author: Soma Deáki, 2015-07-22 12:44:51