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
Dan
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.