2017-02-15 1 views
0

si j'ai dans Layer.phpComment trier les produits qui ne sont en rupture de stock que si j'ai déjà trié la liste des produits en fonction?

class WebPierCom_OutOfStockLastAndMostViewed_Catalog_Model_Layer extends Mage_Catalog_Model_Layer 
{ 
    public function prepareProductCollection($collection) 
    { 
     parent::prepareProductCollection($collection); 
     if (!Mage::helper('webpiercom_outofstockmastmndmostviewed_catalog')->isSortOutOfStockProductsAtBottomEnabled()) { 
      return $this; 
     } 

     try { 
      $websiteId = Mage::app()->getStore()->getWebsiteId(); 
      if (Mage::helper('catalog')->isModuleEnabled('Mage_CatalogInventory')) { 


       $stockStatusFieldExisted = Mage::helper('webpiercom_outofstockmastmndmostviewed_catalog')->checkFieldExisted($collection->getSelect(), 'stock_status'); 

       if(!$stockStatusFieldExisted) { 
        $collection->joinTable(
         array('wprdc' => 'cataloginventory/stock_status'), 
         'product_id=entity_id', 
         array('stock_status'), 
         array('website_id' => $websiteId), 
         'left' 
        ); 

       } 
      } 
      $collection->getSelect()->order('stock_status desc'); 
     } 
     catch (Exception $e) {} 
     return $this; 
    } 
} 

Et j'ai dans helper.php ce

class WebPierCom_OutOfStockLastAndMostViewed_Catalog_Helper_Data extends Mage_CatalogInventory_Helper_Data 
{ 
    const XML_PATH_SORT_OUT_OF_STOCK = 'cataloginventory/options/sort_out_of_stock_at_bottom'; 
    const XML_PATH_SORT_OUT_OF_STOCK_BY_MOST_VIEWED = 'cataloginventory/options/sort_out_of_stock_at_bottom_by_most_viewed'; 
    const XML_PATH_SORT_OUT_OF_STOCK_SEARCH_RESULT = 'cataloginventory/options/sort_out_of_stock_at_bottom_for_search'; 


    public function isSortOutOfStockProductsAtBottomEnabled() 
    { 
     return $this->isShowOutOfStock() && Mage::getStoreConfigFlag(self::XML_PATH_SORT_OUT_OF_STOCK); 
    } 

    public function isSortOutOfStockProductsAtBottomByMostViewedEnabled() 
    { 
    return $this->isShowOutOfStock() && Mage::getStoreConfigFlag(self::XML_PATH_SORT_OUT_OF_STOCK_BY_MOST_VIEWED); 
    } 

    public function isEnabledForSearchResults() 
    { 
     return $this->isShowOutOfStock() && Mage::getStoreConfigFlag(self::XML_PATH_SORT_OUT_OF_STOCK_SEARCH_RESULT); 
    } 

    public function checkFieldExisted($select, $field) 
    { 
     $result = false; 
     if($field) { 
      $columns = $select->getPart(Zend_Db_Select::COLUMNS); 
      foreach ($columns as $column) { 
       if (in_array($field , $column)) { 
        $result = true; 
        break; 
       } 
      }   
     } 
     return $result; 
    } 
} 

Mais je dois aussi pour trier les produits qui sont en rupture de stock que par le plus consulté avant la place Au bas de la liste des produits, j'ai Magento 1.9 et 1.9.3 - ce qui est plus simple pour vous. Quelqu'un peut-il m'aider s'il vous plaît

Répondre

0

Vous devez utiliser ce code dans votre fichier layer.php pour résoudre votre requête.

$collection->getSelect()->joinLeft(
     array('_inventory_table'=>$this->getTable('cataloginventory/stock_item')), 
     "_inventory_table.product_id = e.entity_id", 
     array('is_in_stock', 'manage_stock') 
    ); 
    $collection->addExpressionAttributeToSelect('on_top', 
    '(CASE WHEN (((_inventory_table.use_config_manage_stock = 1) AND (_inventory_table.is_in_stock = 1)) OR ((_inventory_table.use_config_manage_stock = 0) AND (1 - _inventory_table.manage_stock + _inventory_table.is_in_stock >= 1))) THEN 1 ELSE 0 END)', 
    array()); 
    $collection->getSelect()->order('on_top DESC'); 
+0

Hi. Merci de votre réponse. Mais mon code fonctionne bien. En rupture de stock déjà au fond toujours. J'ai juste besoin d'ajouter du code pour trier les produits en rupture de stock seulement (ce qui en bas) par mon attribut products_views. –