Quindi, utilizzo il codice seguente in combinazione con un'estensione come i prodotti configurabili semplici di Internet organici.
Il codice seguente è pensato per il processo di carrello / checkout, essenzialmente, è un aggiornamento del modello di prezzo configurabile che passa il calcolo del prezzo a un prodotto semplice nel caso in cui il prodotto sia stato aggiunto al carrello --- questa soluzione NON visualizza i prezzi sulla stessa pagina del prodotto (tuttavia esistono già molte estensioni che lo fanno).
Aggiorna app / codice / core / Mage / Catalog / Model / Product / Type / Configurable / Price.php (idealmente usi un'estensione o una sostituzione locale in app / code / local)
Aggiorna il metodo: getFinalPrice, passa a
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;
}
Quindi aggiungi questa funzione proprio sotto 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);
}
Puoi vedere, nel caso in cui l'utente abbia "personalizzato" il prodotto (IE, opzioni configurabili selezionate) determiniamo il prodotto semplice associato e passiamo il controllo al suo modello di prezzo, altrimenti se il prodotto non è "personalizzato" (IE, noi navigando nella pagina del prodotto) procediamo normalmente