Today I had to change Magento default products list sorting to sort by product’s date. In fact we don’t need to sort by date, just by entity_id which is product ID in Magento world. To accomplish this, we need to edit /app/code/core/Mage/Catalog/Block/Product/List.php
You have to find _beforeToHtml() function and change some things inside. First we need to define all available sorting options:
$orders = array('entity_id' => $this->__('Newest'), 'name' => $this->__('Name'), 'price' => $this->__('Price') );
then remove all getters of default sorting and order, and put those:
$toolbar->setAvailableOrders($orders); $toolbar->setDefaultOrder('entity_id'); $toolbar->setDefaultDirection('desc');
so finally your _beforeToHtml() should looks like this one:
protected function _beforeToHtml() { $toolbar = $this->getToolbarBlock(); // called prepare sortable parameters $collection = $this->_getProductCollection(); // use sortable parameters $orders = array('entity_id' => $this->__('Newest'), 'name' => $this->__('Name'), 'price' => $this->__('Price') ); $toolbar->setAvailableOrders($orders); $toolbar->setDefaultOrder('entity_id'); $toolbar->setDefaultDirection('desc'); if ($modes = $this->getModes()) { $toolbar->setModes($modes); } // set collection to tollbar and apply sort $toolbar->setCollection($collection); $this->setChild('toolbar', $toolbar); Mage::dispatchEvent('catalog_block_product_list_collection', array( 'collection'=>$this->_getProductCollection(), )); $this->_getProductCollection()->load(); Mage::getModel('review/review')->appendSummary($this->_getProductCollection()); return parent::_beforeToHtml(); }
Perfect! Thanks a lot. But too bad we had to edit core files.
can i provide date option in front end to user to sort the products by date in both asc and desc order.
Would this be the same scenario to sort by gender
This is great. Works perfectly! Thanks
to add DATE sort option at front end , use following file / code ( I strongly recommend to use LOCAL folder for these changes
// app/code/core/Mage/Catalog/Model/Config.php
public function getAttributeUsedForSortByArray()
{
$options = array(
‘position’ => Mage::helper(‘catalog’)->__(‘Position’),
// HERE IS OUR NEW OPTION
‘created_at’ => Mage::helper(‘catalog’)->__(‘Date’)
);
foreach ($this->getAttributesUsedForSortBy() as $attribute) {
/* @var $attribute Mage_Eav_Model_Entity_Attribute_Abstract */
$options[$attribute->getAttributeCode()] = $attribute->getStoreLabel();
}
return $options;
}
and to set DATE as default sorting option, add some sorting code at the end of its _getProductCollection() method:
// sort by created_at date or entity_id
if(!isset($_GET[‘order’])) {
$this->_productCollection->getSelect()->reset( Zend_Db_Select::ORDER );
$this->_productCollection->getSelect()->order(‘e.entity_id desc’);
}
return $this->_productCollection;
You can use either ‘e.entity_id desc’ or ‘e.created_at desc’ to sort.
This is a great post. works for me..
I have developed a script as well i.e Magento Products sorting. How do you rate this one?
Hi,
i am very impressed to follow your blog but i want to know that how can we know that Product sorting is working properly .if possible to reply me