将缺货的产品移到目录产品列表的末尾[关闭]


14

我需要将缺货的产品推到目录列表的末尾

请指导我如何解决这个问题,或挖该文件

到目前为止,我已经找到Toolbar.php并解决它




1
我是magento的新手,所以noob问题/app/code/core/Mage/Catalog/Model/Resource/Eav/Mysql4/Product/Collection.php-该文件为空,可以吗?
Alexandr Sopkov 2014年

我不知道文件是否存在,但是我想您会想找到Magento在哪里构建产品集合,然后添加诸如stackoverflow.com/questions/4803495/…之
kevando 2014年

3
我投票关闭此问题为离题,因为太老了,没有可接受的答案
SR_Magento 2015年

Answers:


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,观察者逻辑

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”设置为“ YesSystem->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 ProductsYes” 设置为“ ” System->Configuration->Inventory

以上逻辑不会影响目录的排序/分页功能,只会将不可销售的产品移到最后。


您确定这行得通吗?它接缝不会影响分页,但会从底部的“当前页”移出缺货的产品。因此,如果转到下一页,则在上一页中看到一些缺货后,您可能会在库存产品中看到这些产品。
马里乌斯

是它将缺货的产品移至分页的每一页列表末尾
mageUz 2014年

我认为这里的任务是将缺货的产品移到列表的末尾,而不是页面的末尾。因此,您应该看到库存产品中的前N页,一旦您看到一个缺货页面,那么之后的所有其他页面都将缺货。
马里乌斯

是的,我会尝试提供另一种解决方案:)
mageUz 2014年

1
解决方案2就像魅力一样!非常感谢您!
Derik Nel 2015年

0

我已经在我的网站上实现了此功能。

  • 将Collection.php从/app/code/core/Mage/Catalog/Model/Resource/Product/Collection.php复制到/ app / code / local / Mage / Catalog / Model / Resource / Product /

  • 编辑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');

刷新缓存,您的产品现在将自动自动对库存产品进行排序,最后对缺货产品进行排序。


3
请不要推荐本地核心替代。正确扩展Mage_Catalog_Model_Resource_Product_Collection类会更好。
Reid Blomquist 2014年

1
也许您可以添加自己的答案并向我们展示如何做?
SR_Magento 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.