在Magento后台删除产品时,默认不会删除产品的图片,如果长期不清理这些废弃的图片,会导致Media目录下的文件越来越多,浪费服务器空间,为了实现删除产品的同时删除图片,网络上常见的方法是修改Mage_Catalog_Model_Product的delete()方法:
  1. public function delete()
  2. {
  3. parent::delete();
  4. Mage::dispatchEvent($this->_eventPrefix.'_delete_after_done', array($this->_eventObject=>$this));
  5. return $this;
  6. }
修改为
  1. public function delete()
  2. {
  3. parent::delete();
  4. Mage::dispatchEvent($this->_eventPrefix.'_delete_after_done', array($this->_eventObject=>$this));
  5. foreach ($this->getMediaGallery('images') as $image) {
  6. $image_path = $this->getMediaConfig()->getMediaPath($image['file']);
  7. if (file_exists($image_path)) {
  8. @unlink($image_path);
  9. }
  10. }
  11. return $this;
  12. }
这个方法是通过重写Model的方法实现的,下面我们将采用事件触发的方法来实现,我们观察在delete()函数中触发了catalog_product_delete_after_done事件,因此我们可以写一个插件,当观察到这个事件时删除产品的图片。
 
1 新建模块
在/app/code/local/MagentoBoy/DeleteProductImages目录下新建一个模块MagentoBoy_DeleteProductImages,并添加模块文件:
/app/etc/modules/MagentoBoy_DeleteProductImages.xml
  1. <?xml version="1.0"?>
  2. <config>
  3. <modules>
  4. <MagentoBoy_DeleteProductImages>
  5. <active>true</active>
  6. <codePool>local</codePool>
  7. </MagentoBoy_DeleteProductImages>
  8. </modules>
  9. </config>
并添加配置文件:
/app/code/local/MagentoBoy/DeleteProductImages/etc/config.xml
  1. <?xml version="1.0"?>
  2. <config>
  3. <modules>
  4. <MagentoBoy_DeleteProductImages>
  5. <version>0.1.0</version>
  6. </MagentoBoy_DeleteProductImages>
  7. </modules>
  8. </config>
 
2 添加Observer
/app/code/local/MagentoBoy/DeleteProductImages/Model/Observer.php
  1. <?php
  2. class MagentoBoy_DeleteProductImages_Model_Observer
  3. {
  4. public function processProductAfterDeleteEvent(Varien_Event_Observer $observer)
  5. {
  6. $eventProduct = $observer->getEvent()->getProduct();
  7. if ($eventProduct && $eventProduct->getId()) {
  8. foreach ($eventProduct->getMediaGallery('images') as $image) {
  9. $image_path = $eventProduct->getMediaConfig()->getMediaPath($image['file']);
  10. if (file_exists($image_path)) {
  11. @unlink($image_path);
  12. }
  13. }
  14. }
  15. return $this;
  16. }
  17. }
并在config.xml中添加models和events
  1. <config>
  2. <global>
  3. <models>
  4. <deleteproductimages>
  5. <class>MagentoBoy_DeleteProductImages_Model</class>
  6. </deleteproductimages>
  7. </models>
  8. <events>
  9. <catalog_product_delete_after_done>
  10. <observers>
  11. <deleteproductimages>
  12. <class>deleteproductimages/observer</class>
  13. <method>processProductAfterDeleteEvent</method>
  14. </deleteproductimages>
  15. </observers>
  16. </catalog_product_delete_after_done>
  17. </events>
  18. </global>
  19. </config>
这样就实现了在Magento中删除产品同时删除图片的功能,使用事件触发的方式更为灵活,方便在多个模块中扩展功能。

Magento删除产品同时删除图片的更多相关文章

  1. 如何更改/删除magento首页产品/广告图片等模块信息

    如何更改/删除magento首页产品/广告图片等模块信息,如果只是修改一些简单的地方,例如已经存在 的左右栏目里面的图片内容等,是很简单的,直接在后台就可以修改的,具体如下: 如何删除magento首 ...

  2. Laravel删除产品-CRUD之delete(destroy)

    上一篇讲了Laravel编辑产品-CRUD之edit和update,现在我们讲一下删除产品,方法和前面的几篇文章类似,照着ytkah来操作吧 1,controller的function destroy ...

  3. 1) 上传多张图片时 ,对 $_FILES 的处理. upload ; 2)fileinput 上传多张图片. 3) 修改,删除的时候删除原来的资源,图片 update, delete , 删除 4)生成器中两个字段上传图片的时候,要修改生成器生成的代码

    1上传多张图片, 要对 $_FILES进行 重新处理. //添加 public function addCourseAlbumAction() { $CourseAlbumModel = new Co ...

  4. WPF中删除打开过的图片

    在WPF中,当我们删除打开过的图片时,往往会遇到"...无法删除,文件正在被另一个进程使用"的异常.即使当前文件是打开后关闭过的也不行. 这个问题的原因很简单,是因为WPF的缓存策 ...

  5. spring mvc 图片上传,图片压缩、跨域解决、 按天生成文件夹 ,删除,限制为图片代码等相关配置

    spring mvc 图片上传,跨域解决 按天生成文件夹 ,删除,限制为图片代码,等相关配置 fs.root=data/ #fs.root=/home/dev/fs/ #fs.root=D:/fs/ ...

  6. 动态加载/删除css文件以及图片预加载

    动态加载/删除css文件以及图片预加载   功能模块页面   最近,工作中遇到了一个比较奇葩的需求:要在一个页面(PC端)增加一个功能模块,但是这个页面在不久之后要重构,为了新增加的模块可以继续复用, ...

  7. Java 添加、替换、删除PDF中的图片

    概述 本文介绍通过java程序向PDF文档添加图片,以及替换和删除PDF中已有的图片.另外,关于图片的操作还可参考设置PDF 图片背景.设置PDF图片水印.读取PDF中的图片.将PDF保存为图片等文章 ...

  8. TP5上传图片到七牛云,并且删除七牛云的图片

    一,通过composer 下载七牛云 sdk composer require qiniu/php-sdk 二,手动下载七牛云sdk 1,https://developer.qiniu.com/kod ...

  9. [Xcode 实际操作]七、文件与数据-(5 )复制、移动、删除文件和删除文件夹

    目录:[Swift]Xcode实际操作 本文将演示如何复制.移动和删除文件. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit class ...

随机推荐

  1. sublime text2 解决中文乱码

    打开Preferences菜单,并选择 Browse Packages… 系统会打开Sublime Text 2的Packages文件夹,回到上一级菜单,然后打开Installed Packages文 ...

  2. 如何删除href=""中的链接?

    答案:在dw中操作,删除 HTML文件的href的链接地址\href="[^"]*"href="" 同理可以在title="[^" ...

  3. Matcher类:(转)

    Matcher类:     使用Matcher类,最重要的一个概念必须清楚:组(Group),在正则表达式中 ()定义了一个组,由于一个正则表达式可以包含很多的组,所以下面先说说怎么划分组的, 以及这 ...

  4. mapreduce job提交流程源码级分析(三)

    mapreduce job提交流程源码级分析(二)(原创)这篇文章说到了jobSubmitClient.submitJob(jobId, submitJobDir.toString(), jobCop ...

  5. 在linux终端下打开pdf文件

    已经使用linux有很长的时间了,感觉linux的终端使用起来非常的方便.但是怎么在linux下用命令的方式打开pdf文件呢.我查了一下,打开pdf的命令是: evince [filename] 例如 ...

  6. ubuntu 12.04安装TP-LINK TL-WN725N v2

    用了一个上午,折腾完毕,分享如下. 1.先试了ndiswrapper和compat-wireless,各种不给力.后来看这篇博文<Ubuntu12.04下安装TL-WN322G+无线网卡驱动(R ...

  7. poj1274 二分匹配

    今天复习二分匹配,A 了一道模板题. 二分匹配需要理解增广路的寻找.用dfs来更新最大匹配.注意一些点:赋初值:愚蠢地把==写成了= ; 然后match的记值;每个点都要重新走一遍. #include ...

  8. subline快捷键

    折叠所有代码:  按ctrl+k,再按ctrl+1 展开所有代码: 按ctrl+k,再按ctrl+j 折叠此处代码:  ctrl+shift+[ 展开此处代码: ctrl+shift+]

  9. linux卸载挂载点显示device is busy

    在做umount设备时, device is busy是令人头痛的提示: [root@delphi /]# umount /dev/cdrom umount: /mnt/cdrom: device i ...

  10. JS页面打印,预览,设置,分页

    一)在HTML页中加载打印对象 <object id="WebBrowser" width="0" height="0" classi ...