Magento可以退货

时间:2013-01-10 20:54:59

标签: php magento

我遇到了一个问题,一个有库存且数量超过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。

有谁知道会导致这种情况发生的原因?

--- --- EDIT

抱歉,该函数返回$object->getIsSalable(),而不是$salable

这是在 Magento Enterprise 1.12

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

我在事件发送之前将回显移动到两个回复为1所以我调查了事件并追踪它将其设置为假的位置。

我在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;
}

如果我在if之外回显$event->getStatus(),则问题产品会提供关闭状态,而其他产品会因为$ 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)

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

此事件来自哪里?

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

3 个答案:

答案 0 :(得分:1)

想出来。有一个目录事件集将状态设置为关闭。删除了活动,一切都很顺利。

答案 1 :(得分:0)

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

variable: 1
object: 0

由于$object是一个对象,因此它通过引用传递给事件,因此如果您的安装具有事件catalog_product_is_salable_after的任何事件侦听器,则可以修改该对象的值。由于isAvailable会返回一个bool,但$salable变量本身无法从事件内部进行修改,因此修改可销售的&#39;事件监听器中的字段,因为在事件触发后不检索该值,因此永远不会返回该值。

这是一个说明如果在你的输出中$salable变量是1,函数应该返回1的方法。

答案 2 :(得分: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();

诀窍:)