재고가없는 제품을 카탈로그 목록의 끝까지 푸시해야합니다
이 문제를 해결하는 방법 또는 파헤칠 파일을 알려주십시오.
지금까지 나는 그것을 발견 Toolbar.php
하고 해결했습니다.
재고가없는 제품을 카탈로그 목록의 끝까지 푸시해야합니다
이 문제를 해결하는 방법 또는 파헤칠 파일을 알려주십시오.
지금까지 나는 그것을 발견 Toolbar.php
하고 해결했습니다.
답변:
이것은 재고품이 페이지 전체 목록의 끝으로 이동하지만 페이지 매김이 아닙니다.
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
.
이것은 재고품에서 페이지 매김 내리스트의 끝으로 이동합니다.
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
.
위의 논리는 카탈로그 정렬 / 페이지 매김 기능에 영향을 미치지 않으며 판매 할 수없는 제품 만 끝까지 이동합니다.
내 웹 사이트에서이 기능을 구현했습니다.
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');
캐시를 비우면 제품이 재고가있는 제품을 먼저 정렬하고 재고가없는 제품을 마지막으로 자동 정렬합니다.