Magento 1.9 AddatttributeToFilter: сравните как цифры вместо строк
-
13-12-2019 - |
Вопрос
Я создал собственный атрибут продукта «высота» в 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».
(Я знаю, что лучше всего удалить атрибут и создать новый с типом «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
));
}
}
...
.
Конечно, я не изменил код в ядре.Я перезаписал функцию в моем расширении.Из-за типовой обработки ценности сравниваются как цифры вместо строк. Это не самое чистое решение, но в данный момент в порядке.