• Magento删除产品同时删除图片


    在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中删除产品同时删除图片的功能,使用事件触发的方式更为灵活,方便在多个模块中扩展功能。
  • 相关阅读:
    18、监听器/国际化
    17、过滤器
    16、连接池/分页技术
    15、Jdbc的优化(BeanUtils组件)
    14、知识回顾
    13、mysql/触发器
    12、Jsp加强/自定义标签/JavaBean
    11、Jsp加强/EL表达式/jsp标签
    10、会话管理/编程实战分析/Jsp
    9、Http回顾/Servlet
  • 原文地址:https://www.cnblogs.com/focai/p/4202963.html
Copyright © 2020-2023  润新知