Перемещение товара со склада в конец каталога товаров [закрыто]

14

Мне нужно вытолкнуть товар со склада в конец списка каталога

Подскажите пожалуйста как решить эту проблему или этот файл копать

пока что нашел Toolbar.phpи обошел

Александр сопков
источник
Взгляните на эти статьи ishoni.com/2011/09/magento-out-of-stock-push-to-end-of.html , stackoverflow.com/questions/15879978/…
Евгений Иванов
1
проверить это ajit-techhub.blogspot.in/2012/01/…
Паван Кумар
1
Я новичок в magento, так что вопрос noob, /app/code/core/Mage/Catalog/Model/Resource/Eav/Mysql4/Product/Collection.php - этот файл пуст, нормально?
Александр Сопков
Я не знаю файл от руки, но я думаю, что вы захотите найти, где Magento создает коллекцию продуктов, а затем добавить фильтр сортировки, например stackoverflow.com/questions/4803495/…
kevando
3
Я голосую, чтобы закрыть этот вопрос как не по теме, потому что слишком старый без принятого ответа
SR_Magento

Ответы:

11

Решение 1

Это перемещает товары со склада в конец списка на странице, а не по всей нумерации страниц:

1. добавить событие наблюдателя:

<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.Observer:

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. Установите " Display Out of Stock Products" на " Yes" вкл System->Configuration->Inventory.

Решение 2

Это перемещает товары со склада в конец списка по всей нумерации страниц:

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

Установите " Display Out of Stock Products" в " Yes" вкл System->Configuration->Inventory.

Приведенные выше логики не влияют на функциональность сортировки / разбиения на каталоги, а только перемещают не реализуемые продукты в конец.

mageUz
источник
Вы уверены, что это сработает? Это швы, это не повлияет на нумерацию страниц, но это переместит отсутствующие продукты ИЗ ТЕКУЩЕЙ СТРАНИЦЫ внизу. Так что, если вы перейдете на следующую страницу, вы можете увидеть в наличии товары после того, как вы увидели на предыдущей странице некоторые из них нет в наличии.
Мариус
Да, он будет перемещаться со склада продуктов в конец списка на каждой странице нумерации страниц
mageUz
Я думаю, что задача здесь состояла в том, чтобы переместить продукты со склада в конец списка, а не на страницу. Таким образом, вы должны увидеть первые N страниц с имеющимися в наличии продуктами, а после просмотра одного из них нет в наличии, а все остальные, появившиеся после этого, отсутствуют в наличии.
Мариус
Да, я постараюсь дать другое решение :)
mageUz
1
Решение 2 работает как шарм! Большое спасибо за это!
Дерик Нель
0

Я реализовал эту функцию на моем сайте.

  • Скопируйте Collection.php из /app/code/core/Mage/Catalog/Model/Resource/Product/Collection.php в / app / code / local / Mage / Каталог / Модель / Ресурс / Продукт /

  • Отредактируйте Collection.php, около строки 1570 найдите текст $ storeId = $ this-> getStoreId ();

  • Добавьте следующие строки прямо ниже:

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

Очистите кэш-память, и ваши продукты теперь будут автоматически сортировать товары в наличии, а товары в наличии - последними.

SR_Magento
источник
3
Пожалуйста, воздержитесь от рекомендации локальных переопределений ядра. Было бы намного лучше правильно расширить класс Mage_Catalog_Model_Resource_Product_Collection.
Рид Бломквист,
1
Возможно, вы можете добавить свой собственный ответ и показать нам, как это сделать?
SR_Magento