_initBlocks(); } /** * Initialize blocks names */ protected function _initBlocks() { $this->_stateBlockName = 'catalog/layer_state'; $this->_categoryBlockName = 'catalog/layer_filter_category'; $this->_attributeFilterBlockName = 'catalog/layer_filter_attribute'; $this->_priceFilterBlockName = 'catalog/layer_filter_price'; $this->_decimalFilterBlockName = 'catalog/layer_filter_decimal'; } /** * Retrieve loaded category collection * * @return Mage_Eav_Model_Entity_Collection_Abstract */ protected function _getProductCollection() { if (is_null($this->_productCollection)) { $layer = $this->getLayer(); $urlVar=$this->getRequest()->getParams(); if ( empty($urlVar['id']) ) { $urlVar['id'] = Mage::app()->getStore()->getRootCategoryId(); } $categoryId=$urlVar['id']; $category = Mage::getModel('catalog/category')->load($categoryId); $origCategory = null; if ($category->getId()) { $origCategory = $layer->getCurrentCategory(); $layer->setCurrentCategory($category); } $filterableAttributes = $layer->getFilterableAttributes(); foreach ($filterableAttributes as $attribute) { if ($attribute->getAttributeCode() == 'price') { $filterBlockName = $this->_priceFilterBlockName; } elseif ($attribute->getBackendType() == 'decimal') { $filterBlockName = $this->_decimalFilterBlockName; } else { $filterBlockName = $this->_attributeFilterBlockName; } $this->setChild($attribute->getAttributeCode() . '_filter', $this->getLayout()->createBlock($filterBlockName) ->setLayer($this->getLayer()) ->setAttributeModel($attribute) ->init()); } $layer->apply(); $this->_productCollection = $layer->getProductCollection(); $this->prepareSortableFieldsByCategory($layer->getCurrentCategory()); if ( isset($urlVar['min']) && isset($urlVar['max']) ) { $max = intval($urlVar['max']); $min = intval($urlVar['min']); $baseCurrencyCode = Mage::app()->getStore()->getBaseCurrencyCode(); $currentCurrencyCode = Mage::app()->getStore()->getCurrentCurrencyCode(); if ( $baseCurrencyCode != $currentCurrencyCode ) { $rate = Mage::helper('directory')->currencyConvert(1, $baseCurrencyCode, $currentCurrencyCode); $max = $max / $rate; $min = $min / $rate; } $this->_productCollection->getSelect()->where(" IF ( type_id = 'grouped', (min_price <= $max and min_price>=$min), (final_price <= $max and final_price>=$min) ) "); } if ($origCategory) { $layer->setCurrentCategory($origCategory); } } return $this->_productCollection; } /** * Get catalog layer model * * @return Mage_Catalog_Model_Layer */ public function getLayer() { $layer = Mage::registry('current_layer'); if ($layer) { return $layer; } return Mage::getSingleton('catalog/layer'); } /** * Retrieve loaded category collection * * @return Mage_Eav_Model_Entity_Collection_Abstract */ public function getLoadedProductCollection() { return $this->_getProductCollection(); } /** * Retrieve current view mode * * @return string */ public function getMode() { return $this->getChild('toolbar')->getCurrentMode(); } /** * Need use as _prepareLayout - but problem in declaring collection from * another block (was problem with search result) */ protected function _beforeToHtml() { $toolbar = $this->getToolbarBlock(); // called prepare sortable parameters $collection = $this->_getProductCollection(); // use sortable parameters if ($orders = $this->getAvailableOrders()) { $toolbar->setAvailableOrders($orders); } if ($sort = $this->getSortBy()) { $toolbar->setDefaultOrder($sort); } if ($dir = $this->getDefaultDirection()) { $toolbar->setDefaultDirection($dir); } if ($modes = $this->getModes()) { $toolbar->setModes($modes); } // set collection to toolbar and apply sort $toolbar->setCollection($collection); $this->setChild('toolbar', $toolbar); Mage::dispatchEvent('catalog_block_product_list_collection', array( 'collection' => $this->_getProductCollection() )); $this->_getProductCollection()->load(); return parent::_beforeToHtml(); } /** * Retrieve Toolbar block * * @return Mage_Catalog_Block_Product_List_Toolbar */ public function getToolbarBlock() { if ($blockName = $this->getToolbarBlockName()) { if ($block = $this->getLayout()->getBlock($blockName)) { return $block; } } $block = $this->getLayout()->createBlock($this->_defaultToolbarBlock, microtime()); return $block; } /** * Retrieve additional blocks html * * @return string */ public function getAdditionalHtml() { return $this->getChildHtml('additional'); } /** * Retrieve list toolbar HTML * * @return string */ public function getToolbarHtml() { return $this->getChildHtml('toolbar'); } public function setCollection($collection) { $this->_productCollection = $collection; return $this; } public function addAttribute($code) { $this->_getProductCollection()->addAttributeToSelect($code); return $this; } public function getPriceBlockTemplate() { return $this->_getData('price_block_template'); } /** * Retrieve Catalog Config object * * @return Mage_Catalog_Model_Config */ protected function _getConfig() { return Mage::getSingleton('catalog/config'); } /** * Prepare Sort By fields from Category Data * * @param Mage_Catalog_Model_Category $category * @return Mage_Catalog_Block_Product_List */ public function prepareSortableFieldsByCategory($category) { if (!$this->getAvailableOrders()) { $this->setAvailableOrders($category->getAvailableSortByOptions()); } $availableOrders = $this->getAvailableOrders(); if (!$this->getSortBy()) { if ($categorySortBy = $category->getDefaultSortBy()) { if (!$availableOrders) { $availableOrders = $this->_getConfig()->getAttributeUsedForSortByArray(); } if (isset($availableOrders[$categorySortBy])) { $this->setSortBy($categorySortBy); } } } return $this; } /** * Retrieve Add Product to Compare Products List URL * * @param Mage_Catalog_Model_Product $product * @return string */ public function getAddToCompareUrl($product) { $params = array( 'product' => $product->getId(), ); return Mage::getUrl('catalog/product_compare/add', $params); } }