magento Bug与资源集合

时间:2013-11-01 09:14:33

标签: magento

我注意到magento行为有些奇怪。 它看起来像是一个错误,或者我错过了一些东西...... 我对retreive产品做了一个简单的查询

$collection = Mage::getResourceModel('catalog/product_collection')                                        
                                        ->addAttributeToSelect('price')
                                        ->addAttributeToSelect('sku')
                                        ->addAttributeToSelect('name')
                                        ->addAttributeToFilter(array(array(
                                                'attribute' => 'my_attribute',
                                                'eq' => 'my_value'          )
                                            ));
//Then I update 
foreach($collection as $_product){ 
  $_product->setData("name","my_other_val");  
   $_product->save();
}

Magento不仅会更新“名称”,还会更新所有必填字段并设置默认值!! 例如,它将“visibility”属性更改为“search,catalog”,同时产品具有另一个可见性!! 我现在使用我的可配置产品搞乱了,它也改变了其他属性。

你怎么解释这个?

我执行了相反操作,在保存产品时检索了整个属性列表,在此方法中: walkAttributes 它这样做:   案件'后端':                     $ instance = $ attribute-> getBackend();

检索所有属性。由于它们没有值(它们不在addAttributeToSelect部分中),因此它使用默认值。 一个解决方案是补充    - > addAttributeToSelect( '能见度') 和所有必需的属性。 但是太危险了,我可能会错过一个,或者可以使用所需属性添加新属性吗?

对我来说这是一个错误,因为默认值应仅适用于NON现有属性值,但是magento不进行检查,它会执行INSERT或UPDATE的查询。 SQL:INSERT INTO catalog_product_entity_intentity_type_idattribute_idstore_identity_idvalue)VALUES(?,?,?,?, ?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?)ON DUPLICATE KEY UPDATE value = VALUES({{1} }) ...

谢谢, 杆

2 个答案:

答案 0 :(得分:2)

这不是错误。这实际上是一个功能。加载产品集合时,出于性能原因,并未为产品加载所有属性 为了能够保存,您需要拨打$product->load($id)然后$product->save() 此外,您必须确保在ID为0(admin)的商店下运行脚本。保存仅适用于此。将其添加到脚本顶部

Mage::app()->setCurrentStore(Mage::getModel('core/store')->load(Mage_Core_Model_App::ADMIN_STORE_ID));

但这是另一个想法。不要使用save。这很慢,如果你不小心,你可以做一些伤害。请改用它。

Mage::getSingleton('catalog/product_action')->updateAttributes($productIds, $attributes, $storeId);

即使您不在管理存储中,它也会起作用,它只会更改您指定的属性。这就是参数的含义:

$productIds - 包含您需要更改的产品ID的数组。 array(12, 17, 219)
$attributes - 包含您想要更改内容的数组array('name'=>'Your name here', 'description'=>'Your description here')
$storeId - 您要进行更改的商店的ID。使用0作为默认值。

注意:如果要为不同的产品设置不同的属性值,则需要为每个属性值调用此属性值 例如,呼叫:

Mage::getSingleton('catalog/product_action')->updateAttributes(array(12, 17, 219), array('name'=>'Your name here'), 0);

将更改ID为12,17 and 219

的产品的名称

答案 1 :(得分:0)

您应该做的是在明确加载产品后,从收集结果中更新产品。

这是我的意思的一个例子:

$product_collection = Mage::getModel('catalog/product')
    ->getCollection()
    ->addAttributeToFilter(array(array(
        'attribute' => 'my_attribute',
        'eq' => 'my_value'
    )));

foreach ($product_collection as $p) {
    $product = Mage::getModel('catalog/product')->load(
        $p->getId()
    );
    $product->setName('NEW NAME HERE');
    try {
        $product->save();
        echo 'Product '. $product->getSku() .' has been updated.<br />';
    } catch (Exception $e) {
        echo 'Failed to update product '. $product->getSku() .' - '. $e->getMessage() .'<br />';
    }
}

我并不是说这是做这件事的唯一方法;但是这可以按预期工作。