Question

J'ai créé un propre attribut de produit "Hauteur" dans Magento-Backend. Le type d'entrée est "Texte" (car il n'y avait pas de type similaire comme "flotteur"). Pour utiliser cet attribut sous forme de filtre, j'ai écrit une petite extension. Dans cette extension, je filtre les produits avec

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

Lorsqu'une hauteur de produits est de 69 cm (69,00) et que le filtre est "<= 80cm" (LTEQ 80.00) Le filtre fonctionne bien. Mais cela ne fonctionne pas lorsque le filtre est "<= 100cm" (LTEQ 100.00). En effet, Magento a créé l'attribut hauteur comme Varchar et donc la fonction addattributetofilter fait une chaîne-comparaison. Dans String-Comparer "69" est supérieur à "100" car "6" est supérieur à "1".

existe-t-il un moyen de dire AddattributeTofilter qu'il doit comparer les valeurs comme des chiffres au lieu de chaînes?

(Je sais que le meilleur moyen serait de supprimer l'attribut et de créer une nouvelle avec le type "flotteur" via une extension. Mais le magasin est presque terminé et contient déjà des produits, donc je voudrais éviter de faire de tels "gros" changements dans cet état.)

Était-ce utile?

La solution

Le commentaire de Pratek avec le TextPart

Ça va être une comparaison mysql non PHP

m'a guidé vers une solution sans changer le type de champ.J'ai changé mon code pour mage_catalog_block_product_list dans la fonction _getProductCollection dans:

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

Bien sûr, je n'ai pas changé le code dans le noyau.J'ai écrasé la fonction dans mon extension.En raison de la typographie, les valeurs sont comparées au lieu de cordes. Ce n'est pas la solution la plus propre mais ok pour moi pour le moment.

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top