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

 

Maybe someone will need it, so here we go with code:

echo "<pre>";
$category = Mage::getModel('catalog/category');
$tree = $category->getTreeModel();
$tree->load();

$ids = $tree->getCollection()->getAllIds();
$categories = array();
if ($ids)
{
    foreach ($ids as $id)
    {
        $category->load($id);
        $categories[$id]['name'] = $category->getName();
        $categories[$id]['path'] = $category->getPath();
    }
    foreach ($ids as $id)
    {
        $path = explode('/', $categories[$id]['path']);
        $string = '';
        foreach ($path as $pathId)
        {
            $string.= $categories[$pathId]['name'] . ' > ';
            $cnt++;
        }
        $string.= ';' . $id . "\n";

        echo $string;
    }
}

 

the snippet above will give you such output:

root category 1 ; 1
root category 1 > subcategory 1 ; 2
root category 1 > subcategory 1 > subsubcategory 1 ; 3
root category 1 > subcategory 1 > subsubcategory 2 ; 4
root category 1 > subcategory 2 ; 5
root category 1 > subcategory 2 > subsubcategory 1 ; 6