Magento 1.9 addAttributeToFilter:compare como números em vez de strings
-
13-12-2019 - |
Pergunta
Eu criei um próprio atributo de produto "altura" no backend magento.O tipo de entrada é "texto" (porque não existia um tipo semelhante como "float").Para usar este atributo como filtro, escrevi uma pequena extensão.Nesta extensão eu filtro os produtos com
$this->_productCollection->addAttributeToFilter('height', array('lteq' => $height) );
Quando a altura do produto é 69cm (69,00) e o filtro é "<=80cm" (lteq 80,00) o filtro funciona bem.Mas não funciona quando o filtro é "<=100cm" (lteq 100,00).Isso ocorre porque o magento criou o atributo de altura como varchar e então a função addAttributeToFilter faz uma comparação de strings.Na comparação de strings, "69" é maior que "100" porque "6" é maior que "1".
Existe uma maneira de dizer ao addAttributeToFilter que ele deve comparar os valores como números em vez de strings?
(Sei que a melhor forma seria deletar o atributo e criar um novo com tipo "float" via extensão.Mas a loja está quase pronta e já contém produtos, então eu gostaria de evitar fazer mudanças tão “grandes” nesse estado.)
Solução
O comentário de Prateek com a parte do texto
será uma comparação mySql e não PHP
me guiou para uma solução sem alterar o tipo de campo.Eu mudei meu código para Mage_Catalog_Block_Product_List em função _getProductCollection em:
...
if(isset($_GET['height']) && ''!=trim($_GET['height'])){
// this line adds the attribute "height" to the query (without this line we couln't use the field in our own constraint)
$this->_productCollection->addAttributeToFilter('height', array('gteq' => 0) );
// we are in search (in search there is an additional height-table with the name at_height_default)
if(false!==strpos($this->_productCollection->getSelect(), 'at_height_default')){
$this->_productCollection->getSelect()->where(new Zend_Db_Expr(
"CAST(IF(at_height.value_id > 0, at_height.value, at_height_default.value) AS DECIMAL(9,2)) <= ".(float) $height
));
}
// we are in normal list-view (here the height-table has the name at_height)
else{
$this->_productCollection->getSelect()->where(new Zend_Db_Expr(
"CAST(at_height.value AS DECIMAL(9,2)) <= ".(float) $height
));
}
}
...
Claro que não mudei o código no núcleo.Substituí a função na minha extensão.Por causa do typecast, os valores são comparados como números em vez de strings.Não é a solução mais limpa, mas tudo bem para mim no momento.