CodeIgniter 筆記 (二)

前言

今天晚上又開始繼續研究CodeIgniter,這次開始挑戰DB的新增了 ... (抖)

在實作一個功能的時候想起Rails的方便,不禁悲從中來,不過我還是得繼續寫下去 ... (泣)

Okay,在Rails中我們要做新增資料的時候習慣幹一件事就是把newcreate分開,new本身就只是一個load model初始資料等等用的action,真正在儲存資料的時候是拉到create去做。

所以,在CI裡面我也這樣幹了,然後把Controller內的東西寫到routes去,所以routes.php中有兩段會長這樣

$route['users/new'] = "users/new";
$route['users/create'] = "users/create";

Okay … Good,然後我們也就在users.php這個Controller中寫這樣

  public function new() {
  }
  
  public function create() {
  }

存檔,重新整理首頁(就是/index.php/users這頁),然後 … 爛了 ...

WHY!!!!!!

後來直覺,可能是new這個名稱衝到,我就把route改成這樣

$route['users/new'] = "users/add";

當然Controller的 public function new 改成 public function add,然後重整一次,一切都好了耶 =////= …

Helper

form helper

Okay, good!! keep going,我們就開始要來建立表單了 … 這時候我發現到原來CI也是有helper這種東西的,然後因為Rails裡面有個很屌的form_for可以用,所以我想也許CI也會有,但是 … 我錯了 (遮臉)

引入helper的方式跟Rails不太一樣,Rails基本上自動會load,可是在CI裡面要自己手動load或者寫在application/config/autoload.php內,所以這個部分要小心點。

我很懶,就把url這個helper給拉到autoload.php內註記一下,寫在$autoload['helper'] = array('url');內就可以了,然後在users.php這個Controller的add() action內,我們還要load一個form helper,寫這樣:$this->load->helper('form');

然後我們就可以動手寫view了,自己在application/views/users底下建立new.php,然後裡面就寫上

<h1>新增E-mail</h1>
<hr />
<?php echo form_open('users/create'); ?>
  <p>
    <label for="email">E-mail</label><br />
    <input type="text" name="email" id="email" />
  </p>
  <p>
    <input type="submit" value="送出" />
  </p>
</form>

好了,看到那段 form_open('users/create') 嗎?其實就只是幫你轉那個URL而已 … Orz

url helper

然後我們要在users/index裡面加上這一段

<?php
  echo anchor('users/new', "新增一筆記錄");
?>

這段就像是Rails裡面的link_to啦,只不過link_to是把顯示文字擺在第一個參數,而anchor則是反過來。

Model 與新增資料

view這邊搞定後,我們要開始著手進行資料儲存的工作,這個部分我們必須去找user_model.php談談,要對它新增這樣的一段code

  public function new_user(){

    $data = array(
      'email' => $this->input->post('email')
    );

    return $this->db->insert('users', $data);
  }

然後回傳可能會是true / false,這個部分我不知道 … (文件似乎沒寫,我找不到),所以有了這個之後我們就可以在Controller內進行處理

Controller 對結果的處理與判定

所以,我們要開始撰寫create這個action了

  public function create() {

    $this->load->model('user_model');

    if($this->user_model->new_user()){
      redirect(site_url('users'), 'location', 301);
    } else {
      redirect(site_url('users/new'), 'location', 301);
    }
  }

看到redirectsite_url嗎?這兩個都是我們一開始引入的url helper提供的內容,詳細提供的功能可以來這邊看
http://ellislab.com/codeigniter/user-guide/helpers/url_helper.html

至於我一開始說的Rails的方便的部分是 … 當資料新增失敗的時候,我們可以用render :new來停止跳頁,直接把new這個action的template給render到前端,並且把曾經填入的欄位給預填上去了,不過找來找去沒在CI找到同樣的功能 … (哭)

Comments

comments powered by Disqus