Pregunta

He creado un atributo propio "altura" en Magento-Backend. El tipo de entrada es "Texto" (porque no había un tipo similar como "flotando"). Para usar este atributo como un filtro escribo una pequeña extensión. En esta extensión filtro los productos con

$this->_productCollection->addAttributeToFilter('height', array('lteq' => $height) );

Cuando una altura de productos es de 69 cm (69.00) y el filtro es "<= 80cm" (LTEQ 80.00), el filtro funciona bien. Pero no funciona cuando el filtro es "<= 100cm" (LTEQ 100.00). Esto se debe a que Magento creó el atributo de altura como VarChar y, por lo tanto, la función AddatTribuTetofilter hace una cadena de comparación. En la cadena, comparar "69" es mayor que "100" porque "6" es mayor que "1".

¿Hay alguna manera de decirle a AddatTribuTeToFilter que debe comparar los valores como números en lugar de cadenas?

(Sé que la mejor manera sería eliminar el atributo y crear una nueva con tipo "flotando" a través de la extensión. Pero la tienda está casi terminada y ya contiene productos, por lo que me gustaría evitar realizar cambios tan "grandes". en este estado.)

¿Fue útil?

Solución

El comentario de Prateek con el TEXTPART

Va a ser una comparación de MySQL no PHP

Me guió a una solución sin cambiar el tipo de campo.He cambiado mi código para mage_catalog_block_product_list en la función _getproductcollection en:

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

Por supuesto, no cambié el código en el núcleo.He sobrescrito la función en mi extensión.Debido a la tipografía, los valores se comparan como números en lugar de cadenas. No es la solución más limpia, pero está bien para mí en este momento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top