Magento以编程方式删除产品图像

22 product image magento

这必须是一个如此简单的编程任务,我绝对无法在网上找到任何有关它的信息.基本上,我正在尝试删除产品图像.我想删除产品媒体库中的所有图片.我可以这样做而不需要花费数百万行代码来完成这么简单的任务吗?

请注意,我已经尝试过这个:

$attributes = $product->getTypeInstance()->getSetAttributes();
if (isset($attributes['media_gallery'])) {
    $gallery = $attributes['media_gallery'];
    $galleryData = $product->getMediaGallery();//this returns NULL

    foreach($galleryData['images'] as $image){
        if ($gallery->getBackend()->getImage($product, $image['file'])) {
            $gallery->getBackend()->removeImage($product, $image['file']);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这绝对不行.我试图在导入过程中删除图像,这样我就不会产生重复的图像.任何帮助将不胜感激.

小智 45

好的,这就是我最终解决问题的方法.

if ($product->getId()){
    $mediaApi = Mage::getModel("catalog/product_attribute_media_api");
    $items = $mediaApi->items($product->getId());
    foreach($items as $item)
        $mediaApi->remove($product->getId(), $item['file']);
}
Run Code Online (Sandbox Code Playgroud)

这是最终让我直截了当的链接:http://www.magentocommerce.com/wiki/doc/webservices-api/api/catalog_product_attribute_media

太糟糕了,它不像$ product-> getImages()那么简单,是吗?

  • 快速注意:如果商店对象的ID未设置为管理商店的ID("0"),现代版本的Magento将不允许您以编程方式保存产品.如果您从前端商店上下文中使用上述内容,请务必调用`Mage :: app() - > getStore() - > setId(Mage_Core_Model_App :: ADMIN_STORE_ID);`首先. (11认同)

小智 9

在Magento 1.7.0.2中,我使用此代码删除产品库中的所有图像:

//deleting
Mage::app()->getStore()->setId(Mage_Core_Model_App::ADMIN_STORE_ID);
$mediaApi = Mage::getModel("catalog/product_attribute_media_api");
$items = $mediaApi->items($product->getId());
$attributes = $product->getTypeInstance()->getSetAttributes();
$gallery = $attributes['media_gallery'];
foreach($items as $item){
    if ($gallery->getBackend()->getImage($product, $item['file'])) {
        $gallery->getBackend()->removeImage($product, $item['file']);
    }
}
$product->save();
Run Code Online (Sandbox Code Playgroud)

使用来自Davids Tay的代码回答,我收到错误:致命错误:未捕获异常'Mage_Eav_Model_Entity_Attribute_Exception',消息'SQLSTATE [23000]:完整性约束违规:1452无法添加或更新子行:外键约束失败(base_xxx.catalog_product_entity_media_gallery_value,CONSTRAINT FK_CAT_PRD_ENTT_MDA_GLR_VAL_VAL_ID_CAT_PRD_ENTT_MDA_GLR_VAL_IDFOREIGN KEY(value_id)REFERENCES`nalog_prod)'


Pih*_*htt 8

要从产品库中删除所有图像:

$product = Mage::getModel('catalog/product')->load($id);
$mediaGalleryAttribute = Mage::getModel('catalog/resource_eav_attribute')->loadByCode($entityTypeId, 'media_gallery');
$gallery = $product->getMediaGalleryImages();
foreach ($gallery as $image)
    $mediaGalleryAttribute->getBackend()->removeImage($product, $image->getFile());
$product->save();
Run Code Online (Sandbox Code Playgroud)

  • 或者只是:$ entityTypeId = $ product-> getEntityTypeId(); 对于仍在阅读此主题的人=) (6认同)
  • $ entityTypeId = Mage :: getModel('eav/entity') - > setType('catalog_product') - > getTypeId(); (2认同)

Via*_*iuk 5

在删除图像期间,我发现了一件有趣的事情.当您尝试此代码时:

$galleryData = $product->getMediaGallery(); //this returns NULL
Run Code Online (Sandbox Code Playgroud)

媒体库对象取决于您的产品的创建方式,如果:

$product = Mage::getModel('catalog/product')->loadByAttr('sku', $sku);
Run Code Online (Sandbox Code Playgroud)

然后媒体画廊将是空的,如果:

$product = Mage::getModel('catalog/product')->load($id);
Run Code Online (Sandbox Code Playgroud)

然后媒体库是对象,您可以使用此对象从数据库中删除图像.要从文件系统中删除图像,您必须添加以下代码:

@unlink(Mage::getBaseDir('media') . '\catalog\product\' . $image['file']);
Run Code Online (Sandbox Code Playgroud)

但如果您想更改图像并将其命名为先前的图像(image1.png替换为image1.png),则在这种情况下您将遇到浏览器缓存问题.

您还可以尝试加载产品的媒体库:

$product->getResource()->getAttribute('media_gallery')->getBackend()->afterLoad($product);
Run Code Online (Sandbox Code Playgroud)


CVM*_*CVM 3

希望这个答案不会不受欢迎,因为从技术上讲,它不是通过 Magento 编程实现的解决方案,正如您所要求的,但我已经成功地自己清除了所有画廊图像以达到相同的目的,只需截断 Magento 1.4.2.0 中的相关表(我相信它是1.5 中的表结构也相同)。

TRUNCATE TABLE `catalog_product_entity_media_gallery`
TRUNCATE TABLE `catalog_product_entity_media_gallery_value`
Run Code Online (Sandbox Code Playgroud)

然后删除/media/catalog/product目录中的所有图像文件。

我确实自己寻找一种以编程方式执行此操作的方法,但发现这种方法效率更高,并且没有经历任何负面副作用。

  • 真的截断吗?在繁重的相关数据结构上,这只会为未来的麻烦尖叫,因为 truncate 将增量 id-s 设置为 0,并从此时开始预期错误的数据关系。DELETE 就是您正在查找的那个(如果有的话)。 (5认同)