Create a new php file called Configurable.php and located in app/code/local/XLPages/ManageStock/Block/Product/View/Type/Configurable.php.
create config.xml with the following content and under app/code/local/XLPages/ManageStock/config.xml:
<?xml version="1.0"?> <config> <modules> <XLPages_ManageStock>0.1.0 </XLPages_ManageStock> </modules> <global> <blocks> <catalog> <rewrite>XLPages_ManageStock_Block_Product_View_Type_Configurable </rewrite> </catalog> </blocks> </global> </config>
create a file called XLPages_ManageStock.xml with the following content and located
under app/etc/modules/XLPages_ManageStock.xml
<?xml version="1.0"?> <config> <modules> <XLPages_ManageStock> <active>true</active> <codePool>local</codePool> </XLPages_ManageStock> </modules> </config>
In Admin create a new attribute called backorder_date and add it to your attribut_set, this will let customer knows if the item is on backorder and what is the backorder date.
< ?php class XLPages_ManageStock_Block_Product_View_Type_Configurable extends Mage_Catalog_Block_Product_View_Type_Configurable { public function getJsonConfig() { $attributes = array(); $options = array(); $store = Mage::app()->getStore(); foreach ($this->getAllowProducts() as $product) { $productId = $product->getId(); foreach ($this->getAllowAttributes() as $attribute) { $productAttribute = $attribute->getProductAttribute(); $attributeValue = $product->getData($productAttribute->getAttributeCode()); $options['qty'][$product -> getAttributeText($productAttribute->getName())] = floor($product->getStockItem()->getQty()); if (!isset($options[$productAttribute->getId()])) { $options[$productAttribute->getId()] = array(); } if (!isset($options[$productAttribute->getId()][$attributeValue])) { $options[$productAttribute->getId()][$attributeValue] = array(); } $options[$productAttribute->getId()][$attributeValue][] = $productId; } } $this->_resPrices = array( $this->_preparePrice($this->getProduct()->getFinalPrice()) ); foreach ($this->getAllowAttributes() as $attribute) { $productAttribute = $attribute->getProductAttribute(); $attributeId = $productAttribute->getId(); $info = array( 'id' => $productAttribute->getId(), 'code' => $productAttribute->getAttributeCode(), 'label' => $attribute->getLabel(), 'options' => array() ); $optionPrices = array(); $prices = $attribute->getPrices(); if (is_array($prices)) { foreach ($prices as $value) { if(!$this->_validateAttributeValue($attributeId, $value, $options)) { continue; } if($attribute->getLabel() != "Color") { $products= $options[$attributeId][$value['value_index']]; $numItems= count($products) for($i=0;$i $products[$i]); $stockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($products[$i]); $currentItem = Mage::getModel('catalog/product')->load($products[$i]); $info['options'][] = array( 'id' => $value['value_index'], 'label' => ($stockItem->getQty() formatDate($currentItem ->getData('backorder_date')).")" : $value['label'], //'price' => $this->_preparePrice($value['pricing_value'], $value['is_percent']), 'price' => $this->_registerJsPrice($this->_convertPrice($currentItem ->getData('price'))) - $this->_registerJsPrice($this->_convertPrice($this->getProduct()->getPrice())), 'products' => isset($options[$attributeId][$value['value_index']]) ? $a : array(), ); } } else { $info['options'][] = array( 'id' => $value['value_index'], 'label' => $value['label'], 'price' => $this->_preparePrice($value['pricing_value'], $value['is_percent']), 'products' => isset($options[$attributeId][$value['value_index']]) ? $options[$attributeId][$value['value_index']] : array(), ); } $optionPrices[] = $this->_preparePrice($value['pricing_value'], $value['is_percent']); } } /** * Prepare formated values for options choose */ foreach ($optionPrices as $optionPrice) { foreach ($optionPrices as $additional) { $this->_preparePrice(abs($additional-$optionPrice)); } } if($this->_validateAttributeInfo($info)) { $attributes[$attributeId] = $info; } } $config = array( 'attributes'=> $attributes, 'template' => str_replace('%s', '#{price}', $store->getCurrentCurrency()->getOutputFormat()), 'prices' => $this->_prices, 'basePrice' => $this->_registerJsPrice($this->_convertPrice($this->getProduct()->getFinalPrice())), 'oldPrice' => $this->_registerJsPrice($this->_convertPrice($this->getProduct()->getPrice())), 'productId' => $this->getProduct()->getId(), 'chooseText'=> Mage::helper('catalog')->__('Choose option...'), ); return Zend_Json::encode($config); } function formatDate($date){ $_date = explode(" ", $date); if($_date[0] != ""){ return " ~ ".$_date[0]; } } } ?>
NB: If you are using Magento 1.4 version, the function getJsonConfig() must be replaced by this new one (see below).
< ?php class Ayasoftware_SimpleProductPricing_Catalog_Block_Product_View_Type_Configurable extends Mage_Catalog_Block_Product_View_Type_Configurable { public function getJsonConfig() { $attributes = array(); $options = array(); $store = Mage::app()->getStore(); foreach ($this->getAllowProducts() as $product) { $productId = $product->getId(); foreach ($this->getAllowAttributes() as $attribute) { $productAttribute = $attribute->getProductAttribute(); $attributeValue = $product->getData($productAttribute->getAttributeCode()); if (!isset($options[$productAttribute->getId()])) { $options[$productAttribute->getId()] = array(); } if (!isset($options[$productAttribute->getId()][$attributeValue])) { $options[$productAttribute->getId()][$attributeValue] = array(); } $options[$productAttribute->getId()][$attributeValue][] = $productId; } } $this->_resPrices = array( $this->_preparePrice($this->getProduct()->getFinalPrice()) ); $optionsLabel = array(); foreach ($this->getAllowAttributes() as $attribute) { array_push($optionsLabel, $attribute->getLabel()) ; } $numberOfOptions = count($optionsLabel); foreach ($this->getAllowAttributes() as $attribute) { $productAttribute = $attribute->getProductAttribute(); $attributeId = $productAttribute->getId(); $info = array( 'id' => $productAttribute->getId(), 'code' => $productAttribute->getAttributeCode(), 'label' => $attribute->getLabel(), 'options' => array() ); $optionPrices = array(); $prices = $attribute->getPrices(); if (is_array($prices)) { foreach ($prices as $value) { if(!$this->_validateAttributeValue($attributeId, $value, $options)) { continue; } if($attribute->getLabel() == $optionsLabel[$numberOfOptions - 1]) { $products= $options[$attributeId][$value['value_index']]; $numItems= count($products); for($i=0;$i $products[$i]); $stockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($products[$i]); $currentItem = Mage::getModel('catalog/product')->load($products[$i]); $info['options'][] = array( 'id' => $value['value_index'], 'label' => ($stockItem->getQty() $this->_registerJsPrice($this->_convertPrice($currentItem ->getData('price'))) - $this->_registerJsPrice($this->_convertPrice($this->getProduct()->getPrice())), 'products' => isset($options[$attributeId][$value['value_index']]) ? $a : array(), ); } } else { $info['options'][] = array( 'id' => $value['value_index'], 'label' => $value['label'], 'price' => $this->_preparePrice($value['pricing_value'], $value['is_percent']), 'products' => isset($options[$attributeId][$value['value_index']]) ? $options[$attributeId][$value['value_index']] : array(), ); } $optionPrices[] = $this->_preparePrice($value['pricing_value'], $value['is_percent']); } } /** * Prepare formated values for options choose */ foreach ($optionPrices as $optionPrice) { foreach ($optionPrices as $additional) { $this->_preparePrice(abs($additional-$optionPrice)); } } if($this->_validateAttributeInfo($info)) { $attributes[$attributeId] = $info; } } $_request = Mage::getSingleton('tax/calculation')->getRateRequest(false, false, false); $_request->setProductClassId($this->getProduct()->getTaxClassId()); $defaultTax = Mage::getSingleton('tax/calculation')->getRate($_request); $_request = Mage::getSingleton('tax/calculation')->getRateRequest(); $_request->setProductClassId($this->getProduct()->getTaxClassId()); $currentTax = Mage::getSingleton('tax/calculation')->getRate($_request); $taxConfig = array( 'includeTax' => Mage::helper('tax')->priceIncludesTax(), 'showIncludeTax' => Mage::helper('tax')->displayPriceIncludingTax(), 'showBothPrices' => Mage::helper('tax')->displayBothPrices(), 'defaultTax' => $defaultTax, 'currentTax' => $currentTax, 'inclTaxTitle' => Mage::helper('catalog')->__('Incl. Tax'), ); $config = array( 'attributes' => $attributes, 'template' => str_replace('%s', '#{price}', $store->getCurrentCurrency()->getOutputFormat()), 'basePrice' => $this->_registerJsPrice($this->_convertPrice($this->getProduct()->getFinalPrice())), 'oldPrice' => $this->_registerJsPrice($this->_convertPrice($this->getProduct()->getPrice())), 'productId' => $this->getProduct()->getId(), 'chooseText' => Mage::helper('catalog')->__('Choose an Option...'), 'taxConfig' => $taxConfig, ); return Mage::helper('core')->jsonEncode($config); } } ?>
want to disable the selection if it shows "out of stock? replace this bloc in js/varien/product.js
if(allowedProducts.size()>0){ options[i].allowedProducts = allowedProducts; var option_label = this.getOptionLabel(options[i], options[i].price); element.options[index] = new Option(option_label, options[i].id); if(option_label.indexOf('stock') !== -1) { $(element.options[index]).addClassName('disabled'); element.options[index].disabled = true; } element.options[index].config = options[i]; index++; }
Need help ? Get instant answers for Your Magento Programming Questions .