ecmall开发记录(四)

  上回只是把模拟的账户充值窗口实现了,不过还是一个李鬼,充值信息也不可能只有一项吧。

   

  那么就先来改造这个窗口吧,打开\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',
        ),
    );
}

?>

  再测试一遍

  

  去数据库看一看

  

  问题解决。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章