上回只是把模拟的账户充值窗口实现了,不过还是一个李鬼,充值信息也不可能只有一项吧。
那么就先来改造这个窗口吧,打开\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',
),
);
}
?>
再测试一遍
去数据库看一看
问题解决。