我遇到了一个问题,一个有库存且数量超过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)
同样,正常产品会因错误而返回,因为产品上没有任何事件。
此事件来自哪里?
随着我的进步,我会不断更新。
答案 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();
诀窍:)