Przenieś produkty z magazynu na koniec listy produktów w katalogu [zamknięte]

14

Muszę wypchnąć produkty z magazynu na koniec listy katalogowej

Proszę o wskazówki, jak rozwiązać ten problem lub plik do wykopania

jak dotąd znalazłem Toolbar.phpi pracowałem nad tym

Alexandr Sopkov
źródło
1
sprawdź to ajit-techhub.blogspot.in/2012/01/...
Pavan Kumar
1
Jestem nowy w Magento, więc pytanie noob, /app/code/core/Mage/Catalog/Model/Resource/Eav/Mysql4/Product/Collection.php - ten plik jest pusty, czy wszystko w porządku?
Alexandr Sopkov
Nie znam tego pliku, ale myślę, że będziesz chciał dowiedzieć się, gdzie Magento buduje kolekcję produktów, a następnie dodać filtr sortowania, taki jak stackoverflow.com/questions/4803495/…
kevando
3
Głosuję za zamknięciem tego pytania jako nie na temat, ponieważ jest za stary bez zaakceptowanej odpowiedzi
SR_Magento

Odpowiedzi:

11

Rozwiązanie 1

Spowoduje to przeniesienie produktów z magazynu na koniec listy na stronie, nie w całym podziale na strony:

1. Dodaj obserwatora zdarzeń:

<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. Logika serwera:

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. Ustaw opcję „ Display Out of Stock Products” na „ YesSystem->Configuration->Inventory.

Rozwiązanie 2

Przenosi to produkty z magazynu na koniec listy w obrębie całego podziału na strony:

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

Ustaw „ Display Out of Stock Products” na „ Yes” na System->Configuration->Inventory.

Powyższe logiki nie wpływają na funkcjonalność sortowania / paginacji katalogu, przenoszą tylko produkty, których nie można sprzedać do końca.

mageUz
źródło
Jesteś pewien, że to zadziała? Wydaje się, że nie wpłynie to na paginację, ale przeniesie niedostępne produkty z AKTUALNEJ STRONY na dole. Więc jeśli przejdziesz do następnej strony, możesz zobaczyć produkty w magazynie po tym, jak zobaczyłeś na poprzedniej stronie kilka produktów niedostępnych.
Marius
Tak Przeniesie produkty z magazynu na koniec listy na każdej stronie pagination
mageUz
Myślę, że zadaniem tutaj było przeniesienie produktów z zapasów na końcu listy, a nie na stronę. Powinieneś więc zobaczyć pierwsze N ​​stron z produktami w magazynie, a kiedy zobaczysz stronę niedostępną, wszystkie pozostałe, które są potem, są niedostępne.
Marius
Tak, postaram się podać inne rozwiązanie :)
mageUz
1
Rozwiązanie 2 działa jak urok! Bardzo ci za to dziękuję!
Derik Nel,
0

Zaimplementowałem tę funkcjonalność na mojej stronie internetowej.

  • Skopiuj Collection.php z /app/code/core/Mage/Catalog/Model/Resource/Product/Collection.php do / app / code / local / Mage / Catalog / Model / Resource / Product /

  • Edytuj Collection.php, wokół linii 1570 znajdź tekst $ storeId = $ this-> getStoreId ();

  • Dodaj poniższe wiersze bezpośrednio poniżej:

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

Opróżnij pamięć podręczną, a Twoje produkty będą teraz automatycznie sortować najpierw produkty dostępne w magazynie, a produkty niedostępne jako ostatnie.

SR_Magento
źródło
3
Powstrzymaj się od zalecania lokalnych zastąpień rdzenia. Byłoby znacznie lepiej poprawnie rozszerzyć klasę Mage_Catalog_Model_Resource_Product_Collection.
Reid Blomquist,
1
Być może możesz dodać własną odpowiedź i pokazać nam, jak to zrobić?
SR_Magento,