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

Alexandr Sopkov
fuente
1
échale un vistazo ajit-techhub.blogspot.in/2012/01/…
Pavan Kumar
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.

mageUz
fuente
¿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.

SR_Magento
fuente
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