Вопрос

Я создал собственный атрибут продукта «высота» в Magento-Backend. Тип ввода - «Текст» (потому что не было никакого аналогичного типа, как «Float»). Чтобы использовать этот атрибут в виде фильтра, который я написал небольшое расширение. В этом расширении я фильтрую продукты с

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

Когда высота продуктов составляет 69см (69,00), а фильтр «<= 80см» (LTEQ 80,00), фильтр работает нормально. Но это не работает, когда фильтр «<= 100см» (LTEQ 100,00). Это потому, что Magento создал атрибут высоты как Varchar, и поэтому функция AddattributeToFilter производит строку. В строковом сравнении «69» больше, чем «100», потому что «6» больше, чем «1».

Есть ли способ сказать AddatttributeToFilter, что он должен сравнивать значения как цифры вместо строк?

(Я знаю, что лучше всего удалить атрибут и создать новый с типом «Float» через расширение. Но магазин почти закончен и уже содержит продукты, поэтому я хотел бы избежать таких «больших» изменений в этом состоянии.)

Это было полезно?

Решение

Комментарий Prateek с TextPart

Это будет сравнение MySQL, а не PHP

направлял меня к решению, не изменяя тип поля.Я изменил свой код для mage_catalog_block_product_list в функции _getproductcollection в:

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

Конечно, я не изменил код в ядре.Я перезаписал функцию в моем расширении.Из-за типовой обработки ценности сравниваются как цифры вместо строк. Это не самое чистое решение, но в данный момент в порядке.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top