2

我以某种方式遇到了一个问题,即有库存且数量超过 400000 的产品说它无法销售。或者更确切地说 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 Enterprise 1.12

我现在意识到对象调用返回错误。在一天结束时发布此内容的效果。

我将回声移到了事件调度之前,并且两者都返回为 1,因此我查看了事件并追踪了将其设置为 false 的位置。

我在 Enterprise/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()在 if 之外回显,则问题产品的状态为已关闭,而其他产品会抛出错误,因为 $event 不存在。

是什么导致了差异?

---编辑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)

同样,正常产品返回错误,因为产品上没有事件。

这个事件从哪里来?

随着我的进步,我会不断更新。

4

3 回答 3

1

弄清楚了。有一个目录事件集将状态设置为关闭。删除了活动,一切都很好。

于 2013-01-11T19:18:02.183 回答
0

我有点不清楚调试语句的输出是什么,但我能得出的唯一合乎逻辑的结论是:

variable: 1
object: 0

由于$object它是一个对象,它通过引用传递给事件,因此如果您的安装有任何事件监听器catalog_product_is_salable_after,这可能会修改该对象的值。由于isAvailable返回一个布尔值,$salable变量本身不能从事件内部修改,因此在事件侦听器中修改 'salable' 字段没有多大意义,因为在事件触发后不会检索该值,因此它永远不会被退回。

这完全是一种说法,如果在你的输出中$salable变量是 1,那么函数应该返回 1。

于 2013-01-11T08:54:32.630 回答
0

我偶然发现了 isSaleable() 总是在我的产品上返回 false 的问题,问题是我正在获取集合但没有将属性价格添加到集合中。在 isSaleable() 函数中有一个检查来确保价格不为 0,它需要 price 属性来检查:

改变:

$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();

成功了:)

于 2014-05-26T10:39:40.243 回答