/app/code/core/Mage/Catalog/Block/Product/View/Type/Configurable.php
PHP | 273 lines | 163 code | 29 blank | 81 comment | 15 complexity | 41d467169633522779eae64b7efd00b4 MD5 | raw file
- <?php
- /**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category Mage
- * @package Mage_Catalog
- * @copyright Copyright (c) 2010 Magento Inc. (http://www.magentocommerce.com)
- * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
- */
- /**
- * Catalog super product configurable part block
- *
- * @category Mage
- * @package Mage_Catalog
- * @author Magento Core Team <core@magentocommerce.com>
- */
- class Mage_Catalog_Block_Product_View_Type_Configurable extends Mage_Catalog_Block_Product_View_Abstract
- {
- protected $_prices = array();
- protected $_resPrices = array();
- public function getAllowAttributes()
- {
- return $this->getProduct()->getTypeInstance(true)
- ->getConfigurableAttributes($this->getProduct());
- }
- public function hasOptions()
- {
- $attributes = $this->getAllowAttributes();
- if (count($attributes)) {
- foreach ($attributes as $key => $attribute) {
- /** @var Mage_Catalog_Model_Product_Type_Configurable_Attribute $attribute */
- if ($attribute->getData('prices')) {
- return true;
- }
- }
- }
- return false;
- }
- public function getAllowProducts()
- {
- if (!$this->hasAllowProducts()) {
- $products = array();
- $allProducts = $this->getProduct()->getTypeInstance(true)
- ->getUsedProducts(null, $this->getProduct());
- foreach ($allProducts as $product) {
- if ($product->isSaleable()) {
- $products[] = $product;
- }
- }
- $this->setAllowProducts($products);
- }
- return $this->getData('allow_products');
- }
- 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())
- );
- 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;
- }
- $this->getProduct()->setConfigurablePrice($this->_preparePrice($value['pricing_value'], $value['is_percent']));
- Mage::dispatchEvent(
- 'catalog_product_type_configurable_price',
- array('product' => $this->getProduct())
- );
- $configurablePrice = $this->getProduct()->getConfigurablePrice();
- $info['options'][] = array(
- 'id' => $value['value_index'],
- 'label' => $value['label'],
- 'price' => $configurablePrice,
- 'oldPrice' => $this->_preparePrice($value['pricing_value'], $value['is_percent']),
- 'products' => isset($options[$attributeId][$value['value_index']]) ? $options[$attributeId][$value['value_index']] : array(),
- );
- $optionPrices[] = $configurablePrice;
- //$this->_registerAdditionalJsPrice($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;
- }
- }
- /*echo '<pre>';
- print_r($this->_prices);
- echo '</pre>';die();*/
- $_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()),
- // '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 an Option...'),
- 'taxConfig' => $taxConfig,
- );
- return Mage::helper('core')->jsonEncode($config);
- }
- /**
- * Validating of super product option value
- *
- * @param array $attribute
- * @param array $value
- * @param array $options
- * @return boolean
- */
- protected function _validateAttributeValue($attributeId, &$value, &$options)
- {
- if(isset($options[$attributeId][$value['value_index']])) {
- return true;
- }
- return false;
- }
- /**
- * Validation of super product option
- *
- * @param array $info
- * @return boolean
- */
- protected function _validateAttributeInfo(&$info)
- {
- if(count($info['options']) > 0) {
- return true;
- }
- return false;
- }
- protected function _preparePrice($price, $isPercent=false)
- {
- if ($isPercent && !empty($price)) {
- $price = $this->getProduct()->getPrice()*$price/100;
- }
- return $this->_registerJsPrice($this->_convertPrice($price, true));
- }
- protected function _registerJsPrice($price)
- {
- $jsPrice = str_replace(',', '.', $price);
- // if (!isset($this->_prices[$jsPrice])) {
- // $this->_prices[$jsPrice] = strip_tags(Mage::app()->getStore()->formatPrice($price));
- // }
- return $jsPrice;
- }
- protected function _convertPrice($price, $round=false)
- {
- if (empty($price)) {
- return 0;
- }
- $price = Mage::app()->getStore()->convertPrice($price);
- if ($round) {
- $price = Mage::app()->getStore()->roundPrice($price);
- }
- return $price;
- }
- // protected function _registerAdditionalJsPrice($price, $isPercent=false)
- // {
- // if (empty($price) && isset($this->_prices[0])) {
- // return $this;
- // }
- //
- // $basePrice = $this->getProduct()->getFinalPrice();
- // if ($isPercent) {
- // $price = $basePrice*$price/100;
- // }
- // else {
- // $price = $price;
- // }
- //
- // $price = $this->_convertPrice($price);
- //
- // foreach ($this->_resPrices as $prevPrice) {
- // $additionalPrice = $prevPrice + $price;
- // $this->_resPrices[] = $additionalPrice;
- // $jsAdditionalPrice = str_replace(',', '.', $additionalPrice);
- // $this->_prices[$jsAdditionalPrice] = strip_tags(Mage::app()->getStore()->formatPrice($additionalPrice));
- // }
- // return $this;
- // }
- }