前些天,寝室一朋友给我拿了一道ECSHOP的面试题,当时的我对商派EXSHOP还是有所了解的,于是答应帮他看看。但是一直都没时间做,等到昨天中午的时候才加紧看了一下源码,代码封装的还算不错的,结果前端页面样式弄好了但是功能没有得到实现。但是答应了别人的事还是的做好,于是到了晚上给加班弄好了。 例子是一个在ECSHOP 后台权限管理列表页面增加一个用户名和email邮箱搜索条件,并在列表下端显示分页效果。如下图所示。
实现原理如下: 第一步:在修改安装目录upload\admin\templates文件夹下面的privilege_list.htm中的smarty模板页面第6行增加如下代码:
- <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行代码为
- {foreachelse}
- <tr><td class="no-records" colspan="10">{$lang.no_records}</td></tr>
- {/foreach}
第二步:找到页面下端的javascript中literal代码段,将其修改为如下代码:
- {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'并修改为如下代码:
- 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'并修改为如下代码:
- 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()整个所有数据到数组中,下面介绍。 第四步:在页面末尾处增加一个方法
- 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;
- }
上面这个方法整合了通过条件查询时的数据结果和一些分页信息。具体实现可以根据上面代码分析。上述功能就是对这次面试题的代码量。终于做完。睡觉!!!
|