2010/01/31

[CodeIgniter] 顯示所有活動

本篇要來新增主要功能了,預設進入首頁會顯示所有活動的項目
這篇就可以充分展現使用MVC的優勢了

新增報名資料到DB
因為還沒有寫介面讓管理員新增活動資料(這步之前還要寫帳戶登入,後台功能等)
所以直接開phpmyadmin新增兩筆資料
INSERT INTO `signup`.`event` (
 `sn` ,
 `topic` ,
 `desc` ,
 `start_time` ,
 `end_time` ,
 `joiner_no`
)
VALUES (
 NULL , 'CI教學研討會台北場', 'CodeIgnitor教學研討會描述', '2010-01-31 00:32:46', '2010-02-07 00:32:52', '10'
), (
 NULL , 'CI教學研討會台中場', 'CodeIgnitor教學研討會描述', '2010-02-08 00:33:16', '2010-02-23 00:33:24', '20'
);

講到這 CI 內建一個可以直接新增資料的功能,不需要打開phpmyadmin,叫做scaffolding


修改Controller: signup
如果在準備工作中還沒把config/database.php的DB連接資料設定好,請先完成設定。
由於CI是採自行 Load Library的方式,所以用到啥就要先讀取進來(部分基礎功能預設會自動載入,如需要自動載入Library也可在config.php內設定`)
由於預期整個報名作業都會用到DB,所以把載入Library語法直接放在constructor內即可。
講到這,看的懂的人應該少數,所以直接放CODE比較好懂 囧
Controller: signup.php
function signup(){
  parent::Controller();
  //load database library
  $this->load->database();
}

載入Database Library後,開始寫首頁吧
Controller: signup.php
function index(){
 //get event table content
 $data['title'] = 'Event List';        $data['event'] = $this->db->get('event');
 $data['content'] = 'home';
 $this->load->view('index',$data);
}

$data['title'] = 'Event List';  <= 設定首頁的Title
$data['event'] = $this->db->get('event');  <= 讀取event table的資料
好,完成。

比較一下沒CI的寫法:(憑印象寫的 應該會錯XDD)
$conn = mysql_connect();
if (!$link) {
    die('Could not connect: ' . mysql_error());
}
$result = mysql_query("SELECT * FROM event");
mysql_close($link);

省事很多吧!CI 叫 Active Record 讓查詢資料庫十分簡單,且把存取DB的動作抽象化,如之後要改DB的種類(ex: Mysql -> MS SQL)就不用動程式碼,只需要把database.php修改即可。
如對Active Record需要更深的了解,請到http://ci.wuboy.twbbs.org/user_guide/database/active_record.html

修改View: home.php
<h1><?php echo $title?></h1>
<?php if( $event->num_rows() > 0 ):?>
<?php foreach($event->result() as $row):?>
 <div id='event-<?php echo $row->sn; ?>' class='post'>
  <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; ?>
  </p>
  <div class='entry'><p><?php echo $row->desc; ?></p></div>
 </div>
 <hr/>
<?php endforeach;?>
<?php endif;?>

紅字部分是PHP語法,幾乎都是ECHO語法,幾點抓出來講
$event->num_rows()  <= 取得資料的個數
$event->result()  <= 抓取資料列,與mysql_fetch_object相同;同理可以使用$event->result_array() 以陣列形式取得值。
$row->欄位名稱  <= 就是抓欄位名稱XD

輸入http://127.0.0.1/ci/signup

就可以看到成果了,很簡單吧!

免進DB直接編修DB: scaffolding
此功能可以直接在網頁新增、編輯、刪除DB的動作,對於測試時還蠻好用的,但是也因為太強大,正式上線建議不要用。
需要設定兩個地方
  1. application/config/route.php
    $route['scaffolding_trigger'] = "scaffolding";
    紅字可修改成自己想要的字串,用以在網頁輸入使用。
    打入http://127.0.0.1/ci/signup/scaffolding/可以進入畫面。
  2. Controller內的Constructor內新增 $this->load->scaffolding('event');
    紅字為想存取的Table Name,只能輸入一個

兩者缺一不可!


Source Code
Controller: signup.php
Class Signup extends Controller{
 function signup(){
  parent::Controller();
  //load database library
  $this->load->database();
  $this->load->scaffolding('event');
 }
 function index(){
  //get event table content
  $data['title'] = 'Event List';
  $data['event'] = $this->db->get('event');
  $data['content'] = 'home';
  $this->load->view('index',$data);
 }
}


View: home.php
<h1><?php echo $title?></h1>
<?php if( $event->num_rows() > 0 ):?>
<?php foreach($event->result() as $row):?>
 <div id='event-<?php echo $row->sn; ?>' class='post'>
  <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; ?></p>
  <div class='entry'><p><?php echo $row->desc; ?></p></div>
 </div>
 <hr/>
<?php endforeach;?>
<?php endif;?>


下一篇要來設計表單讓使用者報名了

沒有留言:

張貼留言