Sortir des produits en stock à la fin de la liste des produits du catalogue [fermé]

14

Je dois repousser les produits en stock à la fin de la liste du catalogue

Veuillez me guider pour résoudre ce problème ou ce fichier à creuser

jusqu'à présent, j'ai trouvé Toolbar.php, et travailler autour

Alexandr Sopkov
la source
1
check it out ajit-techhub.blogspot.in/2012/01/…
Pavan Kumar
1
Je suis nouveau sur magento, donc aucune question, /app/code/core/Mage/Catalog/Model/Resource/Eav/Mysql4/Product/Collection.php - ce fichier est vide, ça va?
Alexandr Sopkov
Je ne connais pas le fichier, mais je pense que vous voudrez trouver où Magento construit la collection de produits, puis ajouter un filtre de tri comme stackoverflow.com/questions/4803495/…
kevando
3
Je vote pour fermer cette question comme hors sujet car trop vieille sans réponse acceptée
SR_Magento

Réponses:

11

Solution 1

Cela sort des produits en stock à la fin de la liste de la page, pas partout dans la pagination:

1. Ajouter un observateur d'événement:

<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. logique de l'observateur:

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

Solution 2

Cela sort des produits en stock à la fin de la liste dans toute la pagination:

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

Activez " Display Out of Stock Products" sur " Yes" System->Configuration->Inventory.

Les logiques ci-dessus n'affectent pas la fonctionnalité de tri / pagination de votre catalogue, ne déplacent que les produits non vendables à la fin.

mageUz
la source
Êtes-vous sûr que cela fonctionnera? Il semble que cela n'affectera pas la pagination, mais il déplacera les produits en rupture de stock DE LA PAGE ACTUELLE en bas. Donc, si vous passez à la page suivante, vous pourriez voir des produits en stock après avoir vu sur la page précédente certains produits en rupture de stock.
Marius
Oui, il sortira des produits en stock à la fin de la liste sur chaque page de pagination
mageUz
Je pense que la tâche ici était de déplacer les produits en rupture de stock à la fin de la liste, pas la page. Vous devriez donc voir les N premières pages avec des produits en stock et une fois que vous en voyez une en rupture de stock, toutes les autres qui viennent après sont en rupture de stock.
Marius
Oui, je vais essayer de donner une autre solution :)
mageUz
1
La solution 2 fonctionne comme un charme! Merci beaucoup pour cela!
Derik Nel
0

J'ai implémenté cette fonctionnalité sur mon site Web.

  • Copiez Collection.php de /app/code/core/Mage/Catalog/Model/Resource/Product/Collection.php vers / app / code / local / Mage / Catalogue / Model / Resource / Product / Product /

  • Modifiez Collection.php, autour de la ligne 1570, recherchez le texte $ storeId = $ this-> getStoreId ();

  • Ajoutez les lignes suivantes directement ci-dessous:

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

Videz votre cache et vos produits trieront désormais automatiquement les produits en stock en premier et les produits en rupture de stock en dernier.

SR_Magento
la source
3
Veuillez vous abstenir de recommander des remplacements de base locaux. Il serait préférable d'étendre correctement la classe Mage_Catalog_Model_Resource_Product_Collection.
Reid Blomquist
1
Peut-être pouvez-vous ajouter votre propre réponse et nous montrer comment procéder?
SR_Magento