Question

J'utilise un observateur pour afficher les produits en vente libre.
Cela fonctionne bien, mais maintenant, je souhaite activer l'option Magento d'acheter des produits en rupture de stock.(La méthode de stockage de Magento par défaut)

Dans ce cas, j'ai besoin de définir tous les produits au statut "en stock", ce code ne fonctionne plus.

Comment puis-je modifier ce code, de sorte qu'il vérifiera si la quantité est 0 à la place, si l'état est "en rupture de stock"?

Observateur:

<?php

class Outofstock_Model_Observer extends Mage_Core_Model_Abstract
{
    public function catalogProductCollectionLoadBefore(Varien_Event_Observer $observer)
    {
        $collection = $observer->getCollection();
        $collection->getSelect()->joinLeft(
            array('_inventory_table'=>$collection->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');
        $order = $collection->getSelect()->getPart('order');
        array_unshift($order, array_pop($order));
        $collection->getSelect()->setPart('order', $order);


    }
}

code correct est, grâce à @giuseppe:

class Outofstock_Model_Observer extends Mage_Core_Model_Abstract
{
    public function catalogProductCollectionLoadBefore(Varien_Event_Observer $observer)
    {
        $prefix = '_inventory_table'.rand(0, 10000);
        $collection = $observer->getCollection();
        $collection->getSelect()->joinLeft(
            array($prefix=>$collection->getTable('cataloginventory/stock_item')),
            "$prefix.product_id = e.entity_id",
            array('is_in_stock', 'manage_stock')
        );
        $collection->joinField(
                        'inventory_qty',
                        'cataloginventory_stock_item',
                        'qty',
                        'product_id=entity_id')
                    ->setOrder('inventory_qty','desc');

    }
}

Était-ce utile?

La solution

Pour vous donner un sentier à suivre, dans un scénario similaire, je dois montrer le dernier produit avec Qté= 0, j'ai écrit ce code dans une substitution locale de: Catalogue / Bloc / Produit / List.php

        $this->_productCollection = $layer->getProductCollection();
        //Added the lines below...
        $this->_productCollection->joinField(
                    'inventory_qty',
                    '<table_prefix>cataloginventory_stock_item',
                    'qty',
                    'product_id=entity_id')
                ->setOrder('inventory_qty','desc');

Ce qui précède triera la collection sur Qté Desc, vous pouvez utiliser comme point de départ pour modifier votre code.

J'espère que cela aide sinon mon code appliqué à votre code devrait être comme celui suivant

public function catalogProductCollectionLoadBefore(Varien_Event_Observer $observer)
{
    $collection = $observer->getCollection();
    $collection->joinField(
                        'inventory_qty',
                        'cataloginventory_stock_item',
                        'qty',
                        'product_id=entity_id')
                    ->setOrder('inventory_qty','desc');

}

giuseppe

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top