您现在的位置是:首页 > cms教程 > Ecshop商城教程Ecshop商城教程
ecshop (lib_common.php build_url 函数)重构
冷安2024-12-22Ecshop商城教程已有人查阅
导读重构案例之 ECShop_V2.7.3_UTF8_release0411/upload/includes/lib_common.php 第1490行的 build_uri 函数,重构之前的 build_url 函数有大概 400 行左右的代码
重构案例之 ECShop_V2.7.3_UTF8_release0411/upload/includes/lib_common.php 第1490行的 build_uri 函数,重构之前的 build_url 函数有大概 400 行左右的代码,而且 switch 的条件分支里还夹杂了 if 的条件。故将 build_uri 函数试着重构成了 UriRewrite 类。
代码1 重构前的 build_url 函数代码
代码1 重构前的 build_url 函数代码
/**
* 重写 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 $rewrite = NULL;
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;
}
代码2 重构后的 UriRewrite 类,由于时间关系,类中没有写完所有的代码
<?php
/*
* URL重写类
*
*/
class UriRewrite
{
private $m_app;
private $m_params;
private $m_append;
private $m_page;
private $m_keywords;
private $m_size;
private $m_rewrite;
private $m_methodTable = array(
'category'=>'CreateByCategory',
'goods'=>'CreateByGoods',
'brand'=>'CreateByBrand',
'article_cat'=>'CreateByArticleCat',
'article'=>'CreateByArticle',
'group_buy'=>'CreateByGroupBuy',
'auction'=>'CreateByAuction',
'snatch'=>'CreateBySnatch',
'search'=>'CreateBySearch',
'exchange'=>'CreateByExchange',
'exchange_goods'=>'CreateByExchangeGoods'
);
private $m_result;
public function __construct($app, $params, $append = '', $page = 0, $keywords = '', $size = 0)
{
$this->m_app = $app;
$this->m_params = $params;
$this->m_append = $append;
$this->m_page = $page;
$this->m_keywords = $keywords;
$this->m_size = $size;
$this->m_rewrite = intval($GLOBALS['_CFG']['rewrite']);
}
public function Create()
{
$args = array(
'cid' => 0,
'gid' => 0,
'bid' => 0,
'acid' => 0,
'aid' => 0,
'sid' => 0,
'gbid' => 0,
'auid' => 0,
'sort' => '',
'order' => ''
);
array_merge($args, $this->m_params);
if(!array_key_exists($this->m_app, $this->m_methodTable))
{
return false;
}
$uri = $this->{$this->m_methodTable[$this->m_app]}();
$uri = $this->DoByAppend($uri);
$uri = $this->DoByCharset($uri);
return $uri;
}
protected function CreateByCategory()
{
if (empty($this->m_params['cid']))
{
return false;
}
$this->m_rewrite = 'category-'.$this->m_params['cid'];
return $this->AddBID()->AddPriceMin()->AddPriceMax()->AddFilterAttr()->AddPage()->AddSort()->AddOrder()->Result();
}
protected function CreateByGoods() {}
protected function CreateByBrand() {}
protected function CreateByArticleCat() {}
protected function CreateByArticle() {}
protected function CreateByGroupBuy() {}
protected function CreateByAuction() {}
protected function CreateBySnatch() {}
protected function CreateBySearch() {}
protected function CreateByExchange() {}
protected function CreateByExchangeGoods() {}
private function Result()
{
return empty($this->m_result)? false : $this->m_result;
}
private function DoByAppend($uri)
{
if ($this->m_rewrite)
{
if ($this->m_rewrite == 2 && !empty($this->m_append))
{
$uri .= '-' . urlencode(preg_replace('/[\.|\/|\?|&|\+|\\\|\'|"|,]+/', '', $this->m_append));
}
$uri .= '.html';
}
return $uri;
}
private function DoByCharset($uri)
{
if (($this->m_rewrite == 2) && (strpos(strtolower(EC_CHARSET), 'utf') !== 0))
{
$uri = urlencode($uri);
}
return $uri;
}
private function AddCID($uri)
{
if($this->m_rewrite)
{
$this->m_rewrite = '';
}
else
{
$this->m_rewrite = '';
}
return $this;
}
private function AddGID($uri) {}
private function AddBID($uri) {}
private function AddACID($uri) {}
private function AddAID($uri) {}
private function AddSID($uri) {}
private function AddGBID($uri) {}
private function AddAUID($uri) {}
private function AddSort($uri) {}
private function AddOrder($uri) {}
private function AddPriceMin($uri) {}
private function AddPriceMax($uri) {}
private function AddFilterAttr($uri) {}
private function AddPage($uri) {}
}
?>
在这次重构中,使用到了一个 方法表 的概念。就是将原本 switch 的条件选择,通过 方法表 定位到对类方法的动态调用。
// 方法表的定义
private $m_methodTable = array(
'category'=>'CreateByCategory',
'goods'=>'CreateByGoods',
'brand'=>'CreateByBrand',
'article_cat'=>'CreateByArticleCat',
'article'=>'CreateByArticle',
'group_buy'=>'CreateByGroupBuy',
'auction'=>'CreateByAuction',
'snatch'=>'CreateBySnatch',
'search'=>'CreateBySearch',
'exchange'=>'CreateByExchange',
'exchange_goods'=>'CreateByExchangeGoods'
);
/*
* 方法表的调用。还可以使用 call_user_func
*
* call_user_func(array($this, $this->m_methodTable[$this->m_app]));
*/
$this->{$this->m_methodTable[$this->m_app]}();
本文标签:
很赞哦! ()
上一篇:ecshop函数列表大全归类
相关教程
- discuz的ecshop的伪静态规则apache+nginx
- ecshop整合discuz的方法
- discuz和ecshop截取字符串函数介绍
- ECShop2.7.2整合Discuz 6.0论坛的步骤方法
- Ecshop和Discuz开源产品有哪些局限性
- ecshop怎么和discuz整合
- phpcmsv9和ecshop2.3.7以及discuzx3.0整合方法
- Nginx常用Rewrite(伪静态规则)WordPress/PHPCMS/ECSHOP/ShopEX/S
- ecshop收货地址199/198号段提示手机号格式不正确!
- ecshop调用商品属性的方法实例
- ecshop支付插件开发教程
- ecshop商品怎么增加新字段
图文教程
删除ecshop您需要激活系统的删除关闭方法
ecshop安装以后打开后台出现ecshop您需要激活系统删除关闭的方法;1.打开后台出现:您需要激活系统 没有关闭按钮,因为他们把关闭按钮注销了
删除ecshop伪静态商品列表分类category-b0.html中的b0
删除ecshop伪静态商品分类category-b0.html中的b0 使用ecshop的朋友都清楚,启用伪静态规则后默认的分类url看上去不是很美观
ecshop购物车里的商品按购买先后顺序排列的实现方法
用过ecshop的站长都知道,默认ECSHOP购物车里的商品顺序是按照商品ID,由小到大排列的。有人建议将购物车里的商品按照购买先后进行排序
ecshop商品详情页相关商品数量设置方法
其实这个不需要修改任何代码,在ECSHOP后台就可以设置的。所以建议大家多熟悉熟悉后台,对后台熟悉了, 可以避免走冤枉路,可以事半功倍。
相关源码
-
自适应新闻资讯技术博客个人网站pbootcms模板该模板基于PbootCMS开源内核深度开发,该模板适用于游戏新闻网站、游戏博客等企业或个人网站,新闻资讯技术博客pbootcms模板;采用六级分辨率断点适配技术查看源码 -
(自适应)WordPress二次元博客主题SakurairoSakurairo主题为二次元内容创作者设计,提供丰富的动漫风格元素和个性化的展示效果。该主题在原有Sakura主题基础上进行了功能增强,支持多种自定义设置,满足动漫爱好者建立个人博客的需求。查看源码 -
自适应建材瓷砖卫浴大理石类pbootcms网站模板源码下载为建材瓷砖、卫浴瓷砖企业打造的高端响应式门户模板,基于PbootCMS内核深度开发。采用前沿HTML5自适应架构,无缝兼容手机端触控交互与PC端展示场景。查看源码 -
(PC+WAP)企业管理工程造价资产评估财务审计带留言网站模板本模板基于PbootCMS内核开发,为工程造价咨询、财务审计类企业量身打造,同时支持多行业快速适配。采用PC+WAP双端同步设计,数据实时互通,助您高效展示企业形象与服务能力。查看源码 -
(PC+WAP)蓝色不锈钢簧线金属制品营销型pbootcms网站模板本模板基于PbootCMS内核开发,为不锈钢及金属制品企业量身打造。采用响应式设计,适配PC与移动设备,提供统一后台管理体验,数据实时同步更新。查看源码 -
(自适应)电子元件电路板元器件pbootcms网站源码下载为电子元器件、电路板制造类企业设计,特别适合展示产品参数、技术规格等内容。采用响应式技术,确保各类电子元件在不同设备上都能清晰展示。查看源码
| 分享笔记 (共有 篇笔记) |
