Por lo tanto, uso el siguiente código en combinación con una extensión como productos orgánicos configurables simples de Internet.
El siguiente código está destinado al proceso de compra / compra, esencialmente, es una actualización del modelo de precio configurable que pasa el cálculo del precio a un producto simple en caso de que el producto haya sido agregado al carrito --- esta solución NO muestra el precio en la página del producto en sí (sin embargo, hay muchas extensiones que ya lo hacen).
Actualice app / code / core / Mage / Catalog / Model / Product / Type / Configurable / Price.php (lo ideal es que use una extensión o anulación local en app / code / local)
Actualice el método: getFinalPrice, cambie 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;
}
Luego agregue esta función justo debajo de 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);
}
Puede ver que, en caso de que el usuario haya "personalizado" el producto (IE, opciones configurables seleccionadas), determinamos el producto simple asociado y pasamos el control a su modelo de precios, de lo contrario, si el producto no está "personalizado" (IE, nosotros estás navegando en la página del producto) procedemos normalmente