Perhaps consider the following setup:
Applying normal discounts (20-30% off some products)
Either do this manually on each product or create a category called "Sale Items" and under that a subcategory for each discount bracket, e.g "20 percent", "30 percent", etc. You can then use catalog price rules on each of these categories to get the desired discounts.
Flash sales
Again, create a category for the flash sale and then create a catalog price rule discounting products in this category. You can set a "to" and "from" date on this price rule.
Showing sale products on the homepage
To show products that have a special price applied to them I usually create a new block called Namespace_Module_Block_Product_List_Special
(Special.php). It needs to extend Mage_Catalog_Block_Product_List
. You can then overwrite the _getProductCollection()
. Here's the whole block file:
<?php
class Namespace_Module_Block_Product_List_Special extends Mage_Catalog_Block_Product_List
{
//default item limit
protected $_defaultItemLimit = 4;
public function _construct() {
parent::_construct();
}
/**
* Retrieve product collection
*
* @return Mage_Eav_Model_Entity_Collection_Abstract
*/
protected function _getProductCollection()
{
$todayStartOfDayDate = Mage::app()->getLocale()->date()
->setTime('00:00:00')
->toString(Varien_Date::DATETIME_INTERNAL_FORMAT);
$todayEndOfDayDate = Mage::app()->getLocale()->date()
->setTime('23:59:59')
->toString(Varien_Date::DATETIME_INTERNAL_FORMAT);
$collection = Mage::getResourceModel('catalog/product_collection');
$collection->setVisibility(Mage::getSingleton('catalog/product_visibility')->getVisibleInCatalogIds());
$collection = $this->_addProductAttributesAndPrices($collection)
->addStoreFilter()
->addAttributeToFilter('special_from_date', array('date' => true, 'to' => $todayStartOfDayDate))
->addAttributeToFilter('special_to_date', array('or'=> array(
0 => array('date' => true, 'from' => $todayStartOfDayDate),
1 => array('is' => new Zend_Db_Expr('null')))
), 'left')
->addAttributeToSort('special_from_date', 'desc')
;
$itemLimit = $this->getItemLimit();
$collection->setPageSize($itemLimit);
return $collection;
}
public function getItemLimit() {
if($this->hasData('item_limit')) {
return $this->getData('item_limit');
}
return $this->_defaultItemLimit;
}
}
To use it you'll need to add this to your config.xml
under the <global>
tag:
<blocks>
<modulename>
<class>Namespace_Module_Block</class>
</modulename>
<catalog>
<rewrite>
<product_list_special>Namespace_Module_Block_Product_List_Special</product_list_special>
</rewrite>
</catalog>
</blocks>
And then display it on the homepage like so:
{{block type="catalog/product_list_special" name="homepage.products.special" template="catalog/product/list.phtml"}}
Or via layout XML:
<block type="catalog/product_list_special" name="hometabs.products.special" template="catalog/product/list.phtml"/>
You could use the same method to display the special products in each category, but that would require a change to the _getProductCollection()
method that checks for the current category. Have a look at Mage_Catalog_Block_Product_list::_getProductCollection()
for some ideas on the code to use for this.
Best Answer
I have not tried this, but I believe it's possible. I don't have the exact code, but I can provide you with it later when I have more free time if you really need it. This appraoch is pretty straightforward.
There's a table called
catalogrule_product
that storesCatalog Price Rules
discounts per product and customer group. Note that this table needs to get indexed every time you make changes to yourCatalog Price Rules
. You can do this with the indexer or by clicking "Apply Rules" on this page (this could take long if you have a lot of products).For a given product you have on a catalog (or any) page, get its
entity_id
and look it up oncatalogrule_product.product_id
. Make sure to checkcustomer_group_id
as well. Once you find the row(s) you're looking for, this row(s) will have have timestamps (in seconds)from_time
andto_time
for that given applied rule (rule_id
).Get its
row_id
and look this up oncatalogrule
if you need more information on the rule. The entry you find oncatalogrule
hasfrom_date
andto_date
, and those are all you need to calculate what you want.