这必须是一个如此简单的编程任务,我绝对无法在网上找到任何有关它的信息.基本上,我正在尝试删除产品图像.我想删除产品媒体库中的所有图片.我可以这样做而不需要花费数百万行代码来完成这么简单的任务吗?
请注意,我已经尝试过这个:
$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()那么简单,是吗?
小智 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_ID
FOREIGN KEY(value_id
)REFERENCES`nalog_prod)'
要从产品库中删除所有图像:
$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)
在删除图像期间,我发现了一件有趣的事情.当您尝试此代码时:
$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)
希望这个答案不会不受欢迎,因为从技术上讲,它不是通过 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目录中的所有图像文件。
我确实自己寻找一种以编程方式执行此操作的方法,但发现这种方法效率更高,并且没有经历任何负面副作用。