One Step Checkout Brasil 6.0 erra no total na tela de fechamento

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

Magento não finaliza compra - Não avança no pagamento

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *