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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top