您现在的位置是:首页 > 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 函数代码
/**
* 重写 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]}();

本文标签:

很赞哦! ()

相关源码

  • (自适应响应式)蓝色律师事务所法务团队网站pbootcms模板为律师事务所和法律服务机构打造的专业网站模板,展现法律专业性与权威性,手工编写标准DIV+CSS代码,结构清晰优化,确保高效运行,自动适配电脑、平板和手机等各类设备,提供更好浏览体验查看源码
  • (自适应)帝国CMS7.5模板淘宝客导购博客文章源码本模板基于帝国CMS7.5内核深度开发,为电商导购类网站设计。采用响应式布局技术,确保在手机、平板及电脑端均能获得优质浏览体验。模板内置商品推荐模块与优惠信息展示区,可快速搭建专业导购平台。查看源码
  • 帝国cms7.5女性护肤搭配美妆潮流网站源码带数据4.5G本模板专为女性美容护肤行业设计,提供美容护肤、发型设计、女性健康、时尚化妆、娱乐新闻、服饰搭配等女性潮流资讯内容展示。采用帝国CMS7.5开发,同步生成电脑端和手机端,满足用户对美容时尚信息的获取需求。查看源码
  • 响应式pbootcms模板新闻资讯博客自媒体门户网站行业通用解决方案为新闻资讯、自媒体博客打造的响应式网站模板,同时支持企业门户、行业资讯等多场景快速适配。通过简单的图文替换即可实现跨行业转型,显著降低建站成本。查看源码
  • (自适应)简繁双语响应式服装服饰西装工装校服定制pbootcms模板本模板基于PbootCMS内核开发,为服装服饰行业量身打造,尤其适合西装定制、工装生产、校服订制等服装类企业使用。模板采用响应式布局设计,确保在手机、平板、电脑查看源码
  • (自适应响应式)HTML5简繁双语电子元器件设备制造Pbootcms模板下载本模板为电子科技设备制造、电子元件生产等高科技企业设计,采用PbootCMS内核开发,具备简繁双语切换功能。模板设计充分考虑了电子科技行业的技术展示需求,能够专业呈现各类电子元器件、电路板、智能设备的参数规格和应用方案。查看源码
分享笔记 (共有 篇笔记)
验证码:

本栏推荐