/**
  * Add attribute to sort order
  *
  * @param string $attribute
  * @param string $dir
  * @return Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection
  */
 public function addAttributeToSort($attribute, $dir = 'asc')
 {
     if ($attribute == 'position') {
         if (isset($this->_joinFields[$attribute])) {
             $this->getSelect()->order("{$attribute} {$dir}");
             return $this;
         }
         $this->getSelect()->order("cat_index_position {$dir}");
         // optimize if using cat index
         $filters = $this->_productLimitationFilters;
         if (isset($filters['category_id']) || isset($filters['visibility'])) {
             $this->getSelect()->order('cat_index.product_id ' . $dir);
         } else {
             $this->getSelect()->order('e.entity_id ' . $dir);
         }
         return $this;
     }
     $storeId = Mage::app()->getStore()->getId();
     if ($attribute == 'price' && $storeId != 0) {
         $this->addPriceData();
         $this->getSelect()->order("price_index.min_price {$dir}");
         return $this;
     }
     if ($attribute == 'is_saleable') {
         $this->getSelect()->order("is_saleable " . $dir);
         return $this;
     }
     if ($this->isEnabledFlat()) {
         $column = $this->getEntity()->getAttributeSortColumn($attribute);
         if ($column) {
             $this->getSelect()->order("e.{$column} {$dir}");
         } else {
             if (isset($this->_joinFields[$attribute])) {
                 $this->getSelect()->order($this->_getAttributeFieldName($attribute) . ' ' . $dir);
             }
         }
         return $this;
     } else {
         $attrInstance = $this->getEntity()->getAttribute($attribute);
         if ($attrInstance && $attrInstance->usesSource()) {
             $attrInstance->getSource()->addValueSortToCollection($this, $dir);
             return $this;
         }
     }
     return parent::addAttributeToSort($attribute, $dir);
 }
Пример #2
0
 /**
  * Load collection
  *
  * @param bool $printQuery
  * @param bool $logQuery
  * @return Mage_Catalog_Model_Resource_Eav_Mysql4_Category_Collection
  */
 public function load($printQuery = false, $logQuery = false)
 {
     if ($this->isLoaded()) {
         return $this;
     }
     if ($this->_loadWithProductCount) {
         $this->addAttributeToSelect('all_children');
         $this->addAttributeToSelect('is_anchor');
     }
     parent::load($printQuery, $logQuery);
     if ($this->_loadWithProductCount) {
         $this->_loadProductCount();
     }
     return $this;
 }
Пример #3
0
 /**
  * Clear collection
  *
  * @return Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection
  */
 public function clear()
 {
     foreach ($this->_items as $i => $item) {
         if ($item->hasStockItem()) {
             $item->unsStockItem();
         }
         $item = $this->_items[$i] = null;
     }
     foreach ($this->_itemsById as $i => $item) {
         $item = $this->_itemsById[$i] = null;
     }
     unset($this->_items, $this->_data, $this->_itemsById);
     $this->_data = array();
     $this->_itemsById = array();
     return parent::clear();
 }
 /**
  * Add attribute to sort order
  *
  * @param string $attribute
  * @param string $dir
  * @return Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection
  */
 public function addAttributeToSort($attribute, $dir = 'asc')
 {
     if ($this->isEnabledFlat()) {
         if ($attribute == 'position') {
             $column = $attribute;
         } else {
             $column = $this->getEntity()->getAttributeSortColumn($attribute);
         }
         if ($column) {
             $this->getSelect()->order("{$column} {$dir}");
         }
         return $this;
     }
     if ($attribute !== 'position') {
         $attrInstance = $this->getEntity()->getAttribute($attribute);
         if ($attrInstance && $attrInstance->usesSource()) {
             $attrInstance->getSource()->addValueSortToCollection($this, $dir);
             return $this;
         }
     }
     return parent::addAttributeToSort($attribute, $dir);
 }
Пример #5
0
 /**
  * Add attribute to sort order
  *
  * @param string $attribute
  * @param string $dir
  * @return Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection
  */
 public function addAttributeToSort($attribute, $dir = 'asc')
 {
     if ($attribute == 'position') {
         if (isset($this->_joinFields[$attribute])) {
             $this->getSelect()->order("{$attribute} {$dir}");
             return $this;
         }
         $this->getSelect()->order("cat_index_position {$dir}");
         // optimize if using cat index
         $filters = $this->_productLimitationFilters;
         if (isset($filters['category_id']) || isset($filters['visibility'])) {
             $this->getSelect()->order('cat_index.product_id ' . $dir);
         } else {
             $this->getSelect()->order('e.entity_id ' . $dir);
         }
         return $this;
     }
     $storeId = Mage::app()->getStore()->getId();
     if ($attribute == 'price' && $storeId != 0) {
         $websiteId = Mage::app()->getStore()->getWebsiteId();
         $customerGroup = Mage::getSingleton('customer/session')->getCustomerGroupId();
         if ($this->isEnabledFlat()) {
             $priceColumn = 'e.display_price_group_' . $customerGroup;
             $this->getSelect()->order("{$priceColumn} {$dir}");
         } else {
             $priceAttributeId = $this->getAttribute('price')->getId();
             $entityCondition = '_price_order_table.entity_id = e.entity_id';
             $storeCondition = $this->getConnection()->quoteInto('_price_order_table.website_id = ?', $websiteId);
             $groupCondition = $this->getConnection()->quoteInto('_price_order_table.customer_group_id = ?', $customerGroup);
             $attributeCondition = $this->getConnection()->quoteInto('_price_order_table.attribute_id = ?', $priceAttributeId);
             $this->getSelect()->joinLeft(array('_price_order_table' => $this->getTable('catalogindex/price')), "{$entityCondition} AND {$storeCondition} AND {$groupCondition} AND {$attributeCondition}", array());
             $this->getSelect()->order('_price_order_table.value ' . $dir);
             /**
              * Distinct we are using for remove duplicates of products which have
              * several rows in price index (like grouped products)
              */
             $this->getSelect()->distinct(true);
         }
         return $this;
     }
     if ($this->isEnabledFlat()) {
         $column = $this->getEntity()->getAttributeSortColumn($attribute);
         if ($column) {
             $this->getSelect()->order("e.{$column} {$dir}");
         }
         return $this;
     } else {
         $attrInstance = $this->getEntity()->getAttribute($attribute);
         if ($attrInstance && $attrInstance->usesSource()) {
             $attrInstance->getSource()->addValueSortToCollection($this, $dir);
             return $this;
         }
     }
     return parent::addAttributeToSort($attribute, $dir);
 }
Пример #6
0
 public function setOrder($attribute, $dir = 'desc')
 {
     $storeId = Mage::app()->getStore()->getId();
     $websiteId = Mage::app()->getStore()->getWebsiteId();
     if ($attribute == 'price' && $storeId != 0) {
         $customerGroup = Mage::getSingleton('customer/session')->getCustomerGroupId();
         $priceAttributeId = $this->getAttribute('price')->getId();
         $entityCondition = '_price_order_table.entity_id = e.entity_id';
         $storeCondition = $this->getConnection()->quoteInto('_price_order_table.website_id = ?', $websiteId);
         $groupCondition = $this->getConnection()->quoteInto('_price_order_table.customer_group_id = ?', $customerGroup);
         $attributeCondition = $this->getConnection()->quoteInto('_price_order_table.attribute_id = ?', $priceAttributeId);
         $this->getSelect()->joinLeft(array('_price_order_table' => $this->getTable('catalogindex/price')), "{$entityCondition} AND {$storeCondition} AND {$groupCondition} AND {$attributeCondition}", array());
         $this->getSelect()->order('_price_order_table.value ' . $dir);
         /**
          * Distinct we are using for remove duplicates of products which have
          * several rows in price index (like grouped products)
          */
         $this->getSelect()->distinct(true);
     } else {
         parent::setOrder($attribute, $dir);
     }
     return $this;
 }