Magento - 重新进口产品

时间:2011-03-16 16:53:12

标签: magento magento-1.4

我有一个从第三方文件中提取数据的脚本。我的导入只是解析和插入行,这是正常的。

问题来自图像。

当导入脚本运行时,它首先删除所有当前项目,然后导入开始时,插入的所有的产品和图像转换成库。

在第一次导入时,一切都很好,图像进入,我在前端看到它们没问题。这个问题是与每次我然后重新导入这些产品,它不'吨似乎删除所有图像,因为当产品重新进口,我明白了,例如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并将所有图像添加到每个产品中吗?

由于

3 个答案:

答案 0 :(得分:2)

好的,所以我想出了我的问题

foreach内,我将来电移至getSingleton,我添加了以下内容:$product = Mage::getModel('catalog/product');

然后,我在每次迭代后取消设置以下内容:

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

这似乎修复了我的脚本,现在将每个产品图像导入到正确的产品中,而不是导入其他产品并添加随机空白条目

全部谢谢

答案 1 :(得分:0)

您需要检查的几个文件可以分解addImageToMediaGallery并确定它究竟在做什么。

  1. app/code/core/Mage/Catalog/Model/Product.php - 包含您使用的方法,将其分解得更多......
  2. app/code/core/Mage/Catalog/Model/Product/Attribute/Backend/Media.php - 包含addImageToMediaGallery之类的addImage等“点点滴滴”等更多内容。
  3. 尝试的一些可能性是

    A)确定文件是否已存在并附加到产品并在第二轮导入时忽略它们。也许正在寻找不同的文件标记。 Product.php中的getMediaGalleryImages

    B)在再次导入之前清除与产品相关的媒体文件? Media.php中的clearMediaAttributeremoveImage

    我也会尝试在addImageToMediaGallery来电中将$ move选项设置为true。

    /**
     * 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);
    }
    

    如果有任何帮助,请告诉我。

答案 2 :(得分:0)

尝试这样的事情:

//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/