博客

Magento 二次开发系列七 — 前台商品详情页面的内容显示更改,采用前台block代码修改

【php教程】Magento 二次开发系列七 — 前台商品详情页面的内容显示更改,采用前台block代码修改

本节将介绍商品详情显示定制修改。

前面章节中展示了分类的页面的显示定制修改,因为涉及了布局修改,所以我们采用了静态块的方式,而本节中将会展示的是对现有的显示功能进行改造,当然我还需要遵守的准则是不修改核心代码,所以这里的修改是进行重写操作。

1.新建目录app/code/local/Mage/Catelog/Product,拷贝core相同目录下的View.php到这边;
2.新建目录app/code/local/Mage/Catelog/Product/View,拷贝core相同目录下的Description.php到这边;
3.对View.php进行定制修改,因为我们要替换显示商品名称,meta信息,页面title,所以需要在输出前进行处理,方法_prepareLayout()就是负责预处理的,通过获取参数model和part信息,进行内容替换操作;
4.model和part参数是通过url传递过来的的,url例子:xxxx/apple/Apple+350C/apple-iphone-4s-battery-xxxx.html,url中的“Apple+350C”即为model或part参数,下面是获取的方法:

public function getReplaceName(){
$pathInfo = $this->getRequest()->getRequestString();
$paths = explode('/', $pathInfo);
$replaceName = $paths[count($paths)-2];
$replaceName = urldecode($replaceName);
return $replaceName;
}


5.替换内容的部分代码为:

protected function _prepareLayout()
{
...原代码省略
$product = $this->getProduct();

$title = $product->getMetaTitle();
$productName = $product->getName();
//replace string in product name
$replace_keyword_in_name = $product->getData('replace_keyword_in_name');
$replaceName = $this->getReplaceName();
$replaced = false;
if (!empty($replace_keyword_in_name) && !empty($replaceName)) {
$title = str_ireplace($replace_keyword_in_name, $replaceName, $title);
$productName = str_ireplace($replace_keyword_in_name, $replaceName, $productName);
$replaced = true;
}
$product->setData('name',$productName);
if ($title) {
$headBlock->setTitle($title);
}
$keyword = $product->getMetaKeyword();
$currentCategory = Mage::registry('current_category');

if ($replaced) {
$keyword = str_ireplace($replace_keyword_in_name, $replaceName, $keyword);
}

...

$description = $product->getMetaDescription();

if ($replaced) {
$description = str_ireplace($replace_keyword_in_name, $replaceName, $description);
}

........
}

return parent::_prepareLayout();
}

6.商品描述中进行替换的代码是在View/Description.php中,代码为:

function getDescription(Mage_Catalog_Model_Product $product){
$replaceKeyword = $this->getReplaceName();
$replace_keyword_in_name = $product->getData('replace_keyword_in_name');
$desc = $product->getDescription();
if (!empty($replaceKeyword) && !empty($replace_keyword_in_name)) {
$desc = str_ireplace($replace_keyword_in_name, $replaceKeyword, $desc);
}

return $desc;
}


代码中获取的参数的方法$this->getReplaceName()同View.php中,就是说这个文件中也要包含这个方法,因为他们没有继承关系,View.php中的方法Description.php中不能调用,需要自己包含;

下节将介绍重写商品模型model,欢迎关注。

注:此文为原创,如转载请注明出处。