Magento 1.9 addtributetofilter: confronta come numeri invece di stringhe
-
13-12-2019 - |
Domanda
Ho creato un "altezza" attributo del prodotto in Magento-Backend. Il tipo di input è "testo" (perché non c'era tipo simile come "float"). Per utilizzare questo attributo come filtro ho scritto una piccola estensione. In questa estensione mi filtrare i prodotti con
$this->_productCollection->addAttributeToFilter('height', array('lteq' => $height) );
.
Quando un'altezza dei prodotti è 69 cm (69,00) e il filtro è "<= 80cm" (LTEQ 80.00) Il filtro funziona bene. Ma non funziona quando il filtro è "<= 100cm" (LTEQ 100.00). Questo perché Magento ha creato l'attributo in altezza come Varchar e quindi la funzione AddatTribiTetoFilter effettua una stringa. In String-Confronta "69" è maggiore di "100" perché "6" è maggiore di "1".
C'è un modo per raccontare AddattributetOfilter che dovrebbe confrontare i valori come numeri invece di stringhe?
(So che il modo migliore sarebbe quello di eliminare l'attributo e crearne uno nuovo con il tipo "galleggiante" tramite estensione. Ma il negozio è quasi finito e contiene già prodotti quindi vorrei evitare di fare tali modifiche "grandi" in questo stato.)
Soluzione
Il commento di Prateek con TestPart
.Sarà un confronto mysql non php
mi ha guidato a una soluzione senza cambiare il tipo di campo.Ho cambiato il mio codice per mage_catalog_block_product_list in funzione _getproductcollection in:
...
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
));
}
}
...
.
Certo che non ho cambiato il codice nel nucleo.Ho sovrascritto la funzione nella mia estensione.A causa del typecast i valori sono confrontati come numeri invece di stringhe. Non è la soluzione più pulita ma ok per me al momento.