您现在的位置是:首页 > 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商城jquery冲突解决方法
ECSHOP与JQUERY冲突的问题由来已久,网上很多解决方法比较繁琐,而且在某些地方还会出错,如产品比较功能等,本文中的方法结合了网上很新公开文章与本人实际开发的经验
ecshop购物车页面继续购物按钮怎么改成回到上一步
ecshop购物车页面继续购物按钮改成回到上一步的修改方法:大家都知道,ecshop 的购物车页面有的继续购物按钮是返回到首页的,而这样是非常不利于用户体验的
ecshop商品回收站的作用,ecshop商品回收站数据能不能还原
类似windows的回收站。在这里,您可以把确实不想要的商品从数据库删除,也可以把想要的商品还原。可以一次处理一个商品或一次处理多个商品,操作方法同商品列表页面。
相关源码
-
(PC+WAP)蓝色电子半导体电子设备网站pbootcms源码下载本模板基于PbootCMS内核开发,为半导体和电子科技行业设计,特别适合电子元器件、集成电路、半导体设备及相关技术产品展示。查看源码 -
快递物流公司pbootcms网站模板html响应式自适应源码下载基于HTML5+CSS3前沿技术开发,实现PC、平板、手机多端自适应。采用弹性布局与媒体查询技术,确保不同设备均有流畅视觉体验,企业形象统一。查看源码 -
(自适应)居家生活日用品纸盘纸盒纸杯卫生纸巾生产厂家pbootcms模板为纸品生产企业打造的现代化展示平台,自动适应各种设备屏幕,确保浏览体验一致,完善的SEO功能,提升网站曝光度,基于PbootCMS构建,源码开放可定制。查看源码 -
(PC+WAP)盆栽绿植观赏植物花卉租赁免费pbootcms网站模板为花卉盆栽租赁、园林绿化企业打造的PbootCMS网站模板,采用较新内核开发,PC与移动端数据实时同步。通过清新自然的视觉设计,精准展现植物养护、花卉展示等业务场景,帮助用户快速建立专业级行业网站。查看源码 -
(响应式)WordPress主题Ripro9.0博客免扩展二开版RiPro9.0是基于RiPro8.9版本深度二开优化的资源付费主题,源码修正,修复原版多处功能异常,确保系统稳定运行。支持虚拟主机环境部署,无需特殊服务器配置。查看源码 -
(自适应)工商代理公司注册财务会计pbootcms模板免费下载为工商代理、财务会计服务企业设计的网站模板,基于PbootCMS开发,充分考虑了企业服务行业的展示需求与客户转化路径。设计风格专业严谨,布局清晰合理,呈现企业服务内容与专业优势。查看源码
| 分享笔记 (共有 篇笔记) |
