Mover productos fuera de stock al final de la lista de productos del catálogo [cerrado]


14

Necesito sacar productos fuera de stock al final de la lista del catálogo

Guíeme cómo resolver este problema, o ese archivo para cavar

hasta ahora encontré Toolbar.php, y trabajando alrededor




1
Soy nuevo en magento, así que noob question, /app/code/core/Mage/Catalog/Model/Resource/Eav/Mysql4/Product/Collection.php: este archivo está vacío, ¿está bien?
Alexandr Sopkov

No conozco el archivo, pero creo que querrás encontrar dónde construye Magento la colección de productos y luego agregar un filtro de clasificación como stackoverflow.com/questions/4803495/…
kevando el

3
Estoy votando para cerrar esta pregunta como fuera de tema porque es demasiado vieja sin una respuesta aceptada
SR_Magento

Respuestas:


11

Solución 1

Esto mueve los productos agotados al final de la lista en la página, no en toda la paginación:

1.Agregar observador de eventos:

<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.Lógica del observador:

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. Active " Display Out of Stock Products" a " Yes" System->Configuration->Inventory.

Solución 2

Esto mueve los productos agotados al final de la lista en toda la paginación:

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;
    }

Establezca " Display Out of Stock Products" a " Yes" en System->Configuration->Inventory.

Las lógicas anteriores no afectan a la funcionalidad de clasificación / paginación de su catálogo, solo mueve productos no vendibles hasta el final.


¿Estás seguro de que esto funcionará? Parece que no afectará la paginación, pero moverá los productos agotados DE LA PÁGINA ACTUAL en la parte inferior. Por lo tanto, si pasa a la página siguiente, es posible que vea productos en existencia después de haber visto en la página anterior algunos productos agotados.
Marius

Sí, se
agotará el

Creo que la tarea aquí era mover los productos agotados al final de la lista, no la página. Por lo tanto, debería ver las primeras N páginas con productos en existencia y una vez que vea una que esté agotada, todas las demás que vengan después estarán agotadas.
Marius

Sí, intentaré dar otra solución :)
mageUz

1
¡La solución 2 funciona de maravilla! ¡Muchas gracias por esto!
Derik Nel

0

He implementado esta funcionalidad en mi sitio web.

  • Copie Collection.php de /app/code/core/Mage/Catalog/Model/Resource/Product/Collection.php a / app / code / local / Mage / Catalog / Model / Resource / Product /

  • Edite Collection.php, alrededor de la línea 1570 encuentre el texto $ storeId = $ this-> getStoreId ();

  • Agregue las siguientes líneas directamente debajo:

        $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');

Vacíe su caché y sus productos ahora ordenarán automáticamente los productos en inventario primero y los productos agotados en último lugar.


3
Abstenerse de recomendar anulaciones centrales locales. Sería mucho mejor extender adecuadamente la clase Mage_Catalog_Model_Resource_Product_Collection.
Reid Blomquist

1
¿Quizás pueda agregar su propia respuesta y mostrarnos cómo hacerlo?
SR_Magento
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.