/** * Add attribute to sort order * * @param string $attribute * @param string $dir * @return Mage_Catalog_Model_Resource_Product_Collection */ public function addAttributeToSort($attribute, $dir = self::SORT_ORDER_ASC) { if ($attribute == 'position') { if (isset($this->_joinFields[$attribute])) { $this->getSelect()->order($this->_getAttributeFieldName($attribute) . ' ' . $dir); return $this; } if ($this->isEnabledFlat()) { $this->getSelect()->order("cat_index_position {$dir}"); } // optimize if using cat index $filters = $this->_productLimitationFilters; if (isset($filters['category_id']) || isset($filters['visibility'])) { $this->getSelect()->order('cat_index.position ' . $dir); } else { $this->getSelect()->order('e.entity_id ' . $dir); } return $this; } elseif ($attribute == 'is_saleable') { $this->getSelect()->order("is_saleable " . $dir); return $this; } $storeId = $this->getStoreId(); if ($attribute == 'price' && $storeId != 0) { $this->addPriceData(); $this->getSelect()->order("price_index.min_price {$dir}"); return $this; } if ($this->isEnabledFlat()) { $column = $this->getEntity()->getAttributeSortColumn($attribute); if ($column) { $this->getSelect()->order("e.{$column} {$dir}"); } else { if (isset($this->_joinFields[$attribute])) { $this->getSelect()->order($this->_getAttributeFieldName($attribute) . ' ' . $dir); } } return $this; } else { $attrInstance = $this->getEntity()->getAttribute($attribute); if ($attrInstance && $attrInstance->usesSource()) { $attrInstance->getSource()->addValueSortToCollection($this, $dir); return $this; } } return parent::addAttributeToSort($attribute, $dir); }
/** * Add attribute to sort order * * @param string $attribute * @param string $dir * @return Mage_Catalog_Model_Resource_Product_Collection */ public function addAttributeToSort($attribute, $dir = self::SORT_ORDER_ASC) { if ($attribute == 'position') { if (isset($this->_joinFields[$attribute])) { $this->getSelect()->order($this->_getAttributeFieldName($attribute) . ' ' . $dir); return $this; } if ($this->isEnabledFlat()) { $this->getSelect()->order("cat_index_position {$dir}"); } // optimize if using cat index $filters = $this->_productLimitationFilters; if (isset($filters['category_id']) || isset($filters['visibility'])) { $this->getSelect()->order('cat_index.position ' . $dir); } else { $this->getSelect()->order('e.entity_id ' . $dir); } return $this; } elseif ($attribute == 'is_saleable') { $this->getSelect()->order("is_saleable " . $dir); return $this; } $storeId = $this->getStoreId(); if ($attribute == 'price' && $storeId != 0) { $this->getSelect()->joinLeft(array('_inventory_table' => $this->getTable('cataloginventory/stock_item')), "_inventory_table.product_id = e.entity_id", array('is_in_stock', 'manage_stock')); $this->addExpressionAttributeToSelect('on_top', '(CASE WHEN (((_inventory_table.use_config_manage_stock = 1) AND (_inventory_table.is_in_stock = 1)) OR ((_inventory_table.use_config_manage_stock = 0) AND (1 - _inventory_table.manage_stock + _inventory_table.is_in_stock >= 1))) THEN 1 ELSE 0 END)', array()); $this->getSelect()->order('on_top DESC'); $this->addPriceData(); $this->getSelect()->order("price_index.min_price {$dir}"); return $this; } if ($this->isEnabledFlat()) { $column = $this->getEntity()->getAttributeSortColumn($attribute); if ($column) { $this->getSelect()->order("e.{$column} {$dir}"); } else { if (isset($this->_joinFields[$attribute])) { $this->getSelect()->order($this->_getAttributeFieldName($attribute) . ' ' . $dir); } } return $this; } else { $attrInstance = $this->getEntity()->getAttribute($attribute); if ($attrInstance && $attrInstance->usesSource()) { $attrInstance->getSource()->addValueSortToCollection($this, $dir); return $this; } } return parent::addAttributeToSort($attribute, $dir); }