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