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.