Your posts match “ php ” tag:

CodeIgniter 筆記 (一)

CodeIgniter

簡單做個筆記免得我到時候忘記,這真的是一個很神奇的Web framework (跟Rails比起來) …

建立一個新的Project

從官方網站 http://www.codeigniter.org.tw 下載下來後解壓縮,然後你的project叫做什麼就把資料夾名稱改成什麼這樣就好了。

  • rails的做法是rails new project_name

建立Controller

自己在application/controllers/資料夾中建立name.php的檔案就可以了,至於內容要填入

<?php

class Name extends CI_Controller {

  public function index($page = 'home')
  {
  }
}

這樣的code,其中$page = 'home'這段還不知道用意 …

注意哦,那個name的意思是你要叫什麼就打什麼,譬如是Users這個Controller你就建立users.php,然後class name是Users這樣。

  • rails的做法是 rails g controller name

Route

這是我覺得最神奇的地方 … 花了半個小時才發現自己錯在哪裡

假設我有一條route是 /users 這樣,我可以這樣寫設定

$route['users'] = "users/index";

它會自動mapping到users這個controller底下的index action這樣,但是我在瀏覽器上不管怎樣測試都失敗,後來我就在URL上寫成/index.php/users,然後就 … 過了 -_-

  • rails 的route我就不講了 … 很多種搭配,還有RESTful,CI看起來似乎並沒有RESTful的玩法在。

Model

它的model的建立方法是在application/models/底下建立name_model.php檔案,然後在Controller中用$this->load->model('name_model');來把它拉進來。

假設我們現在要有一個User model,所以我們先建立application/models/user_model.php,然後裡面寫

<?php
class User_model extends CI_Model {

  public function __construct()
  {
    $this->load->database();
  }

  public function all_users(){

    $query = $this->db->get('users');
    return $query->result_array();
  }
}

(附帶一提,有趣的是,CI的ORM也叫做ActiveRecord)

好,其中$this->db->get('users');這部分的作用就是跟db說它要撈users這個表。

(另外,如果要加上where的條件的時候,可以用$this->db->get_where('users', array('condition_1' => '1'));這種形式的語法來做)

然後我們就可以在controller中這樣撈資料:

$data["users"] = $this->user_model->all_users();

接著,view的部分就可以用foreach把$users的東西給dump出來 ...

  • rails建立model的方式是rails g model name

View

為什麼要把View拆開來說呢?因為 … 它很神奇

首先,似乎沒有像Rails有application.html.erb這個東西的概念,它的layout是另外自己拼湊出來的 … 我在我的Controller中寫了如下的code

$this->load->view('templates/header', $data);
$this->load->view('users/index', $data);
$this->load->view('templates/footer', $data);

然後,要自己在application/views/底下建立templatesusers兩個資料夾,自己建立header.php, footer.php以及在users底下建立index.php然後自己load進來,反正在CI裡面什麼都要自己load就對了XD

那第二個參數的$data幹嘛用的?其實就是把Controller的變數扔到前端用的,在Rails裡面這部分直接設定成instance variable就可以了,不過因為PHP的特性或者是CI的架構,這部分只能另外傳。

呼 …

先這樣吧,MVC都有基礎的認識了,剩下就是看文件然後自己幹一套系統出來,以上。

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找到同樣的功能 … (哭)