我有一个从第三方文件中提取数据的脚本。我的导入只是解析和插入行,这是正常的。
问题来自图像。
当导入脚本运行时,它首先删除所有当前项目,然后导入开始时,插入的所有的产品和图像转换成库。
在第一次导入时,一切都很好,图像进入,我在前端看到它们没问题。这个问题是与每次我然后重新导入这些产品,它不'吨似乎删除所有图像,因为当产品重新进口,我明白了,例如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
并将所有图像添加到每个产品中吗?
由于
答案 0 :(得分:2)
好的,所以我想出了我的问题
在foreach
内,我将来电移至getSingleton
,我添加了以下内容:$product = Mage::getModel('catalog/product');
然后,我在每次迭代后取消设置以下内容:
unset($product);
unset($info);
unset($stockData);
unset($row_images);
这似乎修复了我的脚本,现在将每个产品图像导入到正确的产品中,而不是导入其他产品并添加随机空白条目
全部谢谢
答案 1 :(得分:0)
您需要检查的几个文件可以分解addImageToMediaGallery
并确定它究竟在做什么。
app/code/core/Mage/Catalog/Model/Product.php
- 包含您使用的方法,将其分解得更多...... app/code/core/Mage/Catalog/Model/Product/Attribute/Backend/Media.php
- 包含addImageToMediaGallery
之类的addImage
等“点点滴滴”等更多内容。尝试的一些可能性是
A)确定文件是否已存在并附加到产品并在第二轮导入时忽略它们。也许正在寻找不同的文件标记。 Product.php中的getMediaGalleryImages
。
B)在再次导入之前清除与产品相关的媒体文件? Media.php中的clearMediaAttribute
和removeImage
。
我也会尝试在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']);
}
}
}
此博客文章也可能有所帮助,因为我在其中获得了代码段表单: