Таким чином, я використовую наведений нижче код у поєднанні з розширенням, як органічні Інтернет, просто налаштовані продукти.
Код нижче призначений для кошика / оформлення замовлення, по суті, це оновлення настроюваної цінової моделі, яка передає розрахунок ціни на простий товар у випадку, якщо товар був доданий у кошик --- це рішення НЕ відображає ціноутворення на самій сторінці продукту (проте є вже багато розширень, які вже роблять це).
Оновіть додаток / код / core / Mage / Каталог / Модель / Продукт / Тип / Налаштовується / Price.php (в ідеалі ви використовуєте розширення або локальне перевизначення в додатку / коді / локальному)
Оновіть метод: getFinalPrice, змініть на
public function getFinalPrice($qty=null, $product)
{
//Start edit
$selectedAttributes = array();
if ($product->getCustomOption('attributes')) {
$selectedAttributes = unserialize($product->getCustomOption('attributes')->getValue());
}
//End edit
if (sizeof($selectedAttributes)) return $this->getSimpleProductPrice($qty, $product);
if (is_null($qty) && !is_null($product->getCalculatedFinalPrice())) {
return $product->getCalculatedFinalPrice();
}
$basePrice = $this->getBasePrice($product, $qty);
$finalPrice = $basePrice;
$product->setFinalPrice($finalPrice);
Mage::dispatchEvent('catalog_product_get_final_price', array('product' => $product, 'qty' => $qty));
$finalPrice = $product->getData('final_price');
$finalPrice += $this->getTotalConfigurableItemsPrice($product, $finalPrice);
$finalPrice += $this->_applyOptionsPrice($product, $qty, $basePrice) - $basePrice;
$finalPrice = max(0, $finalPrice);
$product->setFinalPrice($finalPrice);
return $finalPrice;
}
Потім додайте цю функцію прямо під getFinalPrice:
public function getSimpleProductPrice($qty=null, $product)
{
$cfgId = $product->getId();
$product->getTypeInstance(true)
->setStoreFilter($product->getStore(), $product);
$attributes = $product->getTypeInstance(true)
->getConfigurableAttributes($product);
$selectedAttributes = array();
if ($product->getCustomOption('attributes')) {
$selectedAttributes = unserialize($product->getCustomOption('attributes')->getValue());
}
$db = Mage::getSingleton('core/resource')->getConnection('core_read');
$dbMeta = Mage::getSingleton('core/resource');
$sql = <<<SQL
SELECT main_table.entity_id FROM {$dbMeta->getTableName('catalog/product')} `main_table` INNER JOIN
{$dbMeta->getTableName('catalog/product_super_link')} `sl` ON sl.parent_id = {$cfgId}
SQL;
foreach($selectedAttributes as $attributeId => $optionId) {
$alias = "a{$attributeId}";
$sql .= ' INNER JOIN ' . $dbMeta->getTableName('catalog/product') . "_int" . " $alias ON $alias.entity_id = main_table.entity_id AND $alias.attribute_id = $attributeId AND $alias.value = $optionId AND $alias.entity_id = sl.product_id";
}
$id = $db->fetchOne($sql);
return Mage::getModel("catalog/product")->load($id)->getFinalPrice($qty);
}
Ви можете бачити, що у випадку, коли користувач "налаштував" продукт (IE, вибрані параметри, що настроюються), ми визначаємо пов'язаний простий товар і передаємо контроль його моделі ціноутворення, інакше, якщо продукт не "настроюється" (IE, ми ми переглядаємо сторінку продукту), ми проходимо як звичайно