广州传奇网络

地址:广州市天河区东圃大马路富华楼C座

电话:13808825895

邮箱:gz020wbs@163.com

QQ:1564443073

网址:http://www.020wbs.com/

首页 > 二次开发Ecshop二次开发 > ecshop自定义url ecshop自定义商品分类的url地址的方法

二次开发Ecshop二次开发

二次开发Ecshop二次开发

ecshop自定义url ecshop自定义商品分类的url地址的方法

 实现ecshop商品分类自定义url,大致可以分成五步:

一、更改数据库结构,增加保存ecshop自定义url的字段,在ecs_category表中增加re_url字段

二、在ecshop后台的分类管理中增加自定义字段re_url的管理

三、修改前台生成url函数build_uri使之支持分类自定义url

四、修改模板中的url,如果需要支持多级分类多级目录,模板中的部分url需要修正一下,不然出现404错误

五、修改ecshop的rewrite规则,使之符合新的rewrite规则

下面我们一步一步的完成以上五完,以完美实现ecshop自定义商品分类的url


第一步、为ecshop的商品分类表ecs_category增加自定义url的字段re_url,具体方法:
以超级管理员的身份进入ecshop商城后台在左侧的管理菜单中找到--->数据库管理--->sql查询--运行 SQL 查询,[tr][td]执行SQL将直接操作数据库,请谨慎使用

alter table ecs_category add re_url varchar(255) not null default '';

注意: sql语名中的ecs_随着你安装ecshop时设置得不同而不同

执行成功后会有提示:
SQL 语句已成功运行
否则你定的sql语名有错误,请检查你的sql语句


第二步:在ecshop后台商品分类管理处增加商品分类自定义url的本文框


2.1用dreamwaver打开admin/templates/category_info.html

找到

<tr>
<td class="label">{$lang.parent_id}:</td>
<td>
<select name="parent_id">
<option value="0">{$lang.cat_top}</option>
{$cat_select}
</select>
</td>
</tr>


在它的下方增加

<tr>
<td class="label">商品分类自宝义url:</td>
<td>
<input type='text' name='re_url' maxlength="255" value='{$cat_info.re_url|escape:html}' size='60' />
</td>
</tr>


然后保存
 

用一个php的编辑器,建议用editplus,或dreamwaver打开admin/category.php文件

在商品分类添加时的处理处增加

$cat['re_url'] = !empty($_POST['re_url']) ? trim($_POST['re_url']) : '';

 

在编辑商品分类信息的update代码块处增加

$cat['re_url'] = !empty($_POST['re_url']) ? trim($_POST['re_url']) : '';

 

修改完成后,我们在分类管理处测试一下编辑和添加分类是时否可以设置分类的自定义url
如果在编辑和添加分类时能成功的保存所办理入的值,说明我们以上的修改正确无误

这样就实现了在 ecshop后台的商品分类管理处增加了设置自定义url的地方:

 

本ecshop插件最终希望实现的是支持多级分类目数的形例,如图所示的:
一级目录shouji
二级目录shouji/shuangmuoshoujji

 

 

这点是其它同类插件是不具备的,要是有一个好的目录结构对于seo是有很大的好处,更重要的是本插件的目录结结构,还可以本来是三级的目录,我们可以把它定义成一级目录,本来是二级目录的可以定义成三级,这个取决于你网站结构的需要,而不是囿于后台的网站分类结构

按以上方法设置商城分类的的目录自定义url已通过测试,如您感兴趣也可以按以上方法试一遍,肯定可以达到相同的效果,自已动手丰衣足食,快动起你的手,你的网站将会更强大

修改前台生成url函数build_uri使之支持分类自定义url


在这首先教大家一个开发的技巧,再熟悉的程序员也有可能找不到某个php函数是在那个文件里定义的,我们可以通过dreamwaver的强大的文件和文件夹搜索功迅速定位到我们要找的函数,例如我们要的的函数是build_uri (PS下:兄弟,要是你连要找什么函数也不知道,那,那我就没办法了,只你有多看源码),打开dreamwaver --->顶部的菜单--->查找替换

这里特别提醒的是搜索范围应选择文件夹........方式,设设置好搜索的对像为整个ecshop网站的根目录,搜索范围为源代码,搜索内容为function build_uri,然后点击查找全部,可以找出全部包含function build_uri的php文件出现搜索结果,点击打开你要编辑的php文件。

找到后我们发现 build_uri 函数就藏在 includes/lib_common.php里,函数主体是:

/**
* 重写 URL 地址
*
* @access public
* @param string $app 执行程序
* @param array $params 参数数组
* @param string $append 附加字串
* @param integer $page 页数
* @param string $keywords 搜索关键词字符串
* @return void
*/
function build_uri($app, $params, $append = '', $page = 0, $keywords = '', $size = 0)
{
static $rewriteNULLr />
if ($rewrite === NULL)
{
$rewrite = intval($GLOBALS['_CFG']['rewrite']);
}

$args = array('cid' => 0,
'gid' => 0,
'bid' => 0,
'acid' => 0,
'aid' => 0,
'sid' => 0,
'gbid' => 0,
'auid' => 0,
'sort' => '',
'order' => '',
);

extract(array_merge($args, $params));

$uri = '';
switch ($app)
{
case 'category':
if (empty($cid))
{
return false;
}
else
{
if ($rewrite)
{
$uri = 'category-' . $cid;
if (isset($bid))
{
$uri .= '-b' . $bid;
}
if (isset($price_min))
{
$uri .= '-min'.$price_min;
}
if (isset($price_max))
{
$uri .= '-max'.$price_max;
}
if (isset($filter_attr))
{
$uri .= '-attr' . $filter_attr;
}
if (!empty($page))
{
$uri .= '-' . $page;
}
if (!empty($sort))
{
$uri .= '-' . $sort;
}
if (!empty($order))
{
$uri .= '-' . $order;
}
}
else
{
$uri = 'category.php?id=' . $cid;
if (!empty($bid))
{
$uri .= '&brand=' . $bid;
}
if (isset($price_min))
{
$uri .= '&price_min=' . $price_min;
}
if (isset($price_max))
{
$uri .= '&price_max=' . $price_max;
}
if (!empty($filter_attr))
{
$uri .='&filter_attr=' . $filter_attr;
}

if (!empty($page))
{
$uri .= '&page=' . $page;
}
if (!empty($sort))
{
$uri .= '&sort=' . $sort;
}
if (!empty($order))
{
$uri .= '&order=' . $order;
}
}
}

break;
case 'goods':
if (empty($gid))
{
return false;
}
else
{
$uri = $rewrite ? 'goods-' . $gid : 'goods.php?id=' . $gid;
}

break;
case 'brand':
if (empty($bid))
{
return false;
}
else
{
if ($rewrite)
{
$uri = 'brand-' . $bid;
if (isset($cid))
{
$uri .= '-c' . $cid;
}
if (!empty($page))
{
$uri .= '-' . $page;
}
if (!empty($sort))
{
$uri .= '-' . $sort;
}
if (!empty($order))
{
$uri .= '-' . $order;
}
}
else
{
$uri = 'brand.php?id=' . $bid;
if (!empty($cid))
{
$uri .= '&cat=' . $cid;
}
if (!empty($page))
{
$uri .= '&page=' . $page;
}
if (!empty($sort))
{
$uri .= '&sort=' . $sort;
}
if (!empty($order))
{
$uri .= '&order=' . $order;
}
}
}

break;
case 'article_cat':
if (empty($acid))
{
return false;
}
else
{
if ($rewrite)
{
$uri = 'article_cat-' . $acid;
if (!empty($page))
{
$uri .= '-' . $page;
}
if (!empty($sort))
{
$uri .= '-' . $sort;
}
if (!empty($order))
{
$uri .= '-' . $order;
}
if (!empty($keywords))
{
$uri .= '-' . $keywords;
}
}
else
{
$uri = 'article_cat.php?id=' . $acid;
if (!empty($page))
{
$uri .= '&page=' . $page;
}
if (!empty($sort))
{
$uri .= '&sort=' . $sort;
}
if (!empty($order))
{
$uri .= '&order=' . $order;
}
if (!empty($keywords))
{
$uri .= '&keywords=' . $keywords;
}
}
}

break;
case 'article':
if (empty($aid))
{
return false;
}
else
{
$uri = $rewrite ? 'article-' . $aid : 'article.php?id=' . $aid;
}

break;
case 'group_buy':
if (empty($gbid))
{
return false;
}
else
{
$uri = $rewrite ? 'group_buy-' . $gbid : 'group_buy.php?act=view&id=' . $gbid;
}

break;
case 'auction':
if (empty($auid))
{
return false;
}
else
{
$uri = $rewrite ? 'auction-' . $auid : 'auction.php?act=view&id=' . $auid;
}

break;
case 'snatch':
if (empty($sid))
{
return false;
}
else
{
$uri = $rewrite ? 'snatch-' . $sid : 'snatch.php?id=' . $sid;
}

break;
case 'search':
break;
case 'exchange':
if ($rewrite)
{
$uri = 'exchange-' . $cid;
if (isset($price_min))
{
$uri .= '-min'.$price_min;
}
if (isset($price_max))
{
$uri .= '-max'.$price_max;
}
if (!empty($page))
{
$uri .= '-' . $page;
}
if (!empty($sort))
{
$uri .= '-' . $sort;
}
if (!empty($order))
{
$uri .= '-' . $order;
}
}
else
{
$uri = 'exchange.php?cat_id=' . $cid;
if (isset($price_min))
{
$uri .= '&integral_min=' . $price_min;
}
if (isset($price_max))
{
$uri .= '&integral_max=' . $price_max;
}

if (!empty($page))
{
$uri .= '&page=' . $page;
}
if (!empty($sort))
{
$uri .= '&sort=' . $sort;
}
if (!empty($order))
{
$uri .= '&order=' . $order;
}
}

break;
case 'exchange_goods':
if (empty($gid))
{
return false;
}
else
{
$uri = $rewrite ? 'exchange-id' . $gid : 'exchange.php?id=' . $gid . '&act=view';
}

break;
default:
return false;
break;
}

if ($rewrite)
{
if ($rewrite == 2 && !empty($append))
{
$uri .= '-' . urlencode(preg_replace('/[\.|\/|\?|&|\+|\\\|\'|"|,]+/', '', $append));
}

$uri .= '.html';
}
if (($rewrite == 2) && (strpos(strtolower(EC_CHARSET), 'utf') !== 0))
{
$uri = urlencode($uri);
}
return $uri;
}


其中,我们要修改
case 'category':
..............................

break;
中间的部分,把

case 'category':
if (empty($cid))
{
return false;
}
else
{
if ($rewrite)
{
$uri = 'category-' . $cid;
if (isset($bid))
{
$uri .= '-b' . $bid;
}
if (isset($price_min))
{
$uri .= '-min'.$price_min;
}
if (isset($price_max))
{
$uri .= '-max'.$price_max;
}
if (isset($filter_attr))
{
$uri .= '-attr' . $filter_attr;
}
if (!empty($page))
{
$uri .= '-' . $page;
}
if (!empty($sort))
{
$uri .= '-' . $sort;
}
if (!empty($order))
{
$uri .= '-' . $order;
}
}
else
{
$uri = 'category.php?id=' . $cid;
if (!empty($bid))
{
$uri .= '&brand=' . $bid;
}
if (isset($price_min))
{
$uri .= '&price_min=' . $price_min;
}
if (isset($price_max))
{
$uri .= '&price_max=' . $price_max;
}
if (!empty($filter_attr))
{
$uri .='&filter_attr=' . $filter_attr;
}

if (!empty($page))
{
$uri .= '&page=' . $page;
}
if (!empty($sort))
{
$uri .= '&sort=' . $sort;
}
if (!empty($order))
{
$uri .= '&order=' . $order;
}
}
}

break;


修改成

case 'category':
if (empty($cid))
{
return false;
}
else
{
if ($rewrite)
{
$re_url = $GLOBALS['db']->getOne(' select re_url from ' . $GLOBALS['ecs']->table('category') . " where cat_id='$cid' " );
$uri = $re_url ? $re_url: 'category-' . $cid;
if (isset($bid))
{
$uri .= '-b' . $bid;
}
if (isset($price_min))
{
$uri .= '-min'.$price_min;
}
if (isset($price_max))
{
$uri .= '-max'.$price_max;
}
if (isset($filter_attr))
{
$uri .= '-attr' . $filter_attr;
}
if (!empty($page))
{
$uri .= '-' . $page;
}
if (!empty($sort))
{
$uri .= '-' . $sort;
}
if (!empty($order))
{
$uri .= '-' . $order;
}
}
else
{
$uri = 'category.php?id=' . $cid;
if (!empty($bid))
{
$uri .= '&brand=' . $bid;
}
if (isset($price_min))
{
$uri .= '&price_min=' . $price_min;
}
if (isset($price_max))
{
$uri .= '&price_max=' . $price_max;
}
if (!empty($filter_attr))
{
$uri .='&filter_attr=' . $filter_attr;
}

if (!empty($page))
{
$uri .= '&page=' . $page;
}
if (!empty($sort))
{
$uri .= '&sort=' . $sort;
}
if (!empty($order))
{
$uri .= '&order=' . $order;
}
}
}

break;

 

其中仅把

$uri = 'category-' . $cid;


替换成了

$re_url = $GLOBALS['db']->getOne(' select re_url from ' . $GLOBALS['ecs']->table('category') . " where cat_id='$cid' " );
$uri = $re_url ? $re_url: 'category-' . $cid;


保存我们的修改

在ecshop的后台开启伪静态,不知道如何开启ecshop伪静态规则,请看这里:

ecshop如何开启伪静态?

注意我们这里要求开启简单重写,可以自定义了,就没有必要开启复杂重写了

然后我们再查看生成的url就变成了,看来我们的修改起到了一定作用


这一步就完成到这里,当然,如果想做得更好,我们可以去掉url中的
-b0
参数,使url参数看到更整洁更好看,这个我们以后再讨论如何实现