Создание кода купона для продукта с пользовательскими опциями
Мне нужно сгенерировать коды купонов для продуктов с определенными пользовательскими опциями. В моих правилах продаж есть условия для артикулов и количеств товаров. Однако я не знаю хорошего способа получить артикул для продукта, у которого есть определенные опции. Я попробовал решение, изложенное на этом сайте: 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"
}
Чтобы быть ясным, мне нужен только способ определить артикул, который относится к конкретному продукту, например, рубашка цвета хаки средней длины. Как только я это сделаю, у меня не возникнет проблем с созданием кодов купонов.
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/