Encode uri de forma errada

No Magento, quando acentuamos na busca (por exemplo digitamos mão) e no grid de resultados queremos mudar a classificação, por exemplo, para exibir por NOME e no navegador aparece m%25C3%25A3o,

em vez de, m%C3%A3o que é a palavra “mão”,  não vamos ter resultados desta busca. Note que no inspecionar elemento, ele aparece correto, m%C3%A3o, mas ao subir para a o BOX do navegador fica com um 25 na frente.


Este erro foi causado pois “alguém” alterou a codificação de mão, de forma errada, mais abaixo mostramos “quem” alterou…
Encontramos este problema num tema instalado do Magento 1.9.3.8 quando desligamos um sub-módulo ajax, ele deu este “defeito” colateral e a solução mais rápida e prática, sem alterar CORE do Magento, foi alterar um .phtml que renderiza o grid de produtos encontrados, para que ele coloque a palavra acentuada como UTF8, aí, quando escolhemos a classificação desejada, o Magento vai fazer a busca e trazer os produtos.

O .pthml que faz isto é o toolbar.phtml que fica em:

app/design/frontend/base/default/template/catalog/product/list

ou no seu tema, que pode ser:

app/design/frontend/default/ma_sahara_furniture4/template/catalog/product/list

ou
app/design/frontend/”nome tema”/”tema”/template/catalog/product/list

Colocamos a função do PHP rawurldecode() para voltar a colocar o acento em utf8, assim o setLocation, não vai ter o % para alterar para %25 (na tabela ASCII, 25 hexadecimal é o %).  Procure no seu código um trecho parecido, mas sem a rawurldecode(). (O número da linha abaixo não server de referência)

<div class="sort-by hidden-xs">
    <label><?php echo $this->__('Sort By') ?></label>
    <select onchange="setLocation(this.value)">
        <?php foreach($this->getAvailableOrders() as $_key=>$_order): ?>
            <option value="<?php echo rawurldecode($this->getOrderUrl($_key, 'asc')) ?>"<?php if($this->isOrderCurrent($_key)): ?> selected="selected"<?php endif; ?>>
                <?php echo $this->__($_order) ?>
            </option>
        <?php endforeach; ?>
    </select>

Um pouco mais abaixo, no mesmo fonte, colocamos o rawurldecode:

<div class="limiter hidden-xs">
    <label><?php echo $this->__('Show') ?></label>
    <select onchange="setLocation(this.value)">
    <?php foreach ($this->getAvailableLimit() as  $_key=>$_limit): ?>
        <option value="<?php echo rawurldecode($this->getLimitUrl($_key)) ?>"<?php if($this->isLimitCurrent($_key)): ?> selected="selected"<?php endif ?>>
            <?php echo $_limit ?>
        </option>
    <?php endforeach; ?>
    </select> <?php echo $this->__('per page') ?>
</div>

 

O problema é que da versão 1.9.3.0 para frente, a rotina javascript setLocation, que fica em: js/varien/js.js
foi alterada, antes ela estava assim:

function setLocation(url){
    window.location.href = url;
}

agora ela esta assim:

function setLocation(url){
    window.location.href = encodeURI(url);
}

Este encodeURI (https://www.w3schools.com/jsref/jsref_encodeURI.asp) ao encontrar o %C3%A3 muda o % para %25, daí o erro, resultando a string %25C3%25A3, que não tem representação, não é a letra “a” com til.

Não consegui verificar todos os fontes envolvidos e o impacto que traria na alteração da função setLocation, tirando o encodeURI e deixando ela como as versões anteriores, portanto NÃO recomento fazer.

Espero ter ajudado,

Alfredo Letti

Por que caracteres especiais em termos de busca são processados como caracteres codificados
OneStepCheckout Responsivo

Deixe um comentário

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