- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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
Dan
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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.