在庫切れの製品をカタログ製品リストの最後に移動する[終了]


14

在庫切れの製品をカタログリストの最後までプッシュする必要がある

この問題またはそのファイルを解決する方法を教えてください

これまでのところ、私はそれを見つけてToolbar.php、それを回避する




1
私はmagentoが初めてなので、noobの質問、/ app / code / core / Mage / Catalog / Model / Resource / Eav / Mysql4 / Product / Collection.php-このファイルは空です、大丈夫ですか?
アレクサンドル・ソプコフ14年

ファイルを手元に知らないが、Magentoが製品コレクションを構築する場所を見つけてから、stackoverflow.com
questions / 4803495 /…の

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.オブザーバーロジック:

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

ここでのタスクは、ページではなくリストの最後に在庫切れの製品を移動することだったと思います。そのため、在庫のある商品の最初のNページが表示され、在庫切れの商品を表示すると、それ以降の在庫はすべて在庫切れになります。
マリウス

はい、別の解決策を試みます:)
mageUz

1
ソリューション2は魅力のように機能します!本当にありがとうございました!
デリックネル

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クラスを適切に拡張する方がはるかに良いでしょう。
リードブロムキスト14

1
おそらく、あなたはあなた自身の答えを追加し、それを行う方法を私たちに示すことができますか?
SR_Magento 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.