月度归档:2015年05月

Magento删除产品同时删除图片

在Magento后台删除产品时,默认不会删除产品的图片,如果长期不清理这些废弃的图片,会导致Media目录下的文件越来越多,浪费服务器空间,为了实现删除产品的同时删除图片,网络上常见的方法是修改Mage_Catalog_Model_Product的delete()方法:

public function delete()
{
parent::delete();
Mage::dispatchEvent($this->_eventPrefix.’_delete_after_done’, array($this->_eventObject=>$this));
return $this;
}
修改为
public function delete()
{
parent::delete();
Mage::dispatchEvent($this->_eventPrefix.’_delete_after_done’, array($this->_eventObject=>$this));
foreach ($this->getMediaGallery(‘images’) as $image) {
$image_path = $this->getMediaConfig()->getMediaPath($image[‘file’]);
if (file_exists($image_path)) {
@unlink($image_path);
}
}
return $this;
}
这个方法是通过重写Model的方法实现的,下面我们将采用事件触发的方法来实现,我们观察在delete()函数中触发了catalog_product_delete_after_done事件,因此我们可以写一个插件,当观察到这个事件时删除产品的图片。

1 新建模块
在/app/code/local/MagentoBoy/DeleteProductImages目录下新建一个模块MagentoBoy_DeleteProductImages,并添加模块文件:
/app/etc/modules/MagentoBoy_DeleteProductImages.xml




true
local



并添加配置文件:
/app/code/local/MagentoBoy/DeleteProductImages/etc/config.xml




0.1.0



2 添加Observer
/app/code/local/MagentoBoy/DeleteProductImages/Model/Observer.php
getEvent()->getProduct();
if ($eventProduct && $eventProduct->getId()) {
foreach ($eventProduct->getMediaGallery(‘images’) as $image) {
$image_path = $eventProduct->getMediaConfig()->getMediaPath($image[‘file’]);
if (file_exists($image_path)) {
@unlink($image_path);
}
}
}
return $this;
}
}
并在config.xml中添加models和events




MagentoBoy_DeleteProductImages_Model






deleteproductimages/observer
processProductAfterDeleteEvent






这样就实现了在Magento中删除产品同时删除图片的功能,使用事件触发的方式更为灵活,方便在多个模块中扩展功能

Magento 在后台订单显示产品地址

1. 添加获取产品 Url 的 Block

   位置:/app/code/core/Mage/Adminhtml/Block/Sales/Order/View/Items/Renderer/
  1. public function getProductUrl() {
  2.          $productData = $this->getItem()->getData();
  3.          $productId = $productData[‘product_id’];
  4.          $productSource = Mage::getModel(‘catalog/product’);
  5.          $pdata = $productSource->load($productId)->getData();
  6.          $pUrlPath = Mage::getUrl($pdata[‘url_path’]);
  7.          return $pUrlPath;
  8.     }
  1. public function getProductUrl() {
  2.          $productData = $this->getItem()->getData();
  3.          $productId = $productData[‘product_id’];
  4.          $productSource = Mage::getModel(‘catalog/product’);
  5.          $pdata = $productSource->load($productId)->getData();
  6.          $pUrlPath = Mage::getUrl($pdata[‘url_path’]);
  7.          return $pUrlPath;
  8.     }

2. 调用此方法

  位置:/app/design/adminhtml/default/default/template/sales/order/view/items/renderer/
  1. <div class=“item-text”>
  2.             <?php echo $this->getColumnHtml($_item‘name’) ?>
  3.             <a target=“_blank” href=“<?php echo $this->getProductUrl() ?>”>View Product</a>
  4.         </div>
  1. <div class=“item-text”>
  2.             <?php echo $this->getColumnHtml($_item‘name’) ?>
  3.             <a target=“_blank” href=“<?php echo $this->getProductUrl() ?>”>View Product</a>
  4.         </div>

整理后是:

  1. <?php echo rtrim(str_replace(“index.php/”,“”,$this->getProductUrl()),“/”) ?>
  1. <?php echo rtrim(str_replace(“index.php/”,“”,$this->getProductUrl()),“/”) ?>

Magento网站搜索结果过多问题的解决

app/code/core/Mage/CatalogSearch/Model/Resource/Fulltext.php 在ftp中找到这个文件,复制一份到

app/code/local/Mage/CatalogSearch/Model/Resource/Fulltext.php

打开local下的这个Fulltext.php文件,在大约 331 行左右找到 如下代码

$likeCond = ‘(‘ . join(‘ OR ‘, $like) . ‘)’;

和 355行左右找到如下代码:
if ($likeCond != ” && $searchType == Mage_CatalogSearch_Model_Fulltext::SEARCH_TYPE_COMBINE) {                   $where .= ($where ? ‘ OR ‘ : ”) . $likeCond;

将两处的 OR 用 AND 替换。保存。

然后再到Magento后台 System -> Configuration -> Catalog -> Catalog -> Catalog Search 里面将 Search Type改为 Combine(Like and Fulltext) , 点击 Save Config保存,刷新缓存。