2013-11-01 2 views
2

Я заметил что-то странное в поведении пурпурного цвета. это выглядит либо ошибка, или я что-то пропустил ... я сделать простой запрос, чтобы извлечь продуктыmagento Bug with ressource collection

$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 будет не только обновление «имя», то она обновит все необходимые поля и установить по умолчанию стоимость!! Так, например, он изменяет атрибут «видимости» на «поиск, каталог», в то время как продукты имеют другую видимость! У меня есть беспорядок теперь с моими настраиваемыми продуктами, и он изменяет и другие атрибуты.

Как вы это объясните?

Я сделал обратный и весь список атрибутов извлекается при сохранении продукта, в этом методе: walkAttributes он делает это: случай «бэкенд»: $ Экземпляр = $ attribute-> getBackend();

Которые извлекают ВСЕ атрибуты. Поскольку они не имеют значения (они не находятся в секции addAttributeToSelect), то он использует значение по умолчанию. Один раствор должен добавить -> addAttributeToSelect ('видимость') и все необходимые атрибуты. , но слишком опасно, я мог бы пропустить один, или новый атрибут можно было бы добавить с нужным атрибутом?

Для меня это ошибка, так как значение по умолчанию должно применяться только к несуществующему значению атрибута, но Magento не делает чек, он делает этот запрос, либо INSERT или UPDATE .. SQL: INSERT INTO catalog_product_entity_int (entity_type_id , attribute_id, store_id, entity_id, value) ЦЕННОСТИ (?,?,?,?,?), (?,?,?,?,?), (?,?,?,?,?), (?,? ,?,?,?) дублированием значение ключа UPDATE = VALUES (value) ...

Спасибо, Род

ответ

2

Это не ошибка. Это на самом деле особенность. При загрузке коллекции продуктов не все атрибуты загружаются для продукта по соображениям производительности.
Для того, чтобы его сохранить, вам необходимо позвонить в $product->load($id), а затем $product->save().
Также вы должны убедиться, что используете свой скрипт под хранилищем с идентификатором 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); 

Это работает, даже если вы не находитесь в хранилище admin и изменяете только указанные вами атрибуты. Вот что означают эти параметры:

$productIds - массив с идентификаторами продуктов, которые необходимо изменить. array(12, 17, 219)
$attributes - массив, что вы хотите изменить array('name'=>'Your name here', 'description'=>'Your description here')
$storeId - идентификатор магазина, для которого вы делаете изменения. Используйте значения 0 для значений по умолчанию.

Примечание. Если вы хотите установить разные значения атрибутов для разных продуктов, вам нужно вызвать это для каждого значения атрибута.
Например, призывающей:

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

изменит имя для продуктов с идентификатором 12,17 and 219

+0

эй !! Это фантастика!! спасибо за это. Мне это нравится :-) В настоящее время я использую «core_write» и ручной запрос обновления для достижения хорошей производительности с конкретными процессами, но тот, который вы только что описали здесь, настолько велик! еще раз спасибо. прут – Rod

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 />'; 
    } 
} 

Я не говорю, что это единственный способ сделать это; однако это работает по назначению.

+0

спасибо за быстрый ответ, это на самом деле именно то, что я только что сделал. Поэтому я понимаю, что это не ошибка, а правило, которое вы должны ЗАГРУЗИТЬ перед любым обновлением. это ново для меня. Благодарю. Rod – Rod

Смежные вопросы