1 create an observer in the catalog_block_product_list_collection event
<events> <catalog_block_product_list_collection> <observers> <namespace_module> <class> namespace_module/observer</class> <method>collectionList</method> </namespace_module > </observers> </catalog_block_product_list_collection> </events>
2 create class Namespace_Module_Model_Observer
class Namespace_Module_Model_Observer { public function collectionList($observer) { $currentCategory = Mage::registry('current_category'); $children = Mage::getResourceModel('catalog/category')->getChildrenIds($currentCategory); if (!$children) { return $this; } $children = implode(',', $children); $collection = $observer->getCollection(); $attr = $this->_getAttribute('name'); $collection->getSelect() ->join( array('c' => $this->_getResource()->getTableName('catalog_category_product')), "c.product_id = e.entity_id AND c.category_id IN ($children)", array('child_category_id' => 'category_id') ) ->join( array('ac' => $this->_getResource()->getTableName('catalog_category_entity_' . $attr['backend_type'])), "c.category_id = ac.entity_id AND ac.attribute_id = {$attr['attribute_id']}", array('child_category_name' => 'value') ) ->order('child_category_name DESC'); return $this; } protected function _getAttribute($attributeCode, $static = true, $entityTypeId = 3) { $readAdapter = $this->_getReadAdapter(); $select = $readAdapter->select() ->from($this->_getResource()->getTableName('eav/attribute')) ->reset(Zend_Db_Select::COLUMNS) ->columns(array('attribute_id', 'backend_type')) ->where('entity_type_id = ?', $entityTypeId) ->where('attribute_code = ?', $attributeCode) ->limit(1); if (!$static) { $select->where('backend_type != ?', 'static'); } $entityId = $readAdapter->query($select)->fetch(); return $entityId; } protected function _getResource() { return Mage::getSingleton('core/resource'); } protected function _getReadAdapter() { return $this->_getResource()->getConnection('core_read'); } }
here we set the sorting by the name of the child category, you can change it to the category identifier or add an attribute of any category to the collection and sort by this attribute
->order('child_category_name DESC');
this is just an example of how to quickly sort a collection of products by child categories, of course, you can add a dynamic contribution to the toolbar and sort the collection
Denis
source share