上回只是把模擬的賬戶充值窗口實現了,不過還是一個李鬼,充值信息也不可能只有一項吧。
那麼就先來改造這個窗口吧,打開\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', ), ); } ?>
再測試一遍
去數據庫看一看
問題解決。