ecshop 会员卡的添加说明

最近工作需要,开始研究ecshop。根据我们需求情况,需要对用户添加会员卡字段,用来保存分发给用户的会员卡卡号,于是看了网上很多文章,觉得他们对用户的拓展字段的添加不是很好,大多都是说的模糊又不规范,或者使用直接修改现有数据结构的方式,个人认为不是特别好的做法,于是自己试着按照拓展的方法进行修改,以下便是我的修改过程,如有不当我们可以互相学习一起进步。

首先登陆后台,打开系统设置》会员注册项设置,然后添加一个新的注册项名称,例如“会员卡”,按需要选择下面的配置选项,然后确定提交。此时你在前台注册页面会发现注册字段中最下面多了一个“会员卡”注册文本框,他的排列顺序可以再后台修改。现在会员卡字段是添加了,但是却还没有验证该字段,这样用户可以输入任何正规字符,显然这不是我们所需要的。

接着我们找到“/js/user.js”文件,找到“function register()”函数,该函数是处理注册用户时触发的,在该函数头部声明变量的地方(如:“var sel_question =  frm.elements['sel_question'] ? Utils.trim(frm.elements['sel_question'].value) : '';”)下面添加新的一行,加入代码:“var membercard = frm.elements['extend_field100'] ? Utils.trim(frm.elements['extend_field100'].value) : '';    // 会员卡”,此时定义了一个名为membercard的会员卡变量,用来获取表单中的会员卡文本,其中“extend_field100”是该会员卡字段的name属性(注:该name是系统自动生成的,发现与添加时候的排序值有关。可以使用firefox+firebug快速查看该属性值)。接着在下面一大串if语句的下面,不过要在提交表单之前加入验证代码:
// 会员卡验证
if (membercard.length>0){
    var reg = /^\d{12,18}$/;
    if (!reg.test(membercard) || membercard.length > 18){
        msg += '- 会员卡必须由 12-18 位数字组成!' + '\n';
    }
}

我这里的验证只是我需要的,是使用正则表达式匹配一个12到18位的数字字符串,并且总不能大于18,大家应该修改为自己需要的验证方式。

到这里,基本的添加已经完成了,但是我发现ecshop的验证并不完善,对于用户登陆后修改会员信息时,基本没有进行验证,所以请将注册时的验证代码正确地加入到“/js/user.js”文件的“function userEdit()”函数中意保持信息验证一致,这里就不细细说明了。

原本到这里已经可以结束该话题了,但是可能有很多朋友会问:那我该如何获取该信息呢?其实也不是很难,只需要在需要的地方使用一条联合查询语句就可以了。一下就针对在后台用户列表中添加一列显示用户会员卡号码为例子作为说明。

刚开始我打开“/admin/users.php”文件,找到用户账户列表处,发现获取用户信息代码并不在此处,原来是使用“user_list()”函数进行调用的,该函数在这个文件的下面,大概673行左右。然后下拉看到“$filter = page_and_size($filter);”改行,下面是一个sql查询语句,我们将要在这里加入拓展字段,修改如下:

原查询语句:
        $sql = "SELECT user_id, user_name, email, is_validated, user_money, frozen_money, rank_points, pay_points, reg_time ".
                " FROM " . $GLOBALS['ecs']->table('users') . $ex_where .
                " ORDER by " . $filter['sort_by'] . ' ' . $filter['sort_order'] .
                " LIMIT " . $filter['start'] . ',' . $filter['page_size'];

修改后的查询语句:
        $sql = "SELECT u.user_id, user_name, email, is_validated, user_money, frozen_money, rank_points, pay_points, reg_time, content as membercard ".
                " FROM " . $GLOBALS['ecs']->table('users') . " AS u LEFT OUTER JOIN " . $GLOBALS['ecs']->table('reg_extend_info')." AS re ".
                "ON u.user_id = re.user_id" . $ex_where .
                " ORDER by " . $filter['sort_by'] . ' ' . $filter['sort_order'] .
                " LIMIT " . $filter['start'] . ',' . $filter['page_size'];

这里大概解释下,使用LEFT OUTER JOIN左联接,因为这里我把用户表帮左边,请根据需要自行修改。还需要修改统计查询语句,在该sql的上面几行,看到如下代码:
       $filter['record_count'] = $GLOBALS['db']->getOne("SELECT COUNT(*) FROM " . $GLOBALS['ecs']->table('users') . $ex_where);
将他们修改为:
       $sqlcount = "SELECT COUNT(*) FROM " . $GLOBALS['ecs']->table('users') . " AS u LEFT OUTER JOIN " . $GLOBALS['ecs']->table('reg_extend_info')." AS re ON u.user_id = re.user_id" . $ex_where;
       $filter['record_count'] = $GLOBALS['db']->getOne($sqlcount);

现在还差一步:添加查询条件,在
        if ($filter['pay_points_lt'])
        {
            $ex_where .=" AND pay_points < '$filter[pay_points_lt]' ";
        }
下面加入如下代码:
        $ex_where .= " AND (re.reg_field_id =7 OR ISNULL( re.reg_field_id ))";
现在后台的函数库已经更新了,还差最后一步,就是在页面中显示出来。

找到“/admin/templates/users_list.htm”该后台模版文件,在“<th><a href="javascript:listTable.sort('email'); ">{$lang.email}</a>{$sort_email}</th>”下面添加“<th>会员卡</th>”代码(住:如果需要多语言包,请在/languages中修改和添加字段),在“<td><span οnclick="listTable.edit(this, 'edit_email', {$user.user_id})">{$user.email}</span></td>”下面添加“<td>{$user.membercard}</td>”,至此,就修改完成了。

总结:添加拓展字段主要是sql语句比较麻烦,需要使用到联合查询和正确地条件语句。相信大家如果了解了以上内容,即可添加更多的拓展字段,而不用去修改数据库和原有字段,并且这样可以保留原有,不需要显示只需隐藏而已,我想这应该是比较好的做法!

文章出自http://www.lonery.com/view_article.php?aid=37
发布了3 篇原创文章 · 获赞 4 · 访问量 3万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章