Déménager hors de stock de dernière fois que la quantité est 0
-
28-09-2020 - |
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);
}
}
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');
}
}
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