2010/02/05

[CodeIgniter] 報名功能使用Form Helper

首頁已經可以顯示所有報名活動了
本偏要來新增讓使用者報名的功能與介紹Form Helper、Url Helper


加入"我要報名"連結
這個步驟非常簡單,只需要在View: home.php加個連結就好;
但是這次換個方式來加連結
首先請在Class: signup.php signup() 內增加兩行
$this->load->helper('url');          Load Url Helper
$this->load->helper('form');       Load Form Helper

View: home.php中增加連結
...
<h2 class='title'><a href='#'><?php echo $row->topic; ?></a></h2>
    <p class='meta'>
        Time: <?php echo $row->start_time; ?> ~ <?php echo $row->end_time; ?>
         | 人數: <?php echo $row->joiner_no; ?> | <?php echo anchor('signup/join/'.$row->sn,'我要報名');?>
     </p>
...


其中:
anchor( '連結的位址', '連結的文字', '屬性')
範例:
anchor('signup/join/','我要報名')  會生成 <a href='http://127.0.0.1/ci/signup/join/'>我要報名</a>
說明:http://ci.wuboy.twbbs.org/user_guide/helpers/url_helper.html


存檔後,就可以看到有報名的連結了,請先移到連結上是否最後有該活動的SN於後
EX: http://127.0.0.1/ci/signup/join/1  => 沒有的話等下是不知道要報名哪個活動低

報名表單
我把這個表單叫做 join_form.php
<h2><?php echo $title?></h2>
<h3>報名場次: <?php echo $event_name;?></h3>
<hr/>
<?php echo form_open('signup/join');?>
<?php echo form_hidden('event_sn',$this->uri->segment(3));?>
<table>
    <tr>
        <td>Name</td>
        <td><?php echo form_input('name');?></td>
    </tr>
    <tr>
        <td>Sex</td>
        <td><?php echo form_radio('sex','m',true);?> Male
            <?php echo form_radio('sex','f');?>Female
        </td>
    </tr>
    <tr>
        <td>Mobile</td>
        <td><?php echo form_input('mobile');?></td>
    </tr>
    <tr>
        <td colspan='2'><?php echo form_submit('submit','送出');?></td>
    </tr>
</table>
<?php echo form_close();?>
<hr/>

$this->uri->segment( n );
可取得網址的第幾個參數,舉例: signup (1) / join (2) / 1 (3)
所以要取得報名活動的序號使用segment(3)即可
手冊:http://ci.wuboy.twbbs.org/user_guide/libraries/uri.html
 form_open( '目的網址' );
目的網址等同於<form>中的action內容
舉例: form_open('signup/join') 生成 <form action='http://127.0.0.1/ci/signup/join' method='post'>
form_close();
有頭也要有尾,但也可直接使用</form>
form_hidden('name','value');
生成隱藏欄位。
範例:form_hidden('event_sn', $this->uri->segment(3) ); => <input type='hidden' name='event_sn' value='1'/>
form_input( 'name' , '預設值' );
生成input。
範例:form_input('name'); => <input type='text' name='name' />
form_radio( name, value, 是否被選取 );
生成radio。
範例:form_radio('sex','m',true); => <input type='radio' name='sex' value='m' checked='checked' />
form_dropdown( name, 選項 , 預設值 );
這次沒有用,但是這個用起來超方便,只要在選項丟一個array就會產生OPTION
$options = array(
    'small' => 'Small Shirt',
    'med' => 'Medium Shirt',
    'large' => 'Large Shirt',
    'xlarge' => 'Extra Large Shirt'
)
echo form_dropdown('shirts',$options,'large');

我都得這樣生option
foreach($option_ary as $key=>$value){
    $option.= "<option value='$key'>$value</option>";
}
echo "<select name='shirts'> $option </select>";
用這函數就可以自動處理了

form_submit( name , 按鈕的字 );
這個不用說了吧....

View的部分就完成了,但是還欠缺一個變數需要從Controller送過來;就是報名活動的名稱

新增報名表單的功能
Controller: signup.php
        function join(){
            $data['title'] = '報名';
          
            $data['content'] = 'join_form';
            $this->load->view('index',$data);
        }
先把基本的雛形寫好,這樣已經可以點選連結看到報名表單了,但是會有一個錯誤
原因是我想顯示報名場次的名稱,但是controller沒有。

取得報名活動的名稱
這裡就可以用到複雜的Active Record語法
要根據活動的序號 ( Where sn = ? ) 從event table ( From event ) 取得該活動名稱 ( Select topic ),中文剛好反過來對吧!

SQL語法:Select `topic` from event where sn = '$event_sn';

Active Record:
$this->db->select('topic');
$this->db->where('sn', $this->uri->segment(3) );
$query = $this->db->get('event');
其中 where 與 get 可以用 get_where 替代,所以也可寫成這樣
$this->db->select('topic');
$query = $this->db->get_where('event', array('sn' => $this->uri->segment(3) ) );
只是where條件需要以陣列傳入第二個參數
還沒完呢!得把資料抓出來
$row = $query->row();     => row();

適用只抓取一行的情況, 也可用row_array() 取得陣列型態
$data['event_name'] = $row->topic;
打完!收工

總結
介紹了很常用的表單函數,要不要使用當然見人見智。
全部使用form函數可能會讓View中全部都是PHP變數,如果view 是交給沒學過PHP的設計師就不能用了= =

到現在這支程式還沒用到Model,發現了嗎?在抓取活動名稱的時候,用了一堆操作DB的敘述在Controller
這樣還是會讓SQL與法跟流程控制混在一起,日子一久就一整個混亂了。
那有更好的方法嗎?我的想法是讓controller呼叫個函數就可以取得資料了
$data['event_name'] = get_event( $this->uri->segment(3) ); 之類的
這樣子的做法很像Model的概念,所以就來寫個model吧!

沒有留言:

張貼留言