Pergunta

Eu uso um observador para exibir os produtos fora de estoque por último.
Isso funciona bem, mas agora quero habilitar a opção Magento para comprar produtos que estão em falta.(O método de pedido pendente padrão do Magento)

Nesse caso preciso colocar todos os produtos no status "Em estoque", para que esse código não funcione mais.

Como posso editar este código para que ele verifique se a quantidade é 0, se o status for "Esgotado"?

Observador:

<?php

class Outofstock_Model_Observer extends Mage_Core_Model_Abstract
{
    public function catalogProductCollectionLoadBefore(Varien_Event_Observer $observer)
    {
        $collection = $observer->getCollection();
        $collection->getSelect()->joinLeft(
            array('_inventory_table'=>$collection->getTable('cataloginventory/stock_item')),
            "_inventory_table.product_id = e.entity_id",
            array('is_in_stock', 'manage_stock')
        );
        $collection->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()
        );
        $collection->getSelect()->order('on_top DESC');
        $order = $collection->getSelect()->getPart('order');
        array_unshift($order, array_pop($order));
        $collection->getSelect()->setPart('order', $order);


    }
}

O código correto é, graças a @Giuseppe:

class Outofstock_Model_Observer extends Mage_Core_Model_Abstract
{
    public function catalogProductCollectionLoadBefore(Varien_Event_Observer $observer)
    {
        $prefix = '_inventory_table'.rand(0, 10000);
        $collection = $observer->getCollection();
        $collection->getSelect()->joinLeft(
            array($prefix=>$collection->getTable('cataloginventory/stock_item')),
            "$prefix.product_id = e.entity_id",
            array('is_in_stock', 'manage_stock')
        );
        $collection->joinField(
                        'inventory_qty',
                        'cataloginventory_stock_item',
                        'qty',
                        'product_id=entity_id')
                    ->setOrder('inventory_qty','desc');

    }
}
Foi útil?

Solução

para lhe dar uma trilha a seguir, em um cenário semelhante, tenho que mostrar por último o produto com qty = 0, escrevi este código em uma substituição local de:Catálogo/Bloco/Produto/List.php

        $this->_productCollection = $layer->getProductCollection();
        //Added the lines below...
        $this->_productCollection->joinField(
                    'inventory_qty',
                    '<table_prefix>cataloginventory_stock_item',
                    'qty',
                    'product_id=entity_id')
                ->setOrder('inventory_qty','desc');

o acima irá classificar a coleção em qty DESC, você pode usar como ponto de partida para modificar seu código.

Espero que isso ajude se não meu código aplicado ao seu código deve ser como o seguinte

public function catalogProductCollectionLoadBefore(Varien_Event_Observer $observer)
{
    $collection = $observer->getCollection();
    $collection->joinField(
                        'inventory_qty',
                        'cataloginventory_stock_item',
                        'qty',
                        'product_id=entity_id')
                    ->setOrder('inventory_qty','desc');

}

Giuseppe

Licenciado em: CC-BY-SA com atribuição
Não afiliado a magento.stackexchange
scroll top