2013-01-10 76 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(); 

诀窍:)