循环产品收集和保存产品正在改变属性值意外更改

时间:2011-04-19 17:23:53

标签: php magento

我正在通过产品集合运行循环,如下所示

$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产品上进行产品收集时,它正在逐渐消失

2 个答案:

答案 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