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',
        ),
    );
}

?>

  再測試一遍

  

  去數據庫看一看

  

  問題解決。

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