2010/02/08

[CodeIgniter] 報名功能與顯示資訊


在FORM使用那篇中,只完成到顯示表單而已(因為那時候我還沒時間寫 囧)
今天要來追一下目前的進度(我是編寫邊記錄我做了甚麼 所以要到一段落才會在PO文)

完成報名
流程大概是這樣
IF 沒收到資料
    顯示報名表單
ELSE
    //有收到資料
    新增資料到資料庫
    顯示報名成功業面
END


顯示報名表單的部分與先前相同,所以直接KEY程式碼
function join(){
    if( !$this->input->post('name') ){
        $data['title'] = '報名';      

        $query = $this->mevent->get_one( $this->uri->segment(3) );
        $data['event_name'] = $query['topic'];      

        $data['content'] = 'join_form';
        $this->load->view('index',$data);
    }else{
        $insert_id = $this->mjoiner->add();      
        if( $insert_id ){
            $data['joiner'] = $this->mjoiner->get_one( $this->uri->segment(3) );
            $data['title'] = '報名完成';
            $data['content'] = 'join_info';
            $this->load->view('index',$data);
        }else{
            echo "error";
            exit;
        }
    }
}

紅字部分是新增的;在Model: mjoiner中的add() 會將POST過來的資料新增至DB
成功回傳該新增的流水號sn,失敗回傳false(但是DB有問題 CI會先跳錯誤畫面= = 我還不知道怎麼關掉)
再根據回傳的內容來判斷顯示何種內容。(可以自己設計錯誤畫面轉過去)


但是!重新整理會破功
為什麼要特別提這個呢!看起來都很正常不是?
當報名完成後,使用者重新整理的話,就會重複送出資料,要馬寫防止重複的方法,要馬不要給使用者重新整理的機會!
我想到兩種方法:
  1. 新增之後把POST資料清掉,讓使用者重新整理後看錯誤訊息
  2. 新增完成後轉到另個頁面,即使重新整理也不會重複送出
我選擇2比較省事(茶)



$data['joiner'] = $this->mjoiner->get_one( $this->uri->segment(3) );
$data['title'] = '報名完成';
$data['content'] = 'join_info';
$this->load->view('index',$data);

改為
redirect('/signup/joininfo/'.$insert_id, 'refresh');

所以我們需要另一個動作: function joininfo()

顯示報名資訊(改良版)
Controller Function: joininfo
function joininfo(){
    $data['joiner'] = $this->mjoiner->get_one( $this->uri->segment(3) );
    $data['title'] = '報名完成';
    $data['content'] = 'join_info';
    $this->load->view('index',$data);
}

對,只是把剛剛的東西搬過來而已= =
這樣即使重新整理獲回上一頁都不會重複送出


View: join_info.php
<h1><?php echo $title?></h1>

<hr/>
<?php foreach($joiner as $key => $value):?>
<?php     $data[] = array( $key, $value ); ?>
<?php endforeach;?>
<?php echo $this->table->generate($data);?>
<hr/>

<?php echo anchor('signup/','回活動列表');?>

看起來好像比想像中少!因為這裡用了好用的Table Library,之後再寫怎麼用= =

顯示活動所有報名資料
很簡單的小功能,在首頁點選活動標題會顯示所有報名資料。(但是一般只會顯示報名人數,所以只是寫經驗的 XD)
Controller: signup.php
function eventinfo(){
    $sn = $this->uri->segment(3);
    $data['event'] = $this->mevent->get_one($sn);
    $data['joiner'] = $this->mjoiner->get_byevent($sn);    

    $data['title'] = '報名資訊';
    $data['content'] = 'event_info';
    $this->load->view('index',$data);
}

有沒有覺得改用Model之後世界變很美好!
另外還得將原本的View: home.php
<div id='event-<?php echo
$row->sn; ?>' class='post'>
    <h2
class='title'><a href='#'><?php
echo $row->topic; ?></a></h2>
    ....
</div>
改為
<div id='event-<?php echo $row['sn']; ?>' class='post'>
    <h2 class='title'>
        <?php echo anchor('signup/eventinfo/'.$row['sn'], $row['topic']);?>
    </h2>
    ...
</div>
=====複習一下anchor的用法=====
anchor( 連結的位址 , 顯示的文字 ) => <a href='http://127.0.0.1/ci/連結網址'>顯示的文字</a>
======================


View: event_info.php
<h1><?php echo $title?></h1>
<hr/>
<div id='event' class='post'>
        <h2 class='title'>
            <a href='signup/eventinfo/<?php echo $event['sn']?>'><?php echo $event['topic']; ?></a>
        </h2>
        <p class='meta'>
            Time: <?php echo $event['start_time']; ?> ~ <?php echo $event['end_time']; ?>
            | 名額: <?php echo $event['joiner_no']; ?>
        </p>
</div>
<div id='joiner'>
    <?php if( count($joiner) > 0 ):?>
    <?php for($i=0;$i<count($joiner);$i++):?>
    <?php $row = $joiner[$i];?>
    <?php $data[] = array(
                        $i+1,
                        $row['name'],
                        ($row['sex']=='m')?('Male'):('Female'),
                        $row['mobile'],
                        $row['time']
                    );
    ?>
    <?php endfor;?>
    <?php //$this->table->set_template( array('table_open' => '<table border="1">') ); ?>
    <?php $this->table->set_heading('No','Name','Sex','Mobile','Time');?>
    <?php echo $this->table->generate($data);?>
    <?php else:?>
        <h2>無報名資料</h2>
    <?php endif;?>
</div>
紅字都是Table Library的功能,所以看不懂很正常XDD,以下是畫面。(註:我有改CSS)


可以看得出來我在測試剛剛說的重複報名修正


我自己的感覺,使用CI之後,寫程式比較有條理,也不會再看到PHP混著HTML然後不時有SQL與法來攪局。
接下來還要有後台可以管理活動資料,讓使用者登入進而修改報名資料
之後更可以擴展功能,表單驗證、檔案上傳、圖片處理

沒有留言:

張貼留言