Instalado OSC Brasil 6.0 no Magento 1.9.4.2 e Valor Total no fechamento está errado, na verdade pode ser o tema usado que está carregando o grandTotal() mais de uma vez, se desligar o OSC o resultado fica correto, se tirar o tema e ativar o OSC o resultado fica correto, na verdade o pedido fica com valores certos é só a visualização que mostra errado, veja abaixo:
Você altera a forma de entrega e o ajax é acionado, mas ele não muda o frete, abaixo deveria ser valor ZERO, foi selecionado frete grátis mas na revisão ele NÃO mudou.
E o total continua muito errado. Olhando em “inspecionar elemento” percebemos ainda que temos um erro 500, veja abaixo:
Desligando o OSC 6.0 tudo se resolve, é um conflito com o tema instalado e como não consegui descobrir o problema e o OSC é muito útil eu fui seguir todo o código e achei uma diferença, na nova versão do Magento está um pouco diferente.
No fonte:
app/code/community/Inovarti/Onestepcheckout/Model/Updater.php
no método _initLayout (linha 87) vamos comentar //$update->addHandle(‘default’); (linha 90), veja abaixo:
protected function _initLayout($layout, $fullTargetActionName) { /* -- START-- copypaste from Mage_Core_Controller_Varien_Action -- START -- */ $update = $layout->getUpdate(); //$update->addHandle('default'); //load default handle $update->addHandle('STORE_' . Mage::app()->getStore()->getCode()); // load store handle $package = Mage::getSingleton('core/design_package');
Veja o comentário: a rotina foi copiada do core do Magento, então como estamos numa versão bem mais nova eu fui olhar e notei a diferença.
Depois desta alteração o fechamento ficou perfeito e não temos mais erros na console do navegador e ainda deve ficar mais rápido a renderização, pois o bloco que vai ser montado é apenas do OSC, não é mais todo o código html do site, porque não foi carregado o ‘default’.
Parte 2)
Mas ao chamar o fechamento a primeira vez ele monta errado o total, a carga do bloco e a renderização ainda tem problema, a solução acima é para as ações nos checkbox do fechamento, para resolver o total errado uma idéia é quando ele montar a tela dar um click de forma automática, para isto temos que mudar um pouco o fonte:
app/design/frontend/[seu_pacote]/[seu_tema]/template/onestepcheckout/onestep/form/shipping_method.php
colocamos estas 3 linhas
<div class=“refresh“ style=“display: none;”>
<input name=“shipping_method” type=“radio” value=“shipping_method” id=“refresh“ class=“radio”/>
</div>
após a linha 18
E uma rotina em javascript, para que na carga da página, acionar o checkbox e remontar a tela de fechamento. A rotina em javascrit é esta:
<script type="text/javascript"> (function($) { $(document).ready(function(){ var checado = ""; //vamos devolver o checked para o checado verdadeiro if($(":radio").is(":checked")){ $.each($("input[type='radio']"), function(id , val){ if($(val).is(":checked")){ //checado = $(val).val(); checado = $(val).attr('id'); return false; }; }); } document.getElementById("refresh").click(); if (checado) { //console.log('checked ='+checado); document.getElementById(checado).click(); } }); })(jQuery); </script>
<?php if ($this->canShip()) : ?> <?php $blockNumber = $this->getBlockNumber(); ?> <?php $blockNumberClass = (!is_null($blockNumber)) ? "onestepcheckout-number-{$blockNumber}" : ""; ?> <?php if(Mage::getStoreConfig('onestepcheckout/general/is_show_titles')): ?><div class="step-title"><span class="number onestepcheckout-number <?php echo $blockNumberClass; ?>"><?php echo $blockNumber; ?></span><h2><?php echo $this->__('SHIPPING METHOD'); ?></h2></div><?php endif; ?> <div class="step a-item"> <div id="onestepcheckout-shipping-method" class="onestepcheckout-add-loader-into-this-block"> <?php $_shippingRateGroups = $this->getShippingRates(); ?> <?php if (!$_shippingRateGroups) : ?> <p><?php echo $this->__('Sorry, no quotes are available for this order at this time.') ?></p> <?php else : ?> <div class="refresh" style="display: none;"> <input name="shipping_method" type="radio" value="shipping_method" id="refresh" class="radio"/> </div> <dl class="sp-methods"> <?php $_sole = count($_shippingRateGroups) == 1; foreach ($_shippingRateGroups as $code => $_rates): ?> <dt><?php echo $this->escapeHtml($this->getCarrierName($code)) ?></dt> <dd> <ul> <?php $_sole = $_sole && count($_rates) == 1; foreach ($_rates as $_rate): ?> <li> <?php if ($_rate->getErrorMessage()): ?> <ul class="messages"><li class="error-msg"><ul><li><?php echo $this->escapeHtml($_rate->getErrorMessage()) ?></li></ul></li></ul> <?php else: ?> <?php if ($_sole) : ?> <input name="shipping_method" type="radio" value="<?php echo $_rate->getCode() ?>" id="s_method_<?php echo $_rate->getCode() ?>" checked="checked" class="radio"/> <?php else: ?> <input name="shipping_method" type="radio" value="<?php echo $_rate->getCode() ?>" id="s_method_<?php echo $_rate->getCode() ?>"<?php if ($_rate->getCode() === $this->getAddressShippingMethod()) echo ' checked="checked"' ?> class="radio"/> <?php endif; ?> <label for="s_method_<?php echo $_rate->getCode() ?>"><?php echo $this->escapeHtml($_rate->getMethodTitle()) ?> <?php $_excl = $this->getShippingPrice($_rate->getPrice(), $this->helper('tax')->displayShippingPriceIncludingTax()); ?> <?php $_incl = $this->getShippingPrice($_rate->getPrice(), true); ?> <?php echo $_excl; ?> <?php if ($this->helper('tax')->displayShippingBothPrices() && $_incl != $_excl): ?> (<?php echo $this->__('Incl. Tax'); ?> <?php echo $_incl; ?>) <?php endif; ?> </label> <?php endif ?> </li> <?php endforeach; ?> </ul> </dd> <?php endforeach; ?> </dl> <div class="validation-advice" style="display: none;"></div> <script type="text/javascript"> var OSCShipment = new OnestepcheckoutShipment({ containerSelector: "#onestepcheckout-shipping-method", switchMethodInputsSelector: "input[type='radio'][name='shipping_method']", saveShipmentUrl: <?php echo Zend_Json::encode($this->getSaveShipmentUrl()); ?> }); </script> <script type="text/javascript"> (function($) { $(document).ready(function(){ var checado = ""; //vamos devolver o checked para o checado verdadeiro if($(":radio").is(":checked")){ $.each($("input[type='radio']"), function(id , val){ if($(val).is(":checked")){ checado = $(val).attr('id'); return false; }; }); } document.getElementById("refresh").click(); if (checado) { //console.log('checked ='+checado); document.getElementById(checado).click(); } }); })(jQuery); </script> <?php endif; ?> <?php echo $this->getChildHtml('extra'); ?> </div> </div> <?php endif; ?>
Desta forma, ao montar a tela inicialmente, o java script faz um reload e o total fica correto.
Espero ter ajudado!
Alfredo Letti