Tak więc używam poniższego kodu w połączeniu z rozszerzeniem, takim jak proste produkty organiczne z możliwością konfiguracji w Internecie.
Poniższy kod jest przeznaczony dla procesu koszyka / kasy, w gruncie rzeczy jest to aktualizacja konfigurowalnego modelu cen, który przekazuje kalkulację ceny do prostego produktu w przypadku, gdy produkt został dodany do koszyka --- to rozwiązanie NIE wyświetla ceny na samej stronie produktu (jednak istnieje wiele rozszerzeń, które już to robią).
Zaktualizuj aplikację / code / core / Mage / Catalog / Model / Product / Type / Configurable / Price.php (najlepiej używasz rozszerzenia lub zastąpienia lokalnego w app / code / local)
Zaktualizuj metodę: getFinalPrice, zmień na
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;
}
Następnie dodaj tę funkcję bezpośrednio pod 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);
}
Możesz zobaczyć, że w przypadku, gdy użytkownik „dostosował” produkt (IE, wybrane opcje konfigurowalne), określamy powiązany prosty produkt i przekazujemy kontrolę nad jego modelem cenowym, w przeciwnym razie, jeśli produkt nie będzie „dostosowany” (tj. przeglądamy na stronie produktu) postępujemy jak zwykle