Magento - реимпорт товаров

У меня есть скрипт, который извлекает данные из стороннего файла. Мой импорт просто анализирует и вставляет строки, что работает нормально.

Проблема возникает с изображениями.

Когда запускается скрипт импорта, он сначала удаляет все текущие элементы, а затем начинается импорт, вставляя все продукты и изображения в галерею.

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

Я не хочу видеть эти пустые строки, но я не уверен, почему они там.

Может ли это быть связано с тем, что изображения товара уже есть в каталоге?

Я действительно не уверен, что и почему это делает то, что есть.

Спасибо

РЕДАКТИРОВАТЬ:

Мой код:

require_once('app/Mage.php');
$app = Mage::app('default');
$product = Mage::getSingleton('catalog/product');

$txt_file    = file_get_contents('test.txt');
$rows        = explode("\n", $txt_file);
array_shift($rows);

foreach($rows as $row => $data)
{
//get row data
$row_data = explode('^', $data);

$info[$row]['uniqueid']         = $row_data[0];
$info[$row]['client']           = $row_data[1];
$info[$row]['make']             = $row_data[2];
$info[$row]['model']            = $row_data[3];
$info[$row]['adtext']           = $row_data[4];

//display images
$row_images = explode(',', $info[$row]['picturereference']);

foreach($row_images as $row_image)
{
    $product->addImageToMediaGallery(Mage::getBaseDir('media') . DS . 'import/' . $row_image, array('image', 'small_image','thumbnail'), false, false);
}

$product->setStoreId(Mage::app()->getStore(true)->getWebsite()->getId());
$product->setWebsiteIds(array(Mage::app()->getStore(true)->getWebsite()->getId()));
$product->setId($info[$row]['id']); 
$product->setSku(strtolower($info[$row]['make']).'-'.strtolower($info[$row]['model'])); 
$product->setName($info[$row]['make']); 
$product->setDescription($info[$row]['adtext']);

    try {
    $product->save();
  echo "Saved";
    }
    catch (Exception $ex) {
      echo "<pre>".$ex."</pre>";
   }

}

Это потому, что addImageToMediaGallery вызывается на каждой итерации и добавляет все изображения к каждому продукту?

Спасибо


person terrid25    schedule 16.03.2011    source источник
comment
Не могли бы вы проверить в базе данных значения image, small_image и thumbnail для продукта и опубликовать эту информацию? Кроме того, проверьте, существуют ли в файловой системе пути к изображениям, указанным в этих трех полях?   -  person Joseph Mastey    schedule 17.03.2011
comment
@Joseph Mastey Я проверил, и все значения, кажется, в порядке. Проблема в том, что, похоже, импортируются все изображения в папку media/import для каждого продукта, независимо от того, связаны ли они на самом деле с этим продуктом или нет. Я просто хочу, чтобы изображения продукта были в галерее, а не все остальные.   -  person terrid25    schedule 17.03.2011


Ответы (3)


Хорошо, я понял свою проблему

Внутри foreach я переместил вызов в getSingleton и добавил следующее: $product = Mage::getModel('catalog/product');

Затем я после каждой итерации отключаю следующее:

    unset($product);
    unset($info);
    unset($stockData);
    unset($row_images);

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

Спасибо всем

person terrid25    schedule 24.03.2011

Несколько файлов, которые вы захотите изучить, чтобы разбить addImageToMediaGallery и определить, что именно он делает.

  1. app/code/core/Mage/Catalog/Model/Product.php - Содержит метод, который вы используете, с более подробной разбивкой, которую вы найдете...
  2. app/code/core/Mage/Catalog/Model/Product/Attribute/Backend/Media.php — Содержит больше «обрывков» addImageToMediaGallery, таких как addImage и т. д.

Некоторые возможности попробовать были бы либо

А) определить, существуют ли уже файлы и прикреплены ли они к продукту, и игнорировать их при втором раунде импорта. Возможно, ищет другой штамп файла. getMediaGalleryImages в Product.php.

B) очистить медиафайлы, связанные с продуктами, ПЕРЕД повторным импортом? clearMediaAttribute и removeImage в Media.php.

Я бы также попробовал установить для параметра $move значение true в вашем вызове addImageToMediaGallery.

/**
 * Add image to media gallery
 *
 * @param string        $file              file path of image in file system
 * @param string|array  $mediaAttribute    code of attribute with type 'media_image',
 *                                         leave blank if image should be only in gallery
 * @param boolean       $move              if true, it will move source file
 * @param boolean       $exclude           mark image as disabled in product page view
 */
public function addImageToMediaGallery($file, $mediaAttribute=null, $move=false, $exclude=true)
{

Другой вариант - попытаться указать null для второго параметра, если вы обратите внимание на комментарии PHPDoc, оставив его пустым, он будет только для галереи, которая звучит как то, что вы хотите...

foreach($row_images as $row_image)
{
    $product->addImageToMediaGallery(Mage::getBaseDir('media') . DS . 'import/' . $row_image, null, false, false);
}

Дайте мне знать, если что-то из этого поможет.

person B00MER    schedule 21.03.2011
comment
Итак, я попробовал последний пример, который вы мне дали, и это не изменило мою текущую проблему. Я также изменил свой addImageToMediaGallery на следующее: public function addImageToMediaGallery($file, $mediaAttribute=null, $move=true, $exclude=true). Это также не работает. Не могли бы вы предоставить мне пример того, как я буду использовать clearMediaAttribute и removeImage. Спасибо. - person terrid25; 21.03.2011

Попробуйте что-нибудь вроде этого:

//Check if gallery attribute exists then remove all images if it exists
//Get products gallery attribute
$attributes = $product->getTypeInstance()->getSetAttributes();          
if (isset($attributes['media_gallery'])) {
  $gallery = $attributes['media_gallery'];
  //Get the images
  $galleryData = $product->getMediaGallery();                               
  foreach($galleryData['images'] as $image){
    //If image exists
    if ($gallery->getBackend()->getImage($product, $image['file'])) {
      $gallery->getBackend()->removeImage($product, $image['file']);
    }
  }             
}

Это сообщение в блоге также может помочь, так как там я также получил форму фрагмента кода:

http://www.sharpdotinc.com/mdost/2010/03/02/magento-import-multiple-images-or-remove-images-durring-batch-import/

person B00MER    schedule 21.03.2011
comment
Я добавил этот код в свой скрипт импорта, но проблема все еще возникает. - person terrid25; 22.03.2011
comment
Я добавил этот код как в свой скрипт импорта, так и в реальный класс, но он все равно не работает. Я все еще получаю несколько изображений и пустых строк. - person terrid25; 23.03.2011