分享

ECSHOP源码解析 | Crazy's Blog

 quasiceo 2014-05-03
ECSHOP源码解析
2012年09月14日 | PHP | 共 5657字 | 评论数 2

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

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

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

修改第38行代码为

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

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

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

上面的方法 想必不用解释了吧,也就是获取到标记中的内容。这里有很多种方式的,但是为了整体一致,我还是采用源码中的方式进行。 第三步:在修改安装目录upload\admin\文件夹下面的privilege.php中找到$_REQUEST['act']=='list'并修改为如下代码:

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

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

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

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

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

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多