Mover produtos fora de estoque para o final da lista de produtos do catálogo [fechado]

14

Preciso enviar produtos em estoque para o final da lista de catálogos

Por favor, me guie como resolver esse problema ou esse arquivo para cavar

até agora eu encontrei Toolbar.php, e trabalhando em torno dele

Alexandr Sopkov
fonte
1
verificá-la ajit-techhub.blogspot.in/2012/01/...
Pavan Kumar
1
Eu sou novo no magento, então pergunta noob, /app/code/core/Mage/Catalog/Model/Resource/Eav/Mysql4/Product/Collection.php - esse arquivo está vazio, está bem?
Alexandr Sopkov 24/03
Não conheço o arquivo de imediato, mas acho que você vai querer descobrir onde o Magento constrói a coleção de produtos e depois adicionar um filtro de classificação como stackoverflow.com/questions/4803495/…
kevando
3
Eu estou votando para fechar esta questão como off-topic, porque muito velho sem uma resposta aceita
SR_Magento

Respostas:

11

Solução 1

Isso move os produtos em falta para o final da lista na página, não em toda a paginação:

1.Adicionar 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 do 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.Defina " Display Out of Stock Products" para " Yes" System->Configuration->Inventory.

Solução 2

Isso move os produtos em falta para o final da lista em toda a paginação:

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

Defina " Display Out of Stock Products" para " Yes" ativado System->Configuration->Inventory.

As lógicas acima não afetam a funcionalidade de classificação / paginação do catálogo, apenas movem produtos não vendáveis ​​para o final.

mageUz
fonte
Tem certeza de que isso funcionará? Parece que não afetará a paginação, mas moverá os produtos fora de estoque DA PÁGINA ATUAL na parte inferior. Portanto, se você for para a próxima página, poderá ver os produtos em estoque depois de ver na página anterior alguns itens em falta.
Marius
Sim Irá sair de estoque de produtos para o final da lista em todas as páginas de paginação
#
Acho que a tarefa aqui foi mover os produtos fora de estoque no final da lista, não a página. Portanto, você deverá ver as primeiras N páginas com produtos em estoque e depois de visualizar uma fora de estoque, todas as outras que vierem depois ficarão sem estoque.
Marius
Sim, eu vou tentar dar outra solução :)
mageUz
1
Solução 2 funciona como um encanto! Muito obrigado por isso!
Derik Nel
0

Eu implementei essa funcionalidade no meu site.

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

  • Edite Collection.php, por volta da linha 1570, encontre o texto $ storeId = $ this-> getStoreId ();

  • Adicione as seguintes linhas diretamente abaixo:

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

Lave seu cache e seus produtos agora classificarão automaticamente os produtos em estoque primeiro e os produtos esgotados por último.

SR_Magento
fonte
3
Evite recomendar substituições principais locais. Seria muito melhor estender adequadamente a classe Mage_Catalog_Model_Resource_Product_Collection.
Reid Blomquist
1
Talvez você possa adicionar sua própria resposta e nos mostrar como fazer isso?
SR_Magento