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.
Bundled products can be created with a fixed price, after that the special price can be a percentage of that. Using the fixed price will ignore any price changes in the simple products under it.
Grouped products do not offer an option like that. But you can use Promotions > Catalog Price Rules
. In the conditions tab you can specify the SKU of the product you wish to apply the rule to. After that you can set the promotional price and you're done.
Small side note: having a lot of promotional rules will slow the frontend of your shop down so use them wisely
Best Answer
The best way I can think of doing this is via an SQL statement
SELECT cpeid1.entity_id, cpeid1.value as price, cpeid2.value as special_price FROM catalog_product_entity_decimal cpeid1 LEFT JOIN catalog_product_entity_decimal cpeid2 ON (cpeid1.entity_id = cpeid2.entity_id AND cpeid2.attribute_id = 76) WHERE cpeid1.attribute_id = 75 AND cpeid2.value IS NOT NULL ;
Where 75 = price attribute id and 76 = special_price attribute id (from the eav_attribute table)