Sposta i prodotti fuori stock alla fine dell'elenco dei prodotti del catalogo [chiuso]


14

Devo eliminare i prodotti in stock fino alla fine dell'elenco del catalogo

Per favore guidami su come risolvere questo problema o quel file da scavare

finora ho trovato Toolbar.php, e lavorando intorno ad esso




1
Sono nuovo di Magento, quindi nessuna domanda, /app/code/core/Mage/Catalog/Model/Resource/Eav/Mysql4/Product/Collection.php - questo file è vuoto, va bene?
Alexandr Sopkov,

Non so il file fuori mano, ma credo che si vorrà trovare dove Magento costruisce la raccolta del prodotto e quindi aggiungere un filtro sorta come stackoverflow.com/questions/4803495/...
kevando

3
Sto votando per chiudere questa domanda come fuori tema perché troppo vecchia senza una risposta accettata
SR_Magento

Risposte:


11

Soluzione 1

In questo modo i prodotti esauriti vengono esauriti alla fine dell'elenco nella pagina, non in tutta l'impaginazione:

1.Aggiungi osservatore eventi:

<frontend>
    <events>
        <catalog_block_product_list_collection>
            <observers>
                <ssd_test>
                    <type>model</type>
                    <class>ssd_test/observer</class>
                    <method>catalogBlockProductCollectionBeforeToHtml</method>
                </ssd_test>
            </observers>
        </catalog_block_product_list_collection>
    </events>
</frontend>

2. Logica osservatore:

public function catalogBlockProductCollectionBeforeToHtml($observer)
{
    /**
     * @var $products Varien_Data_Collection
     */
    $products         = $observer->getEvent()->getCollection();
    $soldOuts         = array();
    if ($products instanceof Varien_Data_Collection) {
        foreach ($products as $product) {
            if (!$product->isSaleable()) {
                $products->removeItemByKey($product->getId());
                $soldOuts[] = $product;
            }
        }
        foreach ($soldOuts as $product) {
            $products->addItem($product);
        }
    }
    return $this;
}

3.Impostare " Display Out of Stock Products" su " Yes" acceso System->Configuration->Inventory.

Soluzione 2

In questo modo, i prodotti esauriti scendono alla fine dell'elenco in tutta l'impaginazione:

config.xml:

    <frontend>
        <events>
            <catalog_product_collection_load_before>
                <observers>
                    <review>
                        <type>model</type>
                        <class>ssd_test/observer</class>
                        <method>catalogProductCollectionLoadBefore</method>
                    </review>
                </observers>
            </catalog_product_collection_load_before>
        </events>
    </frontend>

Observer.php:

    public function catalogProductCollectionLoadBefore($observer)
    {
        $toolbar = Mage::getBlockSingleton('catalog/product_list_toolbar');
        if ($toolbar) {
            $products = $observer->getEvent()->getCollection();

            $stockId = Mage_CatalogInventory_Model_Stock::DEFAULT_STOCK_ID;
            $websiteId = Mage::app()->getStore($products->getStoreId())->getWebsiteId();

            $products->getSelect()->joinLeft(
                array('_inv' => $products->getResource()->getTable('cataloginventory/stock_status')),
                "_inv.product_id = e.entity_id and _inv.website_id=$websiteId and _inv.stock_id=$stockId",
                array('stock_status')
            );
            $products->addExpressionAttributeToSelect('in_stock', 'IFNULL(_inv.stock_status,0)', array());

            $products->getSelect()->reset('order');
            $products->getSelect()->order('in_stock DESC');

            if ($toolbar->getCurrentOrder()) {
                $products->addAttributeToSort($toolbar->getCurrentOrder(), $toolbar->getCurrentDirection());
            }
        }

        return $this;
    }

Impostare " Display Out of Stock Products" su " Yes" attivo System->Configuration->Inventory.

Le logiche di cui sopra non influiscono sulla funzionalità di ordinamento / impaginazione del catalogo, spostano solo i prodotti non vendibili alla fine.


Sei sicuro che funzionerà? Sembra che non influenzerà l'impaginazione, ma sposta i prodotti esauriti DALLA PAGINA ATTUALE in basso. Quindi se vai alla pagina successiva potresti vedere in stock prodotti dopo aver visto nella pagina precedente alcuni esauriti.
Marius

Sì.
Sposterà i

Penso che il compito qui sia stato quello di spostare i prodotti esauriti alla fine dell'elenco, non la pagina. Quindi dovresti vedere le prime N pagine con prodotti in stock e una volta che ne vedi uno esaurito, tutti gli altri che ne conseguono sono esauriti.
Marius

Sì, proverò a dare un'altra soluzione :)
mageUz

1
La soluzione 2 funziona come un incantesimo! Grazie molte per questo!
Derik Nel

0

Ho implementato questa funzionalità sul mio sito Web.

  • Copia Collection.php da /app/code/core/Mage/Catalog/Model/Resource/Product/Collection.php in / app / code / local / Mage / Catalog / Model / Resource / Product /

  • Modifica Collection.php, intorno alla riga 1570 trova testo $ storeId = $ this-> getStoreId ();

  • Aggiungi le seguenti righe direttamente sotto:

        $this->getSelect()->joinLeft(
        array('_inventory_table'=>$this->getTable('cataloginventory/stock_item')),
        "_inventory_table.product_id = e.entity_id",
        array('is_in_stock', 'manage_stock')
    );
    $this->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());
    $this->getSelect()->order('on_top DESC');

Svuota la cache e i tuoi prodotti ora classificheranno automaticamente prima i prodotti in stock e gli ultimi prodotti esauriti.


3
Astenersi dal raccomandare sostituzioni core locali. Sarebbe molto meglio estendere correttamente la classe Mage_Catalog_Model_Resource_Product_Collection.
Reid Blomquist,

1
Forse puoi aggiungere la tua risposta e mostrarci come farlo?
SR_Magento,
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.