Come ottenere la raccolta del prodotto di articoli esauriti - al contrario di addInStockFilterToCollection ()?


9

Ho l'obbligo di visualizzare i prodotti di una categoria in due elenchi: uno per gli articoli disponibili, l'altro per gli articoli esauriti.

sto usando

Mage::getSingleton('cataloginventory/stock')->addInStockFilterToCollection()

per filtrare la mia raccolta di prodotti per gli articoli disponibili, ma non sembra esserci un metodo equivalente per filtrare gli articoli esauriti: ho esaminato il Mage_CatalogInventory_Model_Stockmodello, che è il punto in cui è definito il metodo sopra menzionato.

Ho visto il seguente esempio per recuperare prodotti esauriti:

$collection->joinField(
                    'is_in_stock',
                    'cataloginventory/stock_item',
                    'is_in_stock',
                    'product_id=entity_id',
                    '{{table}}.stock_id=1',
                    'left'
            )
            ->addAttributeToFilter('is_in_stock', array('eq' => 0));

... ma sicuramente questo non è solo o il modo migliore per raggiungere questo obiettivo?

Risposte:


3

diciamo che $collectionè la tua collezione di prodotti che costruisci in questo modo:

$collection = Mage::getModel('catalog/product')->getCollection()
    ->...additional filters here...;

ora fai questo per la tua collezione. Questo si unisce alla raccolta con la tabella dello stato delle scorte.

$website = Mage::app()->getWebsite();
Mage::getModel('cataloginventory/stock_status')->addStockStatusToSelect($collection, $website);

Ora puoi filtrare i prodotti esauriti:

$collection->getSelect()->where('stock_status.stock_status = ?', 0);

Funzionerebbe indipendentemente dalle opzioni di configurazione impostate per l'inventario di ciascun prodotto? (Ad esempio un prodotto che non è gestito in stock o esaurito?)
BrynJ

Dovrebbe funzionare, perché la tabella stock è indicizzata e tiene conto di tutte le possibili impostazioni. Devi solo assicurarti che il tuo indice azionario sia aggiornato
Marius

Grazie per la conferma. Sembra un approccio "leggero" per ottenere questi dati.
BrynJ,

L'uso della tabella dell'indice dello stato delle scorte anziché della tabella degli articoli delle scorte è in effetti la soluzione migliore.
Fabian Schmengler,

Ho dovuto inviare il prodotto selezionato come primo argomento alla funzione Mage :: getModel ('cataloginventory / stock_status') -> addStockStatusToSelect ($ collection-> getSelect (), $ website);
dichiara il

2

Il tuo esempio non tiene conto del valore di "usa config".

Diamo un'occhiata a come addInStockFilterToCollectionfunziona:

public function addInStockFilterToCollection($collection)
{
    $this->getResource()->setInStockFilterToCollection($collection);
    return $this;
}

OK, sta delegando a un altro metodo:

public function setInStockFilterToCollection($collection)
{
    $manageStock = Mage::getStoreConfig(Mage_CatalogInventory_Model_Stock_Item::XML_PATH_MANAGE_STOCK);
    $cond = array(
        '{{table}}.use_config_manage_stock = 0 AND {{table}}.manage_stock=1 AND {{table}}.is_in_stock=1',
        '{{table}}.use_config_manage_stock = 0 AND {{table}}.manage_stock=0',
    );

    if ($manageStock) {
        $cond[] = '{{table}}.use_config_manage_stock = 1 AND {{table}}.is_in_stock=1';
    } else {
        $cond[] = '{{table}}.use_config_manage_stock = 1';
    }

    $collection->joinField(
        'inventory_in_stock',
        'cataloginventory/stock_item',
        'is_in_stock',
        'product_id=entity_id',
        '(' . join(') OR (', $cond) . ')'
    );
    return $this;
}

Ciò si unisce alla tabella di inventario con le seguenti condizioni:

  1. Il prodotto non utilizza la configurazione globale E ha "gestisci stock" impostato su "sì" ED è disponibile

    O

  2. Il prodotto non utilizza la configurazione globale E ha "gestisci stock" impostato su "no"

    O

  3. Il prodotto utilizza la configurazione globale E se la configurazione globale è "gestisci stock = yes", è disponibile

È necessario invertire le condizioni come segue:

  1. Il prodotto non utilizza la configurazione globale E ha "gestisci stock" impostato su "sì" E non è disponibile

    O

  2. Il prodotto utilizza la configurazione globale E la configurazione globale è "gestisci stock = yes" E non è disponibile

Spiegazione: si prendono solo le condizioni in cui in_stock è effettivamente verificato e si modifica il confronto in 0. Le condizioni in cui in_stock non è controllato ("gestisci stock" = "no") indicano che il prodotto è sempre disponibile, indipendentemente dallo stato dello stock , quindi non li includiamo nella nostra query "esaurito".

Quindi questo è il tuo codice:

public function setOutOfStockFilterToCollection($collection)
{
    $manageStock = Mage::getStoreConfig(Mage_CatalogInventory_Model_Stock_Item::XML_PATH_MANAGE_STOCK);
    $cond = array(
        '{{table}}.use_config_manage_stock = 0 AND {{table}}.manage_stock=1 AND {{table}}.is_in_stock=0'
    );

    if ($manageStock) {
        $cond[] = '{{table}}.use_config_manage_stock = 1 AND {{table}}.is_in_stock=0';
    }

    $collection->joinField(
        'inventory_in_stock',
        'cataloginventory/stock_item',
        'is_in_stock',
        'product_id=entity_id',
        '(' . join(') OR (', $cond) . ')'
    );
    return $this;
}

Ottima risposta dettagliata. Quindi suggeriresti di creare un modulo per questo, per estendere il Mage_CatalogInventory_Model_Stockmodello?
BrynJ,

1
Nessuna riscrittura o estensione. Puoi mettere questo metodo ovunque perché non lo usa $this. Potrebbe anche essere una semplice funzione. Vorrei creare un modulo separato e renderlo un metodo di supporto (o se ne hai bisogno per un altro modulo, aggiungilo
all'helper

1

Il seguente frammento di codice ti restituirà i prodotti di una categoria con stato "Abilita", Catalogo visibilità, ricerca "e Disponibilità magazzino" Non disponibile ".

$productDetails = Mage::getModel('catalog/category')->load($cat_id)
                  ->getProductCollection()
                  ->addAttributeToSelect('*');

$productDetails->addAttributeToFilter('visibility', 4); 
$productDetails->addAttributeToFilter('status', 1); 
$productDetails->joinField('is_in_stock',
                            'cataloginventory/stock_item',
                            'is_in_stock',
                            'product_id=entity_id',
                            'is_in_stock=0',
                            '{{table}}.stock_id=1',
                            'left');

0

Puoi provare questo.

 $manageStock = Mage::getStoreConfig(Mage_CatalogInventory_Model_Stock_Item::XML_PATH_MANAGE_STOCK);
        $cond = array(
            '{{table}}.use_config_manage_stock = 0 AND {{table}}.manage_stock=1 AND {{table}}.is_in_stock=0',
            '{{table}}.use_config_manage_stock = 0 AND {{table}}.manage_stock=0',
        );

        if ($manageStock) {
            $cond[] = '{{table}}.use_config_manage_stock = 1 AND {{table}}.is_in_stock=0';
        } else {
            $cond[] = '{{table}}.use_config_manage_stock = 1';
        }

        $collection->joinField(
            'inventory_in_stock',
            'cataloginventory/stock_item',
            'is_in_stock',
            'product_id=entity_id',
            '(' . join(') OR (', $cond) . ')'
        );

Oppure puoi provare questo

  $manageStock = Mage::getStoreConfig(Mage_CatalogInventory_Model_Stock_Item::XML_PATH_MANAGE_STOCK);
        $cond = array(
            '{{table}}.use_config_manage_stock = 0 AND {{table}}.manage_stock=1 AND {{table}}.is_in_stock=0',
            '{{table}}.use_config_manage_stock = 0 AND {{table}}.manage_stock=0',
        );

        if ($manageStock) {
            $cond[] = '{{table}}.is_in_stock=0';


        $collection->joinField(
            'inventory_in_stock',
            'cataloginventory/stock_item',
            'is_in_stock',
            'product_id=entity_id',
            '(' . join(') OR (', $cond) . ')'
        );

Non sono sicuro al 100%.


Grazie @AmitBera. Potete per favore fornire un contesto per le vostre risposte e spiegare le differenze?
BrynJ,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.