addInStockFilterToCollection ()의 반대쪽에서 재고가없는 항목의 제품 콜렉션을 얻는 방법은 무엇입니까?


9

카테고리의 제품을 두 가지 목록으로 표시해야합니다. 하나는 재고 품목에 대한 것이고 다른 하나는 재고 품목에 대한 것입니다.

나는 사용하고있다

Mage::getSingleton('cataloginventory/stock')->addInStockFilterToCollection()

재고가있는 품목에 대해 내 제품 콜렉션을 필터링하지만 재고가없는 품목을 필터링하는 동등한 방법이없는 것 같습니다 Mage_CatalogInventory_Model_Stock. 위에서 언급 한 방법이 정의 된 모델을 살펴 보았습니다 .

품절 된 제품을 검색하는 다음 예를 보았습니다.

$collection->joinField(
                    'is_in_stock',
                    'cataloginventory/stock_item',
                    'is_in_stock',
                    'product_id=entity_id',
                    '{{table}}.stock_id=1',
                    'left'
            )
            ->addAttributeToFilter('is_in_stock', array('eq' => 0));

...하지만 반드시 이것을 달성하는 가장 좋은 방법은 아니십니까?

답변:


3

$collection이것이 다음과 같이 빌드하는 제품 모음 이라고 가정 해 봅시다 .

$collection = Mage::getModel('catalog/product')->getCollection()
    ->...additional filters here...;

이제 컬렉션에이 작업을 수행하십시오. 컬렉션을 재고 상태 테이블과 조인합니다.

$website = Mage::app()->getWebsite();
Mage::getModel('cataloginventory/stock_status')->addStockStatusToSelect($collection, $website);

이제 품절 된 제품을 필터링 할 수 있습니다.

$collection->getSelect()->where('stock_status.stock_status = ?', 0);

각 제품의 인벤토리에 어떤 구성 옵션이 설정되어 있든 상관없이 작동합니까? (예 : 재고가 없거나 재고가없는 제품입니까?)
— BrynJ

재고 테이블이 색인화되고 가능한 모든 설정을 고려하기 때문에 작동해야합니다. 당신은 당신의 주식 지수가 최신인지 확인해야합니다
— Marius

확인해 주셔서 감사합니다. 이것은이 데이터를 얻는 좋은 "경량"접근 방식처럼 보입니다.
— BrynJ

재고 품목 테이블 대신 재고 상태 색인 테이블을 사용하는 것이 실제로 최상의 솔루션입니다.
— Fabian Schmengler

제품 select를 함수 Mage :: getModel ( 'cataloginventory / stock_status')-> addStockStatusToSelect ($ collection-> getSelect (), $ website)에 첫 번째 인수로 보내야했습니다.
— Minlare

2

이 예에서는 "use config"값을 고려하지 않았습니다.

addInStockFilterToCollection작동 방식을 살펴 보겠습니다 .

public function addInStockFilterToCollection($collection)
{
    $this->getResource()->setInStockFilterToCollection($collection);
    return $this;
}

좋아, 다른 방법으로 위임하고 있습니다.

public function setInStockFilterToCollection($collection)
{
    $manageStock = Mage::getStoreConfig(Mage_CatalogInventory_Model_Stock_Item::XML_PATH_MANAGE_STOCK);
    $cond = array(
        '{{table}}.use_config_manage_stock = 0 AND {{table}}.manage_stock=1 AND {{table}}.is_in_stock=1',
        '{{table}}.use_config_manage_stock = 0 AND {{table}}.manage_stock=0',
    );

    if ($manageStock) {
        $cond[] = '{{table}}.use_config_manage_stock = 1 AND {{table}}.is_in_stock=1';
    } else {
        $cond[] = '{{table}}.use_config_manage_stock = 1';
    }

    $collection->joinField(
        'inventory_in_stock',
        'cataloginventory/stock_item',
        'is_in_stock',
        'product_id=entity_id',
        '(' . join(') OR (', $cond) . ')'
    );
    return $this;
}

다음 조건으로 인벤토리 테이블을 조인합니다.

  1. 제품은 글로벌 구성을 사용하지 않는 및 "예"로 설정을 "재고 관리"가 AND 재고가

    또는

  2. 제품은 글로벌 구성을 사용하지 않는 및 "아니오"에 "재고 관리"세트가 있습니다

    또는

  3. 제품은 글로벌 구성을 사용 및 글로벌 구성이 "관리 재고 = 예", 재고가

다음과 같이 조건을 반전해야합니다.

  1. 제품은 글로벌 구성을 사용하지 않는 및 "예"로 설정을 "재고 관리"가 및 재고가없는

    또는

  2. 제품은 글로벌 구성을 사용 및 글로벌 구성은 "예 = 재고 관리"입니다 및 재고가없는

설명 : in_stock이 실제로 점검되는 조건 만 취하고 비교를 0으로 변경합니다. in_stock이 점검되지 않은 조건 ( "관리 재고"= "아니오")은 재고 상태에 관계없이 제품이 항상 재고 상태임을 의미합니다. 따라서 "재고 없음"쿼리에 포함하지 않습니다.

그런 다음이 코드입니다.

public function setOutOfStockFilterToCollection($collection)
{
    $manageStock = Mage::getStoreConfig(Mage_CatalogInventory_Model_Stock_Item::XML_PATH_MANAGE_STOCK);
    $cond = array(
        '{{table}}.use_config_manage_stock = 0 AND {{table}}.manage_stock=1 AND {{table}}.is_in_stock=0'
    );

    if ($manageStock) {
        $cond[] = '{{table}}.use_config_manage_stock = 1 AND {{table}}.is_in_stock=0';
    }

    $collection->joinField(
        'inventory_in_stock',
        'cataloginventory/stock_item',
        'is_in_stock',
        'product_id=entity_id',
        '(' . join(') OR (', $cond) . ')'
    );
    return $this;
}

훌륭한 자세한 답변. 따라서 Mage_CatalogInventory_Model_Stock모델 을 확장하기 위해이를위한 모듈을 만드는 것이 좋습니다 .
— BrynJ

1
다시 쓰거나 확장하지 않습니다. 이 방법을 사용하지 않는 곳이라면 어디든지 넣을 수 있습니다 $this. 일반 기능 일 수도 있습니다. 별도의 모듈을 만들어 도우미 메소드로 만들 것입니다 (또는 다른 모듈에 필요한 경우 해당 모듈의 도우미에 추가)
— Fabian Schmengler

1

다음 코드 스 니펫은 'Enable', Visibility 'catalog, search'및 Stock Availability 'Out of stock'상태 인 카테고리의 제품을 반환합니다.

$productDetails = Mage::getModel('catalog/category')->load($cat_id)
                  ->getProductCollection()
                  ->addAttributeToSelect('*');

$productDetails->addAttributeToFilter('visibility', 4); 
$productDetails->addAttributeToFilter('status', 1); 
$productDetails->joinField('is_in_stock',
                            'cataloginventory/stock_item',
                            'is_in_stock',
                            'product_id=entity_id',
                            'is_in_stock=0',
                            '{{table}}.stock_id=1',
                            'left');

0

당신은 이것을 시도 할 수 있습니다.

 $manageStock = Mage::getStoreConfig(Mage_CatalogInventory_Model_Stock_Item::XML_PATH_MANAGE_STOCK);
        $cond = array(
            '{{table}}.use_config_manage_stock = 0 AND {{table}}.manage_stock=1 AND {{table}}.is_in_stock=0',
            '{{table}}.use_config_manage_stock = 0 AND {{table}}.manage_stock=0',
        );

        if ($manageStock) {
            $cond[] = '{{table}}.use_config_manage_stock = 1 AND {{table}}.is_in_stock=0';
        } else {
            $cond[] = '{{table}}.use_config_manage_stock = 1';
        }

        $collection->joinField(
            'inventory_in_stock',
            'cataloginventory/stock_item',
            'is_in_stock',
            'product_id=entity_id',
            '(' . join(') OR (', $cond) . ')'
        );

아니면 이것을 시도 할 수 있습니다

  $manageStock = Mage::getStoreConfig(Mage_CatalogInventory_Model_Stock_Item::XML_PATH_MANAGE_STOCK);
        $cond = array(
            '{{table}}.use_config_manage_stock = 0 AND {{table}}.manage_stock=1 AND {{table}}.is_in_stock=0',
            '{{table}}.use_config_manage_stock = 0 AND {{table}}.manage_stock=0',
        );

        if ($manageStock) {
            $cond[] = '{{table}}.is_in_stock=0';


        $collection->joinField(
            'inventory_in_stock',
            'cataloginventory/stock_item',
            'is_in_stock',
            'product_id=entity_id',
            '(' . join(') OR (', $cond) . ')'
        );

100 % 확실하지 않습니다.


감사합니다 @AmitBera. 답변에 대한 컨텍스트를 제공하고 차이점을 설명해 주시겠습니까?
— BrynJ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.