Se você criou um cupom de desconto e notou que o valor do desconto não é calculado corretamente ao sub total, saiba é simples resolver. Isso acontece em especial quando usamos o PHP 7 para rodar no Magento. Existe duas formas para resolver isso. A primeira é trocar o PHP no CPANEL, porém não recomendo muito, já que pode afetar outras aplicações. O segundo método é atualizar um arquivo no source, foi o que fiz e deu certo.
1. Acesse o FTP e localize: app/code/core/Mage/Sales/Model/Config/Ordered.php
2. Comente esse código
/** * Aggregate before/after information from all items and sort totals based on this data * * @return array */ protected function _getSortedCollectorCodes() { if (Mage::app()->useCache('config')) { $cachedData = Mage::app()->loadCache($this->_collectorsCacheKey); if ($cachedData) { return unserialize($cachedData); } } $configArray = $this->_modelsConfig; // invoke simple sorting if the first element contains the "sort_order" key reset($configArray); $element = current($configArray); if (isset($element['sort_order'])) { uasort($configArray, array($this, '_compareSortOrder')); } else { foreach ($configArray as $code => $data) { foreach ($data['before'] as $beforeCode) { if (!isset($configArray[$beforeCode])) { continue; } $configArray[$code]['before'] = array_unique(array_merge( $configArray[$code]['before'], $configArray[$beforeCode]['before'] )); $configArray[$beforeCode]['after'] = array_merge( $configArray[$beforeCode]['after'], array($code), $data['after'] ); $configArray[$beforeCode]['after'] = array_unique($configArray[$beforeCode]['after']); } foreach ($data['after'] as $afterCode) { if (!isset($configArray[$afterCode])) { continue; } $configArray[$code]['after'] = array_unique(array_merge( $configArray[$code]['after'], $configArray[$afterCode]['after'] )); $configArray[$afterCode]['before'] = array_merge( $configArray[$afterCode]['before'], array($code), $data['before'] ); $configArray[$afterCode]['before'] = array_unique($configArray[$afterCode]['before']); } } uasort($configArray, array($this, '_compareTotals')); } $sortedCollectors = array_keys($configArray); if (Mage::app()->useCache('config')) { Mage::app()->saveCache(serialize($sortedCollectors), $this->_collectorsCacheKey, array( Mage_Core_Model_Config::CACHE_TAG ) ); } return $sortedCollectors; }
3. Cole logo em seguida esse código.
/**** Note: While applying coupon code, Totals are not updating due to uasort not working in php7 then modified the _getSortedCollectorCodes() function as shown below. ****/ protected function _getSortedCollectorCodes() { if (Mage::app()->useCache('config')) { $cachedData = Mage::app()->loadCache($this->_collectorsCacheKey); if ($cachedData) { return unserialize($cachedData); } } $configArray = $this->_modelsConfig; // invoke simple sorting if the first element contains the "sort_order" key reset($configArray); $element = current($configArray); Mage::log(var_export($element,true)); if (isset($element['sort_order'])) { uasort($configArray, array($this, '_compareSortOrder')); } else { foreach ($configArray as $code => $data) { foreach ($data['before'] as $beforeCode) { if (!isset($configArray[$beforeCode])) { continue; } $configArray[$code]['before'] = array_unique(array_merge( $configArray[$code]['before'], $configArray[$beforeCode]['before'] )); $configArray[$beforeCode]['after'] = array_merge( $configArray[$beforeCode]['after'], array($code), $data['after'] ); $configArray[$beforeCode]['after'] = array_unique($configArray[$beforeCode]['after']); } foreach ($data['after'] as $afterCode) { if (!isset($configArray[$afterCode])) { continue; } $configArray[$code]['after'] = array_unique(array_merge( $configArray[$code]['after'], $configArray[$afterCode]['after'] )); $configArray[$afterCode]['before'] = array_merge( $configArray[$afterCode]['before'], array($code), $data['before'] ); $configArray[$afterCode]['before'] = array_unique($configArray[$afterCode]['before']); } } foreach ($configArray as $code => $data) { $largest_small = $smallest_large = 0; foreach ($data['after'] as $afterCode) { if(isset($configArray[$afterCode]['sort_order']) && $largest_small < $configArray[$afterCode]['sort_order']) $largest_small = $configArray[$afterCode]['sort_order']; } foreach ($data['before'] as $beforeCode) { if(isset($configArray[$beforeCode]['sort_order']) && ($smallest_large == 0 || $configArray[$beforeCode]['sort_order'] < $smallest_large)) $smallest_large = $configArray[$beforeCode]['sort_order']; } if($smallest_large <= $largest_small+1){ $add = $largest_small+1-$largest_small; if($smallest_large == 0) $smallest_large = $largest_small+1; foreach ($configArray as $code1 => $data1) { if(!isset($data1['sort_order'])) break; if($smallest_large <= $data1['sort_order']) $configArray[$code1]['sort_order'] += $add; } } $configArray[$code]['sort_order'] = $largest_small+1; } uasort($configArray, array($this, '_compareSortOrder')); } $sortedCollectors = array_keys($configArray); if (Mage::app()->useCache('config')) { Mage::app()->saveCache(serialize($sortedCollectors), $this->_collectorsCacheKey, array( Mage_Core_Model_Config::CACHE_TAG ) ); } return $sortedCollectors; }
4. É só salvar e enviar. Se tiver com preguiça de fazer, só baixar o arquivo anexado ao tutorial.
Créditos ao site Stackexchange, eu apenas traduzi as instruções.