2013-01-10 73 views
2

我碰到了一個問題,那就是庫存量超過400000的產品說不能銷售。或者更確切地說,isSalable不會返回一個值。Magento isSalable什麼也沒有返回

我拉起了功能來看看,我注意到一些奇怪的東西。

下面是函數:

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 
    )); 
    // echo "variable: ".$salable."<br />object: ".$object->getIsSalable(); 

    return $object->getIsSalable(); 
} 

註釋的回波是看到的值,然後將其放入對象並從該對象中檢索到的值。在問題產品,我得到:

variable: 1 
object: 

上的其他產品他們都回來爲1

有誰知道什麼會導致這種情況發生?

---編輯---

對不起,該函數返回$object->getIsSalable(),不$salable

這是Magento企業1.12

現在我意識到,對象調用返回false。在一天結束時張貼這些內容的效果。

我將回聲移至事件派發之前,並且都回來爲1,所以我查看事件並追蹤它將其設置爲false的位置。

我就跟蹤到這個功能在企業/ CatalogEvent:

public function applyIsSalableToProduct(Varien_Event_Observer $observer){ 
    $event = $observer->getEvent()->getProduct()->getEvent(); 
    echo "<br />".$event->getStatus()."<br />"; 
    if ($event && in_array($event->getStatus(), array(
       Enterprise_CatalogEvent_Model_Event::STATUS_CLOSED, 
       Enterprise_CatalogEvent_Model_Event::STATUS_UPCOMING 
    ))) { 
     $observer->getEvent()->getSalable()->setIsSalable(false); 
    } 
    return $this; 
} 

如果我贊同$event->getStatus()外,如果,問題產品給出了封閉狀態,和其他產品一個錯誤,因爲$事件沒有按」不存在。

什麼是造成差異?

--- EDIT 2 ---

我發現,封閉從產品事件的到來。

$event = $observer->getEvent()->getProduct()->getEvent(); 

我回到isSalable()和對象創建後添加print_r($this->getEvent()->getData());並得到了這一點:

Array([event_id] => 3 [category_id] => 12 [date_start] => 2012-11-28 09:54:00 [date_end] => 2012-11-29 09:54:00 [display_state] => [sort_order] => [status] => closed) 

再次,正常的產品帶回來一個錯誤,因爲沒有對產品的任何事件。

此活動來自哪裏?

隨着我的進步,我會不斷更新。

+0

我有點困惑。您在說「isSalable沒有返回值」,但也是「在問題產品上,變量返回值爲1」。看看你發佈的方法isSalable(),它返回變量$可銷售到最後,你說在問題產品上是1,因此應該返回1? – mpaepper

回答

1

想通了。有一個目錄事件集合將狀態設置爲關閉。刪除了事件,一切都很順利。

0

我有點不清楚你的調試語句的輸出是什麼,但我能想出的唯一合乎邏輯的結論是,它是:

variable: 1 
object: 0 

由於$object是它傳遞了一個對象因此如果您的安裝具有事件catalog_product_is_salable_after的事件偵聽器,則可以修改該對象上的值。由於isAvailable返回一個布爾值,所以$salable變量本身不能從事件內部修改,因此修改事件偵聽器中的「可銷售」字段沒有太大意義,因爲在事件觸發後沒有檢索到該值,因此它永遠不會被退回。

這是所有關於說,如果在你的輸出$salable變量爲1的方式輪,函數應該返回1.

+0

對不起,我搞砸了回報。它應該是'$ object-> getIsSalable()'。回聲的變量爲1,但對象調用沒有任何內容,只是空白。 – Ryan

0

我偶然發現了isSaleable()總是在我的產品上返回false的問題,問題是我得到的是集合,但沒有將屬性的價格添加到集合中。 在isSaleable()函數有一個檢查,以確保價格不爲0,它需要的價格屬性檢查這樣:

更改:

$collection = Mage::getModel('catalog/product')->getCollection(); 
     $collection->addAttributeToSelect('name') 
       ->addAttributeToSelect('image') 
       ->addAttributeToSelect('url_path') 
       ->addAttributeToSelect('status') 
       ->addUrlRewrite(); 

要:

$collection = Mage::getModel('catalog/product')->getCollection(); 
     $collection->addAttributeToSelect('name') 
       ->addAttributeToSelect('image') 
       ->addAttributeToSelect('price') 
       ->addAttributeToSelect('url_path') 
       ->addAttributeToSelect('status') 
       ->addUrlRewrite(); 

訣竅:)