ECSHOP源码解析

前些天,寝室一朋友给我拿了一道ECSHOP的面试题,当时的我对商派EXSHOP还是有所了解的,于是答应帮他看看。但是一直都没时间做,等到昨天中午的时候才加紧看了一下源码,代码封装的还算不错的,结果前端页面样式弄好了但是功能没有得到实现。但是答应了别人的事还是的做好,于是到了晚上给加班弄好了。 例子是一个在ECSHOP 后台权限管理列表页面增加一个用户名和email邮箱搜索条件,并在列表下端显示分页效果。如下图所示。

7

实现原理如下:

修改模板

在修改安装目录upload/admin/templates文件夹下面的privilege_list.htm中的smarty模板页面第6行增加如下代码:

1
2
3
4
5
6
7
<div class="form-div">
<form action="javascript:searchUser()" name="searchForm" accept-charset="utf-8">
{$lang.user_name} <input type="text" name="keywords" size="18" />
{$lang.email} <input type="text" name="email" size="18" />
<input type="submit" value="{$lang.button_search}" />
</form>
</div>

修改第38行代码为

1
2
3
{foreachelse}
<tr><td class="no-records" colspan="10">{$lang.no_records}</td></tr>
{/foreach}

修改脚本js

找到页面下端的javascript中literal代码段,将其修改为如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{literal}
onload = function(){
document.forms['searchForm'].elements['keywords'].focus();
document.forms['searchForm'].elements['email'].focus();
startCheckOrder();
}
function searchUser(){
listTable.filter['keywords'] =Utils.trim(document.forms['searchForm'].elements['keywords'].value);
listTable.filter['email'] = Utils.trim(document.forms['searchForm'].elements['email'].value);
listTable.filter['page'] = 1;
listTable.loadList();
}
function confirm_bath(){
userItems = document.getElementsByName('checkboxes[]');
cfm = '{$lang.list_remove_confirm}';
for (i=0; userItems[i]; i++){
if (userItems[i].checked && userItems[i].notice == 1){
cfm = '{$lang.list_still_accounts}' + '{$lang.list_remove_confirm}';
break;
}
}
return confirm(cfm);
}
{/literal}

上面的方法 想必不用解释了吧,也就是获取到标记中的内容。这里有很多种方式的,但是为了整体一致,我还是采用源码中的方式进行。

修改控制器

在修改安装目录upload/admin/文件夹下面的privilege.php中找到$_REQUEST[‘act’]==’list’并修改为如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
elseif ($_REQUEST['act'] == 'list'){
//模板赋值
$user_list = user_list();
$smarty->assign('record_count', $user_list['record_count']);
$smarty->assign('page_count', $user_list['page_count']);
$smarty->assign('action_link', array('href'=>'privilege.php?act=add', 'text' =>$_LANG['admin_add']));
$smarty->assign('full_page', 1);
$smarty->assign('filter', $user_list['filter']);
$smarty->assign('admin_list', get_admin_userlist());
//显示页面
assign_query_info();
$smarty->display('privilege_list.htm');
}

找到$_REQUEST[‘act’]==’query’并修改为如下代码:

1
2
3
4
5
6
7
8
9
10
11
elseif($_REQUEST['act']=='query'){
$user_list = user_list();
$smarty->assign('admin_list', $user_list['user_list']);
$smarty->assign('filter', $user_list['filter']);
$smarty->assign('record_count', $user_list['record_count']);
$smarty->assign('page_count', $user_list['page_count']);
$sort_flag = sort_flag($user_list['filter']);
$smarty->assign($sort_flag['tag'], $sort_flag['img']);
make_json_result($smarty->fetch('privilege_list.htm'), '',
array('filter' =>$user_list['filter'],'page_count' => $user_list['page_count']));
}

这里是处理刚才javascript代码提交过来的数据,在这个判断结构中修改了原有的代码,需要传递的参数有用户列表数据分页数据等等。 所以我们将这些信息整合成数组形式传递过去使用。使用方法user_list()整个所有数据到数组中,下面介绍。 第四步:在页面末尾处增加一个方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
function user_list(){
$result = get_filter();
if ($result === false){
$filter['keywords'] = empty($_REQUEST['keywords']) ? ' ' : trim($_REQUEST['keywords']);//获取搜索词1
$filter['email'] = empty($_REQUEST['email']) ? ' ' : trim($_REQUEST['email']);//获取搜索词2
if (isset($_REQUEST['is_ajax']) && $_REQUEST['is_ajax'] == 1){
$filter['keywords'] = json_str_iconv($filter['keywords']);//转码
$filter['email'] = json_str_iconv($filter['email']);//转码
}
$filter['sort_by'] = empty($_REQUEST['sort_by']) ? 'user_id' : trim($_REQUEST['sort_by']);
$filter['sort_order'] = empty($_REQUEST['sort_order']) ? 'DESC' : trim($_REQUEST['sort_order']);
$ex_where = ' WHERE 1 ';
//下面的判断语句是两个条件之间的关系判断。
if ($filter['keywords']&&$filter['email']){
$ex_where .= " AND user_name LIKE '%" . mysql_like_quote($filter['keywords']) ."%' AND email
LIKE '%" . mysql_like_quote($filter['email'])."%' ";
}elseif($filter['keywords']){
$ex_where .= " AND user_name LIKE '%" . mysql_like_quote($filter['keywords']) ."%'";
}elseif($filter['email']){
$ex_where .= " AND email LIKE '%" . mysql_like_quote($filter['email']) ."%'";
}
$filter['record_count'] = $GLOBALS['db']->getOne("SELECT COUNT(*) FROM " . $GLOBALS['ecs']->
table('admin_user') . $ex_where);//获取总记录数
$filter = page_and_size($filter);
$sql = "SELECT user_id, user_name, email,add_time,last_login ".
" FROM " . $GLOBALS['ecs']->table('admin_user') . $ex_where .
" ORDER by " . $filter['sort_by'] . ' ' . $filter['sort_order'] .
" LIMIT " . $filter['start'] . ',' . $filter['page_size'];
$filter['keywords'] = stripslashes($filter['keywords']);
set_filter($filter, $sql);
}else{//无任何条件时
$sql = $result['sql'];
$filter = $result['filter'];
}
$user_list = $GLOBALS['db']->getAll($sql);//条件查询结果
foreach ($user_list as $key=>$val){
//格式化时间
$user_list[$key]['add_time'] = local_date($GLOBALS['_CFG']['time_format'], $user_list[$key]['add_time']);
$user_list[$key]['last_login']=local_date($GLOBALS['_CFG']['time_format'], $user_list[$key]['last_login']);
}
//所有数据整合到数组中
$arr = array('user_list' => $user_list, 'filter' => $filter,
'page_count' => $filter['page_count'], 'record_count' => $filter['record_count']);
return $arr;
}

上面这个方法整合了通过条件查询时的数据结果和一些分页信息。具体实现可以根据上面代码分析。上述功能就是对这次面试题的代码量。终于做完。睡觉!!!

(The End)

坚持原创技术分享,您的支持将鼓励我继续创作!