您现在的位置是:首页 > 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帮助中心限制文章显示条数”的方法,例如只显示每个小类的前5篇文章。为了照顾大多数站长,本教程倾向于在模板里修改实现。
ecshop标签模板调用大全
父分类列表 {foreach from=$categories item=cat }订单编号 {$order_query.order_sn} 里面还有不少标签,没弄明白,之后在添加,修改
ecshop常见的问答70个修改方法
1、如何修改网站”欢迎惠临本店”答复(dafu):languages\zh_cn\common.php文件中,$_LANG['welcome']=’欢迎惠临本店’;将他修改成你需要的字样。
ecshop数据库清空的方法,ecshop数据执行SQL命令收集整理
有时候想清空商城一些没有必要数据但是手动删除太慢了,代码号今天整理一些SQL执行清空命令,希望对大家有所帮助!
相关源码
-
蓝色工业机械五金设备pbootcms模板源码下载(PC+WAP)为机械制造与五金设备企业设计的响应式网站模板,基于PbootCMS内核开发。采用蓝色工业风格强化行业属性,宽屏布局突出设备细节展示,支持PC与WAP端自适应查看源码 -
(自适应html5)自媒体运营培训教程个人博客pbootcms模板本模板基于PbootCMS系统开发,特别适合自媒体运营培训、知识付费类网站使用。采用响应式设计,能够适配各类终端设备,为内容创作者提供专业的内容展示平台。查看源码 -
(PC+WAP)五金机械设备营销型模板下载带在线留言为机械设备制造商设计的营销型模板,集成产品参数对比系统、产品展示模块和询价管理功能。采用PbootCMS开发内核,PHP7+运行环境。手工编写语义化HTML5结构,CSS3动画优化交互体验。查看源码 -
(自适应)蓄电池能源智能数码科技产品pbootcms模板源码下载本款基于PbootCMS开发的网站模板为蓄电池及能源科技企业设计,特别适合锂电池、储能系统、新能源电池等产品的展示与推广。查看源码 -
自适应html5二极管LED灯具灯饰类企业网网站模板该PbootCMS内核开发的响应式模板专为LED照明、灯具制造类企业设计,通过HTML5技术实现手机与PC端自适应显示,确保跨设备访问体验一致。企业可快速替换图文内容适配其他工业领域查看源码 -
(自适应响应式)APP应用程序软件介绍落地页源码免费下载该模板为营销技术从业者设计,提供专业的内容展示平台。采用响应式布局,适配软件介绍、APP推广等营销场景,通过可视化后台可快速搭建符合行业特性的展示网站。查看源码
| 分享笔记 (共有 篇笔记) |
