上回只是把模拟的账户充值窗口实现了,不过还是一个李鬼,充值信息也不可能只有一项吧。
那么就先来改造这个窗口吧,打开\themes\mall\default文件夹下的account.form.html,看到它只有可怜的几行,最主要的form里是这么个情况
<form method="POST" target="iframe_post" action="index.php?app=account&act=add" id="account_form"> <ul> <li> <h3>{$lang.receiver}: </h3> <p><input type="text" class="text width_normal" name="user_name"/><span class="tip">{$lang.add_message}</span></p> </li> </ul> <div class="submit"><input type="submit" class="btn" value="{$lang.add_account}" /></div> </form>
想添几行就复制几个<li></li>出来,我给改成了这几行
<ul> <li> <h3>{$lang.recharge_cardno}: </h3> <p><input type="text" class="text width_normal" name="recharge_cardno"/><span class="tip">{$lang.recharge_cardno}</span></p> </li> <li> <h3>{$lang.recharge_name}: </h3> <p><input type="text" class="text width_normal" name="recharge_name"/><span class="tip">{$lang.recharge_name}</span><span class="require">(*)</span></p> </li> <li> <h3>{$lang.recharge_bank}: </h3> <p><input type="text" class="text width_normal" name="recharge_bank"/><span class="tip">{$lang.recharge_bank}</span><span class="require">(*)</span></p> </li> <li> <h3>{$lang.recharge_amount}: </h3> <p><input type="text" class="text width_normal" name="recharge_amount"/><span class="tip">{$lang.recharge_amount}</span><span class="require">(*)</span></p> </li> <li> <h3>{$lang.recharge_time}: </h3> <p><input type="text" class="text width_normal" name="recharge_time"/><span class="tip">{$lang.recharge_time}</span><span class="require">(*)</span></p> </li> <li> <h3>{$lang.recharge_remark}: </h3> <p><input type="text" class="text width_normal" name="recharge_remark"/><span class="tip">{$lang.recharge_remark}</span></p> </li> </ul>
所实现的效果呢
我恨多语言!为什么国际语推行不下去呢。再到\languages\sc-utf-8文件夹的account.lang.php文件中添加这些数组元素
'recharge_cardno'=>'充值账号', 'recharge_name'=>'充值人姓名', 'recharge_bank'=>'充值银行', 'recharge_amount'=>'充值金额', 'recharge_time'=>'充值时间', 'recharge_remark'=>'备注',
哦了
凭我的直觉,如果需要记录这些充值信息的话,是不是应该新建一个表呢?好像是的哎。
那么就来设计一下这个表吧。我先看看ecmall默认的表是怎么起名字的。
好像都是以一个前缀开始的,那么我也来一个,起名叫ecm_rechage吧,具体代码如下
-- -- 表的结构 `ecm_recharge` -- CREATE TABLE IF NOT EXISTS `ecm_recharge` ( `recharge_id` int(10) NOT NULL AUTO_INCREMENT COMMENT '//自动编号', `recharge_sn` varchar(30) NOT NULL COMMENT '//记录唯一标示', `member_id` int(11) NOT NULL COMMENT '//会员编号', `member_name` varchar(50) NOT NULL COMMENT '//充值用户名', `recharge_amount` decimal(10,2) NOT NULL COMMENT '//充值金额', `payment` varchar(20) NOT NULL COMMENT '//充值方式', `onlinecode` varchar(50) DEFAULT NULL COMMENT '//线上支付交易流水', `recharge_name` varchar(50) NOT NULL COMMENT '//汇款人姓名', `recharge_bank` varchar(50) NOT NULL COMMENT '//汇款银行', `recharge_cardno` varchar(50) DEFAULT NULL COMMENT '//充值卡号', `recharge_time` int(11) NOT NULL COMMENT '//汇款日期', `recharge_remark` varchar(200) DEFAULT NULL COMMENT '//会员备注', `add_time` int(11) NOT NULL COMMENT '//添加时间', `state` int(11) NOT NULL DEFAULT '0' COMMENT '//状态 0申请中 1完成 2关闭', `paystate` int(11) NOT NULL DEFAULT '0' COMMENT '//支付状态 0未支付 1已支付', `admin_remark` varchar(200) DEFAULT NULL COMMENT '//管理员备注', PRIMARY KEY (`recharge_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='//充值日志表' ;
其中的线上交易流水是为了以后进行线上充值设计的,充值用户名按说不需要存,想显示的时候通过连接查询就能得到,但是我实在是懒,我觉得存在一个表里肯定更方便。
OK,设计好了数据表就开始打算怎么往这个表里插数据了。在上面那个form的action里可以看到这些数据是提交给account的app的add方法的,那么在add方法需要有人接收这些数据啊,还得改,不过在研究怎么改的时候我突然发现原来有一项“我的地址”的功能和我需要的好像啊。
既然这样,那就去找这个app吧。看到了my_address.app.php,应该是了。直接把my_address.app.php的add()方法复制到account.app.php里吧(我好懒)
function add() { if (!IS_POST) { /* 当前位置 */ /*$this->_curlocal(LANG::get('member_center'), 'index.php?app=member', LANG::get('my_address'), 'index.php?app=my_address', LANG::get('add_address'));*/ //$this->import_resource('mlselection.js, jquery.plugins/jquery.validate.js'); $this->assign('act', 'add'); $this->_get_regions(); header('Content-Type:text/html;charset=' . CHARSET); $this->display('my_address.form.html'); } else { /* 电话和手机至少填一项 */ if (!$_POST['phone_tel'] && !$_POST['phone_mob']) { $this->pop_warning('phone_required'); return; } $region_name = $_POST['region_name']; $data = array( 'user_id' => $this->visitor->get('user_id'), 'consignee' => $_POST['consignee'], 'region_id' => $_POST['region_id'], 'region_name' => $_POST['region_name'], 'address' => $_POST['address'], 'zipcode' => $_POST['zipcode'], 'phone_tel' => $_POST['phone_tel'], 'phone_mob' => $_POST['phone_mob'], ); $model_address =& m('address'); if (!($address_id = $model_address->add($data))) { $this->pop_warning($model_address->get_error()); return; } $this->pop_warning('ok', APP.'_'.ACT); } }
继续照葫芦画瓢,改一改呗,怎么感觉这么没有挑战性。我好分裂,又懒又想干高难度的。
function add() { if (!IS_POST) { $this->assign('act', 'add'); //$this->_get_regions(); header('Content-Type:text/html;charset=' . CHARSET); $this->display('account.form.html'); } else { if (!$_POST['recharge_name'] ) { $this->pop_warning('name_required'); return; }else if (!$_POST['recharge_bank'] ) { $this->pop_warning('bank_required'); return; }else if (!$_POST['recharge_amount'] ) { $this->pop_warning('amount_required'); return; }else if (!$_POST['recharge_time'] ) { $this->pop_warning('time_required'); return; } $data = array( 'recharge_sn'=>$this->create_sn(), 'member_id' => $this->visitor->get('user_id'), 'member_name'=>$this->visitor->get('user_name'), 'recharge_amount' => $_POST['recharge_amount'], 'payment'=>'offline', 'recharge_name' => $_POST['recharge_name'], 'recharge_bank' => $_POST['recharge_bank'], 'recharge_cardno' => $_POST['recharge_cardno'], 'recharge_time' => strtotime($_POST['recharge_time']), 'recharge_remark' => $_POST['recharge_remark'], 'add_time'=>time(), ); $model_recharge =& m('recharge'); if (!($account_id = $model_recharge->add($data))) { $this->pop_warning($model_recharge->get_error()); return; } $this->pop_warning('ok', APP.'_'.ACT); } }
其中'recharge_sn'的方法create_sn()如下
/** * create_sn()创建充值唯一编号 * * */ function create_sn() { $pre='recharge_'; $time=microtime();//当前毫秒时间戳 $timearr=explode(" ", $time); $time2=explode(".", $timearr[0]); $sn=$pre.$timearr[1].$time2[1]; return $sn; }
再在account.lang.php中添加如下键值对
'name_required'=>'请输入充值人姓名', 'bank_required'=>'请输入充值银行', 'amount_required'=>'请输入充值金额', 'time_required'=>'请输入充值时间',
点击测试
为什么没反应呢?再用chrome监视一下Response
它说在一个不是对象的东西上调用了add()这个成员方法。那就去看看account.app.php的第101行,有这么一句话
$model_recharge =& m('recharge');
有一个神秘而又强大的m()方法,定义到这个方法,它的作用就是返回一个模型。在\eccore文件夹下的ecmall.php文件里。
/** * 获取一个模型 * * @author Garbin * @param string $model_name * @param array $params * @param book $is_new * @return object */ function &m($model_name, $params = array(), $is_new = false) { static $models = array(); $model_hash = md5($model_name . var_export($params, true)); if ($is_new || !isset($models[$model_hash])) { $model_file = ROOT_PATH . '/includes/models/' . $model_name . '.model.php'; if (!is_file($model_file)) { /* 不存在该文件,则无法获取模型 */ return false; } include_once($model_file); $model_name = ucfirst($model_name) . 'Model'; if ($is_new) { return new $model_name($params, db()); } $models[$model_hash] = new $model_name($params, db()); } return $models[$model_hash]; }
可以看到这个方法里又需要引用\includes\models文件夹下的*.model.php文件。咱们现在没有这个文件,当然返回不了模型啦。
复制\includes\models文件夹下的address.model.php改名为recharge.model.php
<?php /* 充值记录 recharge */ class RechargeModel extends BaseModel { var $table = 'recharge'; var $prikey = 'recharge_id'; var $_name = 'recharge'; /* 表单自动验证 */ var $_autov = array( 'member_id' => array( 'required' => true, ), 'recharge_name' => array( 'required' => true, 'filter' => 'trim', ), 'recharge_bank' => array( 'required' => true, 'filter' => 'trim', ), 'recharge_amount' => array( 'required' => true, 'filter' => 'trim', ), 'recharge_time' => array( 'required' => true, 'filter' => 'trim', ), ); /* 关系列表 */ var $_relation = array( // 一个充值记录只能属于一个会员 'belongs_to_member' => array( 'model' => 'member', 'type' => BELONGS_TO, 'foreign_key' => 'member_id', 'reverse' => 'has_recharge', ), ); } ?>
再测试一遍
去数据库看一看
问题解决。