is_salable은 어디에서 왔습니까?


27

참고 : PHP 코드로 제품을 편집 한 후 관리자에서 제품의 색인을 다시 생성하면 아래 나와 같이 표시되지 않는 이유를 알아 내기 위해 자기 시간을 절약하십시오.

나는 is_salable제품에 대한 설정 방법을 해결하려고 노력하면서 내 제품이 왜 보이고 있는지 이유를 알아 봅니다.

내가 찾을 수있는 코드에는 단 하나의 장소 만 있습니다.

$salable = $this->isAvailable();

그러나 나는 그것을 어디에서 얻을 수 있는지, 어떻게 또는 어디서 해결할 수는 없습니다 isAvailable.

/app/code/core/Mage/Catalog/Model/Product.php

    public function isSalable()
    {
        Mage::dispatchEvent('catalog_product_is_salable_before', array(
            'product'   => $this
        ));

        $salable = $this->isAvailable();

    $object = new Varien_Object(array(
        'product'    => $this,
        'is_salable' => $salable
    ));
    Mage::dispatchEvent('catalog_product_is_salable_after', array(
        'product'   => $this,
        'salable'   => $object
    ));
    return $object->getIsSalable();
}

여기에서 $ this-> isAvailable () 다음에 몇 줄이옵니다.

**public function isAvailable()
{ 
    return $this->getTypeInstance(true)->isSalable($this);
}**

그런 다음 app / code / core / Mage / Catalog / Model / Product / Type / Configurable.php 's isSalable을 호출합니다

public function isSalable($product = null)
{
    $salable = parent::isSalable($product);

    if ($salable !== false) {
        $salable = false;
        if (!is_null($product)) {
            $this->setStoreFilter($product->getStoreId(), $product);
        }
        foreach ($this->getUsedProducts(null, $product) as $child) {
            if ($child->isSalable()) {
                $salable = true;
                break;
            }
        }
    }

    return $salable;
}

다음은 부모를 호출합니다 : /app/code/core/Mage/Catalog/Model/Product/Type/Abstract.php's isSalable :

public function isSalable($product = null)
{
    $salable = $this->getProduct($product)->getStatus() == Mage_Catalog_Model_Product_Status::STATUS_ENABLED;
    if ($salable && $this->getProduct($product)->hasData('is_salable')) {
        $salable = $this->getProduct($product)->getData('is_salable');
    }
    elseif ($salable && $this->isComposite()) {
        $salable = null;
    }

    return (boolean) (int) $salable;
}

is_saleable 값에 대해 has / get 데이터 호출은 무엇입니까?!? 내가 제대로 추적 했습니까? 이 가치는 어디에서 오는가?

is_salable에 대한 설치에서 재귀 grep을 발행했습니다. 확실히 설정되어있는 줄을 표시해야하지만 즉시 볼 수는 없습니다.

grep -r is_salable *
app/code/core/Mage/CatalogInventory/Model/Stock/Status.php:            $object = new Varien_Object(array('is_in_stock' => $product->getData('is_salable')));
app/code/core/Mage/XmlConnect/Block/Wishlist.php:                $itemXmlObj->addChild('is_salable', (int)$item->getProduct()->isSalable());
app/code/core/Mage/XmlConnect/Block/Catalog/Product.php:            $item->addChild('is_salable', (int)$product->isSalable());
app/code/core/Mage/XmlConnect/Block/Cart/Crosssell.php:                $itemXmlObj->addChild('is_salable', 0);
app/code/core/Mage/XmlConnect/Block/Cart/Crosssell.php:                $itemXmlObj->addChild('is_salable', (int)$product->isSalable());
app/code/core/Mage/Catalog/Model/Product.php:        Mage::dispatchEvent('catalog_product_is_salable_before', array(
app/code/core/Mage/Catalog/Model/Product.php:            'is_salable' => $salable
app/code/core/Mage/Catalog/Model/Product.php:        Mage::dispatchEvent('catalog_product_is_salable_after', array(
app/code/core/Mage/Catalog/Model/Product.php:        if ($this->hasData('is_salable')) {
app/code/core/Mage/Catalog/Model/Product.php:            return $this->getData('is_salable');
app/code/core/Mage/Catalog/Model/Product/Type/Abstract.php:        if ($salable && $this->getProduct($product)->hasData('is_salable')) {
app/code/core/Mage/Catalog/Model/Product/Type/Abstract.php:            $salable = $this->getProduct($product)->getData('is_salable');

녹이다:

grep -r setIsSalable *
app/code/core/Mage/CatalogInventory/Model/Stock/Status.php:        $product->setIsSalable($stockStatus);
app/code/core/Mage/CatalogInventory/Model/Stock/Status.php:                    $product->setIsSalable($status);

setIsSalable이 아니라 찾기 / 생각하지 않은 것이 setIsSalable 입니다.

답변:


18

isAvailable() 다음과 같이 보입니다 :

public function isAvailable()
{
    return $this->getTypeInstance(true)->isSalable($this)
        || Mage::helper('catalog/product')->getSkipSaleableCheck();
}

즉, 방법의 결과는 제품 유형에 따라 다릅니다.
각 제품 유형에는 다음과 같은 isSalable()방법이 있습니다.

  • Mage_Catalog_Model_Product_Type_Grouped::isSalable() -그룹 제품
  • Mage_Catalog_Model_Product_Type_Configurable::isSalable() -구성 가능한 제품
  • Mage_Catalog_Model_Product_Type_Abstract::isSalable()-모든 제품 유형이 확장되므로 나머지 제품 유형의 경우 Mage_Catalog_Model_Product_Type_Abstract.
    전화가 $this->getTypeInstance(true)당신을 혼란스럽게 생각 합니다. 이 메소드 getTypeInstance()는 제품 모델의 인스턴스가 아니라 제품 유형의 인스턴스를 리턴합니다.

[편집]
간단한 제품의 경우이를이라고 Mage_Catalog_Model_Product_Type_Grouped::isSalable()합니다. 이 방법은 제품이 활성화되어 있는지 확인합니다. 그렇지 않으면 false반환됩니다. 활성화 is_salable되어 있으면 관찰자 중 한 사람이 설정할 수 있는 속성이 있는지 확인합니다 .
속성이없는 경우 제품 유형 인스턴스가 있는지 확인합니다 $this->isComposite(). 그렇다면 팔 수 없습니다.
구성 가능한 제품의 경우 위의 조건이 충족되는지와 구성 가능한 제품과 관련이있는 간단한 제품이 있는지 확인합니다 (위의 조건과 다시 한 번)
그룹화 된 제품에 대해서도 동일하지만 다른 방식으로 수행됩니다.

결론적 is_salable으로 존재할 필요는 없습니다. 그러나 그 속성을 설정하는 옵저버가있는 경우 제품 판매 가능 여부를 확인할 때 고려됩니다.
코어의 예제는 다음과 같습니다 . Mage_CatalogInventory_Model_Stock_Status::assignProduct()cals $product->setIsSalable()
Same 메소드 가 수행됩니다 Mage_CatalogInventory_Model_Stock_Status::addStockStatusToProducts.
마지막 이벤트는 이벤트에 의해 호출됩니다 catalog_product_collection_load_after.


당신의 도움에 다시 한 번 감사드립니다. 나는 isSalable과 Configurable.php의 isSalable을 추적했지만 Abstract.php의 isSalable을 호출하지만 'is_salable'을 확인하는 것이지만 설정이 없습니다. 위의 코드 흔적을 추가합니다.
Hayden Thring

내 질문에 추가
Hayden Thring

2
그렇습니다. 나는 내 대답에 그것을 언급했다 catalog_product_collection_load_after. 그러나 이것은 단지 예일뿐입니다. 설정 cataloginventory/observer::addInventoryData하는 호출 도 있습니다 . 다른 사람들도있을 수 있지만 나는 모든 것을 찾지 못했습니다. assignProductis_salable
Marius

1
이 작업을 수행하는 데 신뢰할 수있는 방법이 없습니다. 어쩌면 모든 이벤트를 가져 와서 catalog_product_해당 이벤트에서 관찰자가 호출 한 메소드를 디버그하십시오. 전화를 걸 setIsSalable거나setData('is_salable')
Marius

1
XmlConnect를 사용하면 모바일 응용 프로그램을 웹 사이트에 연결할 수 있습니다. 무시해.
Marius

2

Salable이 false를 반환하는 경우 다시 인덱싱하면 데이터를 다시 인덱싱하는 데 문제가 발생할 수 있음


0

재색 인화 및 디버깅 후 is_salable이 끝나지 않고 구성 가능한 제품이 여전히 품절로 표시되는 경우 모든 상점보기에서 모든 단순의 상태가 사용으로 설정되어 있는지 확인하십시오. 나는 모든 상점보기를 확인하고 일부 시체가 상태를 비활성화 할 때까지 내가 한 일에 관계없이 구성 가능한 재고가 부족한 이유에 대해 두 시간을 낭비했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.