Magento - реимпортирование продукции - PullRequest
0 голосов
/ 16 марта 2011

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

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

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

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

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

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

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

Спасибо

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

Мой код:

<code>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."
";}}

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

Спасибо

Ответы [ 3 ]

2 голосов
/ 24 марта 2011

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

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

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

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

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

Спасибо всем

0 голосов
/ 21 марта 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/

0 голосов
/ 21 марта 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 и т. Д.

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

A) определить, существуют ли файлы и прикреплены ли они к продукту, и игнорировать их при втором раунде импорта. Возможно, ищу другой файл марки. 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)
{

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

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

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

...