There is no (easy) way to do this dynamically from the CMS page content editor. I'm afraid this will require some custom code.
Best course of action would be to create a new extensions, let's call it Acme_Categorygrid for this example. For more info about creating extensions please view this comment by chapagain
In your etc/config.xml file add the following code
<config>
[...]
<global>
[...]
<blocks>
<categorygrid>
<class>Acme_Categorygrid_Block</class>
</categorygrid>
</blocks>
[...]
</global>
[...]
</config>
Then create a new Block class with the following code
class Acme_Categorygrid_Block_Grid extends Mage_Core_Block_Template
{
public function categories()
{
$parent_id = 1;
$children = Mage::getModel('catalog/category')->getCategories($parent_id);
return $children;
}
}
Now all we need is a template file
<?php
$categories = $this->categories();
?>
<ul class="category-grid">
<?php foreach ($categories as $category): ?>
<li>
<a href="<?php echo $category->getUrl();?>">
<img src="<?php echo $category->getThumbnail();?>" alt="<?php echo $category->getName();?>"/>
</a>
</li>
<?php endforeach; ?>
</ul>
Now you can add in the content of the CMS page a block tag: {{block type='categorygrid/grid' template='categorygrid/grid.phtml'}}
This should now display the just created block. Mind you, I haven't tested the code so it might need some tweaking, especially in the template file but hopefully this'll help you a long way.
You need to create your own block, or at least one template.
Here is the short version using only a template.
Create the file app/design/frontend/base/default/template/homepage/categories.phtml
with this content:
<?php
$rootId = Mage::app()->getStore()->getRootCategoryId();
$categories = Mage::getModel('catalog/category')->getCollection()
->addAttributeToSelect('*')
->addAttributeToFilter('parent_id', $rootId)
->setOrder('position')
->addAttributeToFilter('include_in_menu', 1) //this is needed if you want only the categories in the menu
->addAttributeToFilter('is_active', 1);
$_helper = $this->helper('catalog/output');
?>
<?php if ($categories->count() > 0) : ?>
<ul>
<?php foreach ($categories as $category) : ?>
<li>
<div class="name">
<a href="<?php echo $category->getUrl()?>" title="<?php echo $this->escapeHtml($category->getName())?>"><?php echo $category->getName()?></a>
</div>
<div class="image">
<?php if ($category->getImageUrl()) :?>
<img src="<?php echo $category->getImageUrl()?>" alt="<?php echo $this->escapeHtml($category->getName())?>" />
<?php endif;?>
</div>
<div class="description">
<?php echo $_helper->categoryAttribute($category, $category->getDescription(), 'description') ?>
</div>
</li>
<?php endforeach;?>
</ul>
<?php endif;?>
Now you need to add this to the homepage content:
{{block type="core/template" template="homepage/categories.phtml"}}
The markup of the template may need some modifications in order to make it a slider, but all the elements you need are there.
There is a cleaner method where you create you own block and move the code that retrieves the categories to a block method and call that method in the template. But the idea is the same.
I haven't tested the code so be careful at syntax errors.
Best Answer
Block :
Controller :
Frontend Layout :
Template : (Here you have collection of all categories)
And the main thing is, To override cms_index_index (add sequence in etc/module.xml):