재고가없는 제품을 카탈로그 제품 목록의 끝으로 이동


14

재고가없는 제품을 카탈로그 목록의 끝까지 푸시해야합니다

이 문제를 해결하는 방법 또는 파헤칠 파일을 알려주십시오.

지금까지 나는 그것을 발견 Toolbar.php하고 해결했습니다.



1
그것을 확인하십시오 ajit-techhub.blogspot.in/2012/01/…
Pavan Kumar

1
나는 magento를 처음 사용하므로 멍청한 질문 /app/code/core/Mage/Catalog/Model/Resource/Eav/Mysql4/Product/Collection.php-이 파일은 비어 있습니다. 괜찮습니까?
Alexandr Sopkov

필자는 파일을 잘 모르지만 Magento가 제품 컬렉션을 구축하는 위치를 찾은 다음 stackoverflow.com/questions/4803495/…
kevando

3
답변이 없으면 너무 오래 되었기 때문에이 질문을 주 제외로 닫으
려고합니다.

답변:


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.

위의 논리는 카탈로그 정렬 / 페이지 매김 기능에 영향을 미치지 않으며 판매 할 수없는 제품 만 끝까지 이동합니다.


이것이 효과가 있습니까? 그것은 페이지 매김에 영향을 미치지 않지만, 하단의 현재 페이지에서 재고가없는 제품을 옮길 것입니다. 따라서 다음 페이지로 이동하면 이전 페이지에서 일부 재고가없는 것을 확인한 후 재고 제품에 표시 될 수 있습니다.
Marius

예 그것은 매김의 모든 페이지에 목록의 마지막에 재고 제품 밖으로 이동합니다
mageUz

여기서해야 할 일은 페이지가 아닌 목록 끝에서 품절 된 제품을 옮기는 것이 었습니다. 따라서 재고가있는 제품의 첫 N 페이지가 표시되고 품절 된 제품을 본 후에는 다른 모든 제품이 재고가 없습니다.
Marius

예, :) 다른 솔루션을 제공하기 위해 노력하겠습니다
mageUz

1
솔루션 2는 매력처럼 작동합니다! 대단히 감사합니다!
데릭 넬

0

내 웹 사이트에서이 기능을 구현했습니다.

  • Collection.php를 /app/code/core/Mage/Catalog/Model/Resource/Product/Collection.php에서 / app / code / local / Mage / Catalog / Model / Resource / Product /로 복사하십시오.

  • 1570 행 주위의 Collection.php 편집 텍스트 찾기 $ 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 클래스를 올바르게 확장하는 것이 훨씬 좋습니다.
리드 Blomquist

1
아마도 당신은 당신의 자신의 답변을 추가하고 그 방법을 보여줄 수 있습니까?
SR_Magento
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.