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.)

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a magento.stackexchange
scroll top