_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(); $categoryId = (int) $this->getRequest()->getParam('cat', false); $origCategory = null; if ($categoryId) { $category = Mage::getModel('catalog/category')->load($categoryId); 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()); $min = (int) $this->getRequest()->getParam('min', 0); $max = (int) $this->getRequest()->getParam('max', 999999); $select = $layer->getProductCollection()->getSelect(); $priceExpr = $this->_getPriceExpression($select, false); $layer->getProductCollection() ->getSelect() ->where($priceExpr . ' >= ' . $this->_getComparingValue($min)) ->where($priceExpr . ' < ' . $this->_getComparingValue($max)); if ($origCategory) { $layer->setCurrentCategory($origCategory); } } return $this->_productCollection; } /** * Price expression generated by products collection * * @param Varien_Db_Select $select * @param bool $replaceAlias * @return string */ protected function _getPriceExpression($select, $replaceAlias = true) { $priceExpression = $this->getLayer()->getProductCollection()->getPriceExpression($select); $additionalPriceExpression = $this->getLayer()->getProductCollection()->getAdditionalPriceExpression($select); $result = empty($additionalPriceExpression) ? $priceExpression : "({$priceExpression} {$additionalPriceExpression})"; if ($replaceAlias) { $result = $this->_replaceTableAlias($result); } return $result; } /** * Get comparing value sql part * * @param float $price * @param bool $decrease * @return float */ protected function _getComparingValue($price, $decrease = true) { $currencyRate = $this->getLayer()->getProductCollection()->getCurrencyRate(); if ($decrease) { return ($price - (self::MIN_POSSIBLE_PRICE / 2)) / $currencyRate; } return ($price + (self::MIN_POSSIBLE_PRICE / 2)) / $currencyRate; } /** * 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); } }