我正在通过产品集合运行循环,如下所示
$productCollection = Mage::getModel('catalog/product')->getCollection()
->addAttributeToSelect('small_image')
->addAttributeToSelect('thumbnail')
->addAttributeToSelect('image')
->addAttributeToSelect('sku');
foreach($productCollection as $product){
$product->setSmallImage($product->getImage());
$product->setThumbnail($product->getImage());
$product->save();
}
我将其他图像类型设置为与基本图像相同,因为客户端忘记在导入表中设置它们。出于某种原因,在执行此操作时,将所有产品的可见性设置为“目录”,“搜索”。很多我的产品都被认为是“不可见的单独”,所以当然这会让人感到困惑。
任何想法为什么这个值会改变,还有其他值可能会根据我在产品集合中的循环方式而改变吗?
我认为这是因为我删除了addAttributeToSelect(*)并且特定于这两个属性,但是当尝试在18k产品上进行产品收集时,它正在逐渐消失
答案 0 :(得分:4)
好的,这就是我发现的。在Magento中保存对象时,它将调用普通的模型抽象保存方法,然后调用$this->_getResource()->save($this);
,它将调用实体抽象保存方法,该方法最终会调用/app/code/core/Mage/Eav/Model/Entity/Abstract.php and its _beforeSave()
方法调用{{1} }} 方法。
所有属性加载实体的Resource对象的方式很长。 walkAttributes方法将遍历与实体关联的所有属性,并调用此方法call_user_func_array(array($ instance,$ method),$ args);在我的例子中,它正在调用属性的beforeSave方法,正如你在这里看到的那样
walkAttributes($partMethod, array $args=array())
因此任何没有任何数据并且具有默认值的属性,该默认值都应用于该对象,在意义上覆盖我刚刚未加载到我的对象的数据。我猜测循环数千种产品的最佳方法是将pageSize设置为服务器可以处理加载的数字,然后设置addAttributeToSelect('*')。但是我不知道正确循环这个的最佳方法,所以对我来说,我可能只是在for循环中加载产品而不是设置属性来选择所有。
这是我尝试循环整个集合,请发布任何改进
/app/code/core/Mage/Eav/Model/Entity/Attribute/Backend/Abstract.php
public function beforeSave($object)
{
$attrCode = $this->getAttribute()->getAttributeCode();
if (!$object->hasData($attrCode) && $this->getDefaultValue()) {
$object->setData($attrCode, $this->getDefaultValue());
}
}
我还想听到关于这是否是正确思考或解释问题的任何其他意见。
答案 1 :(得分:0)
我实际上找到了一种更好的方法来循环遍历一个大型集合,即使用资源迭代器模型,这是一个关于如何从Fontis人员那样做的教程
http://www.fontis.com.au/blog/magento/loading-large-collections