Your posts match “ Note ” 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都有基礎的認識了,剩下就是看文件然後自己幹一套系統出來,以上。

Redis 筆記 (一)

Redis 筆記

Set (集合)

sadd

這可以把東西加到集合內,所以就是:sadd key value1 value2 value3

範例:sadd tools mac iphone ipad

scard

可以透過scard key的方式取得該key有多少values

範例:scard tools 這樣會回傳 4

smembers

可以撈出某個key的所有結果

範例:smembers tools

sismember

可以知道某個key中有沒有某個value,如果有就會是1,沒有就是0

範例:

  • sismembers tools pc => 這樣會是0
  • sismembers tools mac => 這樣當然會是1

srem

把某個value從set中移除,如果這個值不存在就會忽略

範例:srem tools pc => 會被忽略

sinter

取出兩個以上的集合的交集

範例:

smember apple #=> iphone ipad mac macbook
smember tools #=> iphone ipad macbook
sinter apple tools #=> iphone ipad macbook

Hash (雜湊)

hset

這個是設定一個新的Hash,它包含了一個集合名稱、key跟value

範例:hset me name HeChien

hget

然後透過hget把某個hash的某個key讀出來

範例:hget me name => HeChien

hgetall

可以透過hgetall把某個hash的key/value都列出來

範例:hgetall me

hlen

取得某個hash中有多少key

範例:

hmset me name "HeChien" age 25
hlen me

hmset

可以同一時間內設定某個hash中多個key/value pair

範例:hmset me name "HeChien" age 25

hmget

可以同一時間內取得某個hash中多個key/value

範例:hmget me age name sex 回傳值會根據給的順序來排列,找不到的key會回傳(nil)

hexists

判斷某個hash是否存在

範例:hexists me

hdel

透過hdel就把某個hash的某個key給刪掉

範例:hdel me name

其他可以看的hash相關的

  • hincrby
  • hincrbyfloat

其他

del

不管是什麼key,都直接可以把設定好的值都歸零清空

範例:del tools 這樣tools會變成空集合

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

Yii framework 筆記 (一)

最近因為某些原因開始在玩Yii framework這個最近在PHP界很熱門的web framework,因為長年累月玩Rails下來後有一點基本的MVC概念(only for Web),所以移轉到Yii framework上的時候算是容易 ...

安裝

http://www.yiiframework.com/download/下載Framework後,存在一個你認為ok的地方。這個本身就是一個framework而非一個project template,裡面有包一個執行檔可以像Rails那樣產生東西(controller / model那類的),所以不必複製複製複製、貼上貼上貼上。

產生一個Project

在這一點,就有點像是執行rails new project的感覺一樣。先透過終端機進去project folder後,執行cd framework; php yiic

這個yiic指令就有點像是rails指令一樣,然後建立Project就是:php yiic webapp project_name,它就會在你指定的目錄底下建立檔案。建立好的Project中裡面有一個protected資料夾,資料夾內也有yiic這個檔案可以使用。

如果需要用到Git來版本控制的話,可以在最後面寫上git,譬如說:

php yiic webapp ~/projects/blog git

Routing

protected/config/main.php中有一個urlManager,取消註解後就可以用了 ... 目前似乎只有Rails 1時代的那種:controller/:action/:id的類似寫法。

Generators

在Rails中最棒的就是那個很屌的Generators,可以用rails g controller來產生Controller,那在Yii framework中藥怎樣使用呢?在產生Project後,就可以打開protected/config/main.php,把modules那一段註解解開,把gii這個module給引入到Project之中,然後把密碼改掉。

接著,打開瀏覽器,到你的網站的首頁,譬如說是http://127.0.0.1/blog/index.php,然後在後面加上?r=gii,變成http://127.0.0.1/blog/index.php?r=gii,這樣就會進去到一個產生器的頁面。

接著,我們可以看到左邊選單中有以下幾種Generators (本文是2013-08-13寫的)

  • Controller
  • Crud
  • Form
  • Model
  • Module

在測試的過程當中發現到其中幾個Generator是有相依性的,像是如果要用Crud的話,必須要先有Model才可以;可是要產生Model,必須要先有資料表,並不會幫忙產生migration file,必須自己透過protected/yiic migrate create的方式來建立migrate file,這點跟Rails比較不一樣。

所以我們來試試看吧,建立一個叫做Category的Model跟Crud

  1. 執行 protected/yiic migrate create categories
  2. 編輯 protected/migrations底下的剛產生的categories.php
  3. 內容如下
    <?php
    class m130813_100022_categoriess extends CDbMigration{
    
    
    

    public function up() {
    $this->createTable('categories', array(
    "id" => "pk",
    "name" => "string NOT NULL",
    ));
    }

    public function down(){
    $this->dropTable('categories');
    }
    }
    ?>


    1. 執行 protected/yiic migrate up後輸入yes去執行
    2. 在Generators頁面中,選擇Model Generator
    3. Table Name輸入表格名稱,這邊應該是categoriesModel Name輸入Category。好了之後按下Preview
    4. 檢查過後按下Generate
    5. 用同樣步驟處理Crud Generator

    搞定

    注意

    如果進不去Gii的話,檢查是不是把urlManager給打開了。