Chinaunix首页 | 论坛 | 博客
  • 博客访问: 273358
  • 博文数量: 59
  • 博客积分: 1368
  • 博客等级: 中尉
  • 技术积分: 1071
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-02 06:06
文章分类

全部博文(59)

文章存档

2012年(59)

我的朋友

分类: 系统运维

2012-03-04 01:36:19

在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中删除产品同时删除图片的功能,使用事件触发的方式更为灵活,方便在多个模块中扩展功能。
阅读(2472) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~