cancel
Showing results for 
Search instead for 
Did you mean: 

Magento Creating a Sale Page that Lists all items with Sale Price

Magento Creating a Sale Page that Lists all items with Sale Price

I need to display all products on sale on a single catagory page.. rather than people going through the whole catalog &adding products manually to made Sale Catagories - I want a function that will pick out "Special Price" products & display them in my catagory..

 

I found this excellent article online  // It covers what I need to do // But when actioned it does not work with layered navigation.. If I filter by price nothing happens...

 

This is where its working on our website

 

The problem is it doesnt show products by "Sort By" options.. How can I use this code but still be able to use the sort toolbar?..

Many thanks for any help..

////////////////////////////// Here is the code in my Catogory - Custom Design //////////////////////////////
This code pulls the PHP function into the Catagory / Custom Design Tab

<reference name="content">
<remove name="product_list"/>
<block type="catalog/product_sale" name="product_sale" alias="sale" template="catalog/product/list.phtml">
<block type="catalog/product_list_toolbar" name="product_list_toolbar" template="catalog/product/list/toolbar.phtml">
<block type="page/html_pager" name="product_list_toolbar_pager"/>
</block>
<action method="setLimit"><limit>32</limit></action>
<action method="setColumnCount"><columns>3</columns></action>
<action method="setToolbarBlockName"><name>product_list_toolbar</name></action>
<action method="addPriceBlockType">
<type>bundle</type>
<block>bundle/catalog_product_price</block>
<template>bundle/catalog/product/price.phtml</template>
</action>
</block>
</reference>
<reference name="product_list_toolbar">
<action method="setDefaultGridPerPage">
<limit>32</limit>
</action>
</reference>

 

///////////////////////////////////////// Here is the main PHP function /////////////////////////////////////////

class Mage_Catalog_Block_Product_Sale extends Mage_Catalog_Block_Product_List
{
    
    //public $_collection;  
    
    public function getProductsLimit() 
    { 
        if ($this->getData('limit')) {
            return intval($this->getData('limit'));
        } else {
            return 32;
        }
    }
	
	public function __construct()
    {
        parent::__construct();
        $collection = $this->_getProductCollection();
        $this->setCollection($collection);
    }


     protected function _getProductCollection()  
     {  
                $page = Mage::getBlockSingleton('page/html_pager')->getCurrentPage();
				date_default_timezone_set(Mage::getStoreConfig('general/locale/timezone'));
				$todayDate = strftime("%Y-%m-%d",Mage::app()->getLocale()->storeTimeStamp(Mage::app()->getStore()->getId()));
				$storeId    = Mage::app()->getStore()->getId();  
                $product    = Mage::getModel('catalog/product');  
                              
                $this->_productCollection = $product->setStoreId($storeId)  
                    ->getCollection()  
                    ->addAttributeToSelect(array('name','status', 'price', 'special_price', 'small_image','required_options','special_from_date', 'special_to_date'), 'inner')
					->joinField('stock_status','cataloginventory/stock_status','stock_status',
						'product_id=entity_id', array(
						  'stock_status' => Mage_CatalogInventory_Model_Stock_Status::STATUS_IN_STOCK,
						  'website_id' => Mage::app()->getWebsite()->getWebsiteId(),
						))
					->addAttributeToFilter('special_price', array('gt' => 0), 'left')
					->addAttributeToFilter('special_from_date', array('date' => true, 'to' => $todayDate))
					->addAttributeToFilter('special_to_date', array('or'=> array(
						0 => array('date' => true, 'from' => $todayDate),
						1 => array('is' => new Zend_Db_Expr('null')))
					), 'left')
					//->setOrder('created_at', 'desc')
					->addAttributeToSort('created_at', 'desc')
					->addFinalPrice()
					->addStoreFilter()
                    ->setPageSize($this->getProductsLimit())
					->setCurPage($page)
					->addAttributeToFilter('status', 1)
					->addUrlRewrite();
					
			Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($this->_productCollection);	
			Mage::getSingleton('catalog/product_visibility')->addVisibleInSearchFilterToCollection($this->_productCollection);
            
                               
                $checkedProducts = new Varien_Data_Collection();
                    foreach ($this->_productCollection as $k => $p) {
                        $p = $p->loadParentProductIds();
                        $parentIds = $p->getData('parent_product_ids');

                        if (is_array($parentIds) && !empty($parentIds)) {
                            if (!$checkedProducts->getItemById($parentIds[0])) {
                                $parentProduct = Mage::getModel('catalog/product')->setStoreId($storeId)->load($parentIds[0]);
                                if ($parentProduct->isVisibleInCatalog()) {
                                    $checkedProducts->addItem($parentProduct);
                                }
                            }
                        } else {
                            if (!$checkedProducts->getItemById($k)) {
                                $checkedProducts->addItem($p);
                            }
                        }
                        if (count($checkedProducts) >= $this->getProductsLimit()) {
                            break;
                        }
                    }
  return $this->_productCollection;  
    
     }  
} 

I have been told - The problem is related to not including layered navigation in the logic. You have overridden the _getProductCollection() method and instantiated your collection directly, rather than how it normally gets injected from Mage_Catalog_Model_Layer.     But how do I reincorporate that feature back into my new method.  ???

thank you for any ideas Smiley Happy
Dan

1 REPLY 1

Re: Magento Creating a Sale Page that Lists all items with Sale Price

RIght, it is becuase you don't use layered navigation.

To learn how to use layer navigation, you can check the catalogsearch_result_index controller and its blocks.