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




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.


Ê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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.