您现在的位置是:首页 > 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如何修复数据表ecs_sessions.MYI报错
由于MySQL本身的读写及锁定机制等方面的原因,与一些其他数据库软件一样,在特殊情况下的极为频繁读写时,或在服务器掉电、死机等情况下
ecshop各个页面主要文件功能说明
1.模板文件说明style.css - 模板所使用样式表activity.dwt - 活动列表article.dwt - 文章内容页article_cat.dwt - 文章列表页article_pro.dwt - 前一篇文章auction.d
ecshop顶部的欢迎光临本店修改和删除方法
我想把ECSHOP页面顶部的“欢迎光临本店”几个字删掉或者修改成别的文字,请问如何修改?
相关源码
-
帝国cms7.5模板情感文学名言名句心情文章类源码下载带手机本模板基于帝国CMS7.5开发,为情感文学类网站设计。整体风格温馨雅致,布局合理清晰,特别适合建设情书分享、文学作品展示类网站。模板采用响应式设计,能够自动适配各种终端设备。查看源码 -
帝国cms7.5自适应手机端在线课程教育网站源码基于帝国CMS后台管理系统,支持在线修改支付参数、联系方式等配置信息,操作界面直观便捷。专注于在线教育视频领域,提供完整的视频课程展示、付费购买及在线支付解决方案。支持多种支付渠道,满足教育培训机构的运营需求。查看源码 -
帝国cms自适应古诗词古籍名句网站整站带数据基于帝国CMS打造的专业古诗词文化网站模板,专注于古典文学内容的展示与传播。模板设计蕴含传统文化韵味,支持诗词鉴赏、名句赏析、古籍整理等特色功能,为诗词爱好者提供优质的在线阅读体验。查看源码 -
响应式电脑维修办公用品维护pbootcms网站模板模板介绍(自适应手机版)响应式电脑修理公司pbootcms网站模板-蓝色HTML5电脑修理维修店网站源码下载PbootCMS内核开发的营销型网站模板,该模查看源码 -
(PC+WAP)中英双语户外用品帐篷装备pbootcms网站模板下载这款基于PbootCMS开发的中英文双语模板专为户外装备行业设计,适配PC和移动设备。模板采用现代化设计风格,突出户外产品的功能性和实用性,帮助企业建立专业的国际化展示平台。查看源码 -
PbootCMS(自适应手机端)智能电话AI机器人网站模板产品概述基于PbootCMS内核开发的智能电话AI机器人网站模板,为语音交互服务场景设计,采用HTML5+CSS3响应式布局技术,实现PC端与移动端数据实时同步展示。模板适用于智能电话查看源码
| 分享笔记 (共有 篇笔记) |
