博客

Magento 二次开发系列十一 — 前台分类页面显示每个model或part生成对应商品的url

【php教程】Magento 二次开发系列十一 — 前台分类页面显示每个model或part生成对应商品的url

本节将介绍分类页面显示model和part,以及他们对应的url。

通过前面章节的工作,我们已经可以进行分类页面的数据输出了。

1.分类页面显示修改为通过静态块输出显示,即我们前面章节创建的sub-categories.phtml,这个文件要显示两种布局的内容,一个是分类下的子分类,另个是子分类的model和part;
2.原分类页面显示的所包含的商品列表,现在修改为显示子分类的缩略图,代码如下:

$_categories=$this->getCurrentChildCategories();
if($_categories->count()){
echo ‘ <div class=”listing”>
<div class=”choose-brand holder clearfix”>’;
foreach ($_categories as $_category){

if($_category->getIsActive()){

$catName = $this->getCurrentCategory()->getName();
$_imageUrl = $this->getCurrentCategory()->getThumbnailImageUrl();
if(empty($_imageUrl)){

echo ‘<a href=”‘.$this->getCategoryUrl($_category).’”
title=”Choose  ‘.$_category->getName().’”><img
alt=” ‘.$_category->getName().’”
src=” ‘.$this->getSkinUrl(‘images/subcategory-default.jpg’).’”></a> ‘;

}else {
/* Displays the subcategory image */

echo ‘<a href=” ‘.$this->getCategoryUrl($_category).’”
title=”Choose  ‘.$_category->getName().’”><img
alt=” ‘.$_category->getName().’”
src=” ‘.$_imageUrl.’” height=”150″></a> ‘;

}
}
}
}

效果图如下
cate05

3.显示子分类的model和part,这个是对分类添加了自定义属性,代码如下:

$extendUrl = $this->getExtendUrl();
$modelList = $this->renderCategoryModels();
if (count($modelList)) {
foreach ($modelList as $firstChar=>$models){
echo ‘<div class=”row”>
<div class=”letter”>’.$firstChar.’</div>
<ul class=”brand-list”> ‘;
foreach ($models as $model){
$subName = strtolower($_maincategorylisting->getName());
$subName = str_replace(‘ ‘, ‘-’, $subName);
$url = isset($extendUrl['model'][$model])?$subName.’/’.urlencode($model).’/’.$extendUrl['model'][$model]:’/’;
echo ‘<li class=”model-item”>
<a href=”‘.$url.’”>’.$model.’</a>
</li>’;
}
echo ‘</ul>
</div>’;
}
}

方法$this->getExtendUrl(), $this->renderCategoryModels()都是定义在block文件Navigation.php中,代码如下:

public function getExtendUrl(){
$currentCategory = $this->getCurrentCategory();
$urlmodel = Mage::getModel(‘extends/product’);
$collection  = $urlmodel->getResourceCollection();
$collection->addFieldToFilter(‘category_id’, array(‘eq’=>$currentCategory->getId()));
$res =  $collection->getData();
$urlList = array();
if (count($res)) {
foreach ($res as $ext){
$urlList[$ext['type']][$ext['content']] = $ext['url'];
}
}
return $urlList;
}

public function renderCategoryPart(){
$currentCategory = $this->getCurrentCategory();
$category_parts = $currentCategory->getData(‘category_part’);
$partsList = array();
if (!empty($category_parts)) {
$modelArr = explode(“\n”, $category_parts);
foreach ($modelArr as $partlVal){

$partlVal = trim($partlVal);
if (empty($partlVal)) {
continue;
}
$firstChar = strtoupper(substr($partlVal, 0,1));
$partsList[$firstChar][] = $partlVal;
}
}
ksort($partsList);

return $partsList;
}

显示效果如下,
prod04

4.商品url则可以根据参数拼接而成,例如步骤3中的例子:
$url = isset($extendUrl['model'][$model])?$subName.’/’.urlencode($model).’/’.$extendUrl['model'][$model]:’/’;
$subName是子分类名,$model是model的值,$extendUrl['model'][$model]是存储在extends_product中url的值,这样我们就能通过这个完整的url去url rewrite表中查找,然后找到目标路径。这里充分利用了他们之间的关系,然后通过字符串拼接完成目标url。

通过以上步骤,我们就定义了一个商品多个url,并且他们的名称,描述,meta信息都是不相同的。

既然是同个商品,那么如果不同的url添加到购物车会怎么样呢?你期望是什么结果呢?显然,我们也想要显示不同的商品名称,不然用户会觉得很奇怪。如果不做修改,则购物车和订单都会认为是同个商品,所以必须修改,请看下节。

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