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.