cakePHP for windows 4

(゚д゚)ノ コンバンワ、中の人ですYO。


今回はモデルとテーブルについてやっていきますYO。


(´Д`;)しかし複数SNS利用しているとどこかが疎かに。ナンテコッタイorz


        _,,:-ー''" ̄ ̄ ̄ `ヽ、
     ,r'"           `ヽ.
 __,,::r'7" ::.              ヽ_
 ゙l  |  ::              ゙) 7
  | ヽ`l ::              /ノ )
 .| ヾミ,l _;;-==ェ;、   ,,,,,,,,,,,,,,,_ ヒ-彡|
  〉"l,_l "-ー:ェェヮ;::)  f';;_-ェェ-ニ ゙レr-{   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  | ヽ"::::''   ̄´.::;i,  i `'' ̄    r';' }   | 久々にワロタ
 . ゙N l ::.  ....:;イ;:'  l 、     ,l,フ ノ   | AA盛りだくさんで笑いを誘うのが
 . |_i"ヽ;:...:::/ ゙'''=-='''´`ヽ.  /i l"  < 昔のアメブロなんだよな今のアメブロ
   .| ::゙l  ::´~===' '===''` ,il" .|'".    | は放置気味だから困る
    .{  ::| 、 :: `::=====::" , il   |     \________
   /ト、 :|. ゙l;:        ,i' ,l' ノト、
 / .| \ゝ、゙l;:      ,,/;;,ノ;r'" :| \
'"   |   `''-、`'ー--─'";;-'''"   ,|   \_

困る。


であどんどんいきましょー。


MVCの中の最期のモデル部分はいわずもがな…データベースの操作系統をひとまとめにする部位ですのよ。

操作系統がまとめられているので直接SQL文うちこんでクエリを送信したりせずにメソッドを呼び出すだけでDBの操作ができますぉ。


        /⌒ヽ
⊂二二二( ^ω^)二⊃
      |    /       ブーン
       ( ヽノ
       ノ>ノ 
   三  レレ

「たかがDBの操作まとめただけやん」とか言われそう。


(#^ω^)ビキビキ


( ^ω^)甘く見てはいけないぉ。フレームワークのモデルはDBソフトの垣根を越えることができるんだぉ。


( ^ω^)つまりシステムで使用しているデータベースがオラクルだろうがポスグレSQLだろうがMYSQLだろうが…全部同じ記述で、また、DBソフトを変えても命令系統を全部書き換える必要がないんだぉ。


( ^ω^)また、DBアクセスに使用されるSQL文をプログラムから完全に排除することが可能なんだぉ。

これによりプログラマはプログラムだけわかれば何の支障もなく作業に集中できるんだぉ。


(#^ω^)まぁ今の時代WEB系PGなのにSQLわからないPGなんてPGなんて呼ばないぉ。



さてモデルの内容に移行。


モデルはDB全体を操作できるわけではなく、個々のテーブルごとに利用する方式です。

つまりDB内のテーブル1つを単位としてモデルを構築していくわけです。


1テーブルで1モデル(ぇ


モデルを介してテーブルにアクセスするよ!!


  ∧,,∧
 (;`・ω・)  。・゚・⌒) チャーハン作るよ!!
 /   o━ヽニニフ))
 しー-J

        アッ! 。・゚・
  ∧,,∧ て     。・゚・。・゚・
 (; ´゚ω゚)て   //
 /   o━ヽニニフ
 しー-J    彡

    ∧,,∧    ショボーン
   ( ´・ω・)
  c(,_U_U      ・゚・。・ ゚・。・゚・ 。・゚・
     ━ヽニニフ

さてそれぞれのモデルはDB内の特定のテーブルに関連付けられます。

これをいめーじにするとこうなりますぉ。


PHP2009-m
モデルを介して指定テーブルにSQLクエリーを投げつけます。


      グルグルグル  取っ手の取れる~
 〃  三 .Λ,,Λ 三=≡,,Λ‐ ─
 。・。・。 (ω・;≡・ω=;`・ω) =。・。
ヽニニフ━oc三 ─ ニフ  三 ニフ
       ゙ミ 三  =- 彡    〃
         - ≡三彡

       ティファール♪
  〃  Λ,,Λ ミ  ブン!!            ガッ
    ( ´・ω・)         -=≡ 。・。・。 そ_∧
    /  oo━       -=≡ ヽニニフて`Д´)
 \_, (  、 > 彡'                ( つ ノ
 `)  ヽ,_)′                  ノ  ノノ
 ⌒`



モデル作成にはつぎのものが必要です。

・DB鯖

・DB利用用設定ファイル

・テーブルの作成


まずDBですがPHP5に標準でついてくるSQLiteなるものをチョイス。

ぶっちゃけ何のDBソフトでもOKですぉ。


でぁSQLiteを使用するという前提で話をすすめるょ!!

XAMPP環境。


CakePHPには「bake」なる各種設定ファイル生成スクリプトが用意されているのでそれを使用して設定ファイルをつくるよ!


bakeを実行するには環境pathにPHP.exeとcakePHPの「console」フォルダへのパスの追加が必要。

「スタート」「コントロールパネル」「システム」→詳細設定タブ→「環境変数」→「システム環境変数(S)」→Path→編集(I)ボタン押下



→末尾に「;c:\xampp\php;C:\xampp\htdocs\cakeapp\cake\console」を追加。



追加後コマンドプロンプト起動

cd C:\xampp\htdocs\cakeapp

cake bake


welcome to cakePHP v*.*.* Console

--------------------------------------

App:app

path: c:****/****/****/*****/app

-------------------------------------

Your database configuration was not found. Take a moment to create one.

------------------------------------

ごにょごにょ。


と表示されればおk。表示されない場合はphp.exeと「console」フォルダへのパスのいずれかor両方が間違っている可能性。


では以下bakeできていることを前提に説明。


Name:

[default]>


設定ファイル名の入力になります。デフォでいいのでエンター。

Driver:(***/***/**/**/****/)

[mysql]>

ドライバの指定。今回はSQliteなので「sqlite」と入力。


Persistent Connection?(y/n)

[n]>

永続的接続をするかどうか。使用しないのでエンター。


Database host:

[localhost]>

DBのホスト名を入力。デフォでローカルになっているのでこのままエンター。


Port?

[n]>

ポート設定。SQliteでは特に指定しないのでそのままエンター。


User:

[root]>

アクセスするユーザー名の指定。デフォでroot。指定する場合は入力。今回はそのままエンター。


Password:

>

パスワード。SQLiteでは必要ないので空エンター。「パスワードが空(゚Д゚#)ゴールァ!!」といわれますが「y」と入力しエンター。


Database Name:

[cake]>

データベース名です。デフォでは「cake」。今回はC:\sqlite_data\cake.sqliteというDBファイルを用意しようと思うので「C:\sqlite_data\cake.sqlite」とパスを入力します。


Table Prefix?

[n}>

プリフィクスの指定です。特に指定しないので、そのままエンター。


Table encodeing?

[n]>

テーブルのエンコーディング指定。

「utf8」と入力してエンター。


最後に設定内容が全部表示されます。

おkならそのままエンター。修正なら「n」でエンター。


Look okey?(y/n)

[y]>

エンター。


Do you wish to add another database configration?

[n}>

他のDBを作成するか?エンターで終了。

これでDBの設定ファイルが作成されました。




であ設定ファイルを確認してみませう。


「app」内の「config」内にあるぽ。

C:\xampp\htdocs\cakeapp\app\config。


でぁ作成された設定ファイル「database.php」を開いてみませう。


<?php
class DATABASE_CONFIG {

var $default = array(
'driver' => 'sqlite',
'persistent' => false,
'host' => 'localhost',
'login' => 'root',
'password' => '',
'database' => 'C:\sqlite_data\cake.sqlite',
'encoding' => 'utf8'
);
}

?>


タブン↑のようになっていると思われ。

DBの設定はDATABASE_CONFIGというクラスとして定義されています。

ここに$defaultというメンバー変数を用意し、そのなかに各項目の値を連想配列として収めているのです。


それぞれの内容は先ほどbakeで入力したものと同じですYO。


もしDBに関する変更などあればこれを編集して対応しませう。


DB作成:


DBを作成します。今回はC:\sqlite_data\cake.sqliteを指定したので『sqlite_data』フォルダを作成しますぉ。


フォルダ内に「cake.sqlite」というファイルを作成、「スタート」→「すべてのプログラム」→「アクセサリ」→「コマンドプロンプト」を開き、つぎのように入力。


C:\xampp\apache\bin\sqlite C:\sqlite_data\cake.sqlite


ではテーブルを作成しますYO



create table blogs(

id integer not null primary key,

timestamp integer,

title varchar(255),

content text

);


でテーブル作成。作成すると空ファイルだったcake.sqliteが3KBになるぉ!


PHP2009-cake20

(゚ω゚)テーブル分増加したんですね、わかります。


              -― ̄ ̄ ` ―--  _   
          , ´  ......... . .   ,   ~  ̄" ー _     ブッブー 
        _/...........::::::::::::::::: : : :/ ,r:::::::::::.:::::::::.:: :::.........` 、    ブーン
       , ´ : ::::::::::::::::::::::::::::::::::::/ /:::::::::::::: : ,ヘ ::::::::::::::::::::::: : ヽ      キキー
    ,/:::;;;;;;;| : ::::::::::::::::::::::::::::::/ /::::::::::::::::::: ● ::::::::::::::::: : : :,/
   と,-‐ ´ ̄: ::::::::::::::::::::::::::::::/ /:::::::::::r(:::::::::`'::::::::::::::::::::::く
  (´__  : : :;;:::::::::::::::::::::::::::/ /:::::::::::`(::::::::: ,ヘ:::::::::::::::::::::: ヽ
       ̄ ̄`ヾ_::::::::::::::::::::::し ::::::::::::::::::::::: :●::::::::::::::::::::::: : : :_>
          ,_  \:::::_| ̄ ̄ |_::::::::::::::: `' __:::::::::-‐ ´
        (__  ̄~" |       | )) ̄
                  ̄◎ ̄◎ ̄


プライマリキーには「id」フィールドを指定。

またSQLiteだと「integer primary key」を指定するとそのフィールドはオートインクリメントだと判断されます。


これでテーブルは完成ぽ。


確認用につぎのようなレコードを挿入しておきませう。


INSERT INTO blogs(id,timestamp,title,conent) VALUES(1,122345,'test','this is test');


作業が\(^o^)/らプロンプトを終了し、WEBブラウザであくせすしてみませう。


PHP2009-cake21

一番上のはそのまんまでおk。

重要なのは緑部分の上から3段目、4段目。

DBの作成に成功すればこのように3,4段目がグリーンになるぽ。


ではモデルつくっちゃうZE☆


モデルは「models」フォルダ内に配置します。

ここにblog.phpというファイルを作成し、以下のように記述をしましょう。



PHP2009-cake22

blog.php

<?php

class Blog extends AppModel{

public $name = 'Blog';
}

?>


(゚∀゚)

さて解説。解説するほどでもないが。


モデルクラスは「AppModel」を継承して作成していきますYO。これはコントローラーやビューと一緒。

AppModelの中にはDB操作のための一通りの機能がそろっているので継承するだけでフリーダム!!


クラスの中には$nameメンバー変数を用意し、これに名前を指定しておきます。

これもコントローラーのクラス同様昔の名残ですがおまじない(?)の為記述しておきますYO!


モデルクラスと命令規則;


モデルを作成するときに、最も重要なのは「名前」デス。

モデルクラスは前にも言ったとおり、ファイル名を「テーブル名.php」とし、クラス名をテーブルと同じものにするのが基本です。


今回は「blogs」というテーブルを使用するので、ファイル名は「blog.php」となります。

クラス名は「Blog」となっています。

テーブルはblogsと複数形で、モデルのほうはBlogと単数形になっていますが、これでちゃんと正しくblogsテーブルにアクセスできます。



ではコントローラーとビューを作成していきましょう。


まずコントローラーです。

「controllers」内に、「blogs_controller.php」というファイルを作成し、以下のように記述してください。

<?php
class BlogsController extends AppController{

public $name = 'Blogs';

function index(){
$data = $this->Blog->find('all');
$this->set('data',$data);
}

}

?>


indexで行っているのはBlogモデルからレコード情報を取得し、それを$dataという変数としてビューに設定する、ということだけです。

次にビュー。


「views」フォルダ内に「blogs」フォルダを新たに作り、そこに「index.ctp」ファイルを作成します。

index.ctp

<h1></h1>
<pre>
<?php print_r($data); ?>
</pre>


見ればわかるように、$dataをprint_rで出力させます。モデルから取得したデータの形式が不明なのでprint_rを使ってます。

(゚д゚)完成したらhttp://localhost/cakeapp/blogs へアクセス!ヽ( ^ω^)ノ サクセス!



PHP2009-cake23
成功すれば、このように表示されるはず。


これでSQLiteのDBのblogsテーブルからレコードが取り出され、変数$dataに設定したものが出力されるようになります。今はダミーが一件のみなので以下のように表示されるはずです。


Array

(

[0]=>Array

(

[Blog]=>Array

(

[id] => 1

[timestamp]=> 122345

[title] => test

[content] => this is test

)

)

)


これが、モデルによってDBのBlogsテーブルから取得したレコード情報です。これは整理すれば次のようになります。


Array

(

[レコード番号]=> Array

(

[テーブル]=>Array

(

[フィールド]=> 値

)

)

)


取得したテーブルは、順番に配列にまとめられます。それぞれの配列内には、テーブルごとのデータが連想配列の形で納められていて、各テーブル内には各フィールドの値がやはり連想配列の形でまとめられています。

この基本的な構造がわかれば、得られたレコード情報を取り出して処理をすることも可能になります。



では実際にちゃんとした形式でレコードの一覧表示をしていってみませう。


$dataから順にレコードを取り出し、そのBlogキーの値を取得すれば、Blogレコードのデータが得られることになります。あとはそこから各フィールドの値を取り出して書き出していけばいいでせう。


でぁ、index.ctpを次のように修正してくだしあ。

<h1>INDEX</h1>
<br/>
<table>
<tr><th>ID</th><th>DATE</th><th>TITLE</th><th>CONTENT</th></tr>
<?php

for($i = 0; $i <count($data); $i++){
$arr = $data[$i]['Blog'];
echo "<tr><td>{$arr['id']}</td>";
echo "<td>".date('Y/n/j',$arr['timestamp'])."</td>";
echo "<td>{$arr['title']}</td>";
echo "<td>{$arr['content']}</td></tr>";
}
?>
</table>


(゚д゚)修正が終わったらhttp://localhost/cakeapp/blogs へレッツアクセスヽ( ^ω^)ノ サクセス!



PHP2009-cake24
成功すれば、整形された形でレコードが表示される。


さて、コントローラーのindexに戻り、解説していきますYO

class BlogsController extends AppController{

public $name = 'Blogs';

function index(){
$data = $this->Blog->find('all');
$this->set('data',$data);
}

}


まずは$this->Blog->find部分。

この$thisに用意されている「Blog」はBlogモデルクラスのインスタンスです。

コントローラーでは、使用するモデルのインスタンスが自動的にモデル名で組み込まれるようになっているのです。

つまりその後の「find」は、Blogモデルクラスに用意されているメソッドを呼び出していた、というわけです。


でぁ、モデルクラスのメソッドのfindについて。


find(モード,オプション);


第一引数のモード:

第一引数は検索のモードとなるテキストを指定するものです。用意されているモードには'all','first','list','count'の4つがあります。これらはそれぞれ以下の様な働きをします。


'all'⇒全レコードを得る。

'first'⇒最初の1レコードのみ取得。

'list'⇒レコードのリストを得る。

'count'⇒レコード数を得る。


一般的なレコード取得には'all'を使用。その他は特殊な情報の取得のため用のようなもんです。

             /)
           ///)
          /,.= ゙''"/   
   /     i f ,.r= '"-‐'つ
____   こまけぇこたぁいいんだよ!!
  /      /   _,.-‐'~/⌒  ⌒\
    /   ,i   ,二ニ⊃( ●). (●)\
   /    ノ    il゙フ::::::⌒(__人__)⌒::::: \
      ,イ「ト、  ,!,!|     |r┬-|     |
     / iトヾヽ_/ィ"\      `ー'´     /


うむ。


つぎに第二引数だぉ!!

第二引数で指定できるオプションは次の通り。


'conditions'⇒検索条件の設定。条件をつけるフィールド名をキーに、検索する値を値とする連想配列として用意する。

'fields'⇒取得するフィールド名を配列として用意する。

'recursive'⇒再帰的に取得する深度。

'order'⇒取得順。順序を示す数字または名前を配列として用意する。

'limit'⇒取得するレコード数

'page'⇒取得するページ数


通常デフォ状態なら特に設定する必要はない。いっそ第二引数なしでじっこうするのも手。


             /)
           ///)
          /,.= ゙''"/   
   /     i f ,.r= '"-‐'つ
____   こまけぇこたぁいいんだよ!!
  /      /   _,.-‐'~/⌒  ⌒\
    /   ,i   ,二ニ⊃( ●). (●)\
   /    ノ    il゙フ::::::⌒(__人__)⌒::::: \
      ,イ「ト、  ,!,!|     |r┬-|     |
     / iトヾヽ_/ィ"\      `ー'´     /

さて、レコードの検索ができたところで次にレコードを追加する処理を追加しよう。


ここでは「add」というアクションを用意し、これで追加を行うことに汁。

まずビューを作成汁。


「views」内「blogs」内に新たに「add.ctp」を作成。以下の通り。

add.ctp


<h1>ADD</h1>
<br/>
<form method="post" action="add">
TITLE:<input type="text" name="title"/>
CONTENT:<textarea name="content"></textarea>
<input type="submit" value="ADD" />
</form>


POSTでADDに送信するフォームです。


次にコントローラー。

BlogsControllerクラスに新たにaddメソッドを追加しませう。


addメソッド

function add(){
if(!empty($this->params['form'])){
$data = array('Blog'=>array());
$data['Blog']['timestamp'] = time();
$data['Blog']['title'] = $this->params['form']['title'];
$data['Blog']['content'] = $this->params['form']['content'];
$this->Blog->save($data);
$this->redirect('.');
}

}

(゚д゚)クワッ

ここまででけたらhttp://localhost/cakeapp/blogs/add へレッツアクセスヽ( ^ω^)ノ サクセス!



PHP2009-cake25
作成したadd.ctpの結果。




PHP2009-cake26
レッツ入力ヽ( ^ω^)ノ



PHP2009-cake27
クエリ送信結果。追加された。


ヽ( ^ω^)ノ サクセス!


               r'゚'=、
               / ̄`''''"'x、
          ,-=''"`i, ,x'''''''v'" ̄`x,__,,,_
      __,,/    i!        i, ̄\ ` 、
  __x-='"    |   /ヽ      /・l, l,   \ ヽ
 /(        1  i・ ノ       く、ノ |    i  i,
 | i,        {,      ニ  ,    .|    |  i,
 .l,  i,        }   人   ノヽ   |    {   {
  },  '、       T`'''i,  `ー"  \__,/     .}   |
  .} , .,'、       },  `ー--ー'''" /       }   i,
  | ,i_,iJ        `x,    _,,.x="       .|   ,}
 `"           ∩ `ー'" ∩        iiJi_,ノ
              //     | |
             //Λ_Λ  | |
             | |( ´Д`)// <うるせぇ、 スプーぶつけんぞ
             \      |
               |   /
              /   /
         __   |   |  __
         \   ̄ ̄ ̄ ̄ ̄   \
         ||\            \
         ||\|| ̄ ̄ ̄ ̄ ̄ ̄ ̄||
         ||  || ̄ ̄ ̄ ̄ ̄ ̄ ̄||


では解説。


レコードの追加は次の形式で行われます。

[モデル]->save(連想配列);


引数に渡す連想配列では、モデル名をキーとする要素が用意されます。

そしてその中に、フィールド名をキーとする連想配列の形で登録するデータが用意されます。

基本IDはオートインクリメントの為DB側で勝手に処理されますが、万が一IDが重複するような事態になった場合、エラーではなくそのIDのレコードを更新します。


つまり、新規登録と更新を兼ね備えているわけです。


すげぇ。スプー並。


りだいれくとについて。

$this->redirect(アドレス);

コントローラーにあるリダイレクトを呼び出して特定のアドレスに移動します。

これはページ遷移の基本として覚えておきませう。




      g(^^^^_______,,,,,,;;59q
   ,,p6l゚゚    ゚l[゛`、]pvn .l[..l
  」"  4^゚゚゚゚゚゚゚_][  __,,,, .l[
  [゜  ,,g「゚p[{4,,  (" ^〉.\
  ],,,,gl゚"  .l[、.;][  .\^^^ .l
    ]!   ゚\ __,,xxx。  ]
    ][      [゚   ]l.  〈
   J!      〔、  .l[  ]
   |。_     .\-fff" ,,p
     ^"^9nxxxx./r==4"゛


ポーニョポーニョポニョ♪






      ,,,,,,pxxvxxg,,,,_
   ,,df(^"゛ g、    ^゚゚lq
  〈!   ,,dl゚゛   ./==x]t,,_
   ]l.__,,g[,,,,,,,,,,,,,,p4"   .l[^k
   ][「,,pr=t、`、  ____ .l[ ]
  g" ][_  ]!  ./「゚^゚9,,「n,,]
 4゚ .。、.\イ   ゚lk ,,g[  .l]
 ]l. 〈^゚ltn4,,,,_        ]
 ヨ。. ゚ll._   ゚"9n......./ff  ]
  ヨ、.\q,,,,____   ,,gf゛ gl゚
   ^9nnxxxxx゚゚゚゚゚゚゚゚゚゚xvtf"゛


魚の子 !


グロはんな!!

というわけで次は記事の削除処理を実装していきましょう。


まずは削除用のファイルの作成。


ビュー部分からいきますYO!


「views」フォルダ内の「blogs」フォルダ内に「delete.ctp」というファイルを作成します。


PHP2009-cake28

以下delete.ctp


<h1>DELETE</h1>
<br/>
<form method="post" action="delete">
ID:<input type="text" name="id">
<input type="submit" value="DELETE">
</form>


(゚д゚)つぎにコントローラーにdeleteメソッドを追記しますYO!!

blogs_controller.phpにつぎのメソッドを追記。

function delete(){
if(!empty($this->params['form'])){
$this->Blog->del($this->params['form']['id']);
$this->redirect('.');
}
}

(゚д゚)完成したら…

http://localhost/cakeapp/blogs/delete

へレッツアクセスヽ( ^ω^)ノ サクセス!



PHP2009-cake29
削除画面。



PHP2009-cake30
試しに記事No2と入力。


PHP2009-cake31
削除後に一覧画面へリダイレクトされる。結果、No2が削除された。


        /⌒ヽ
⊂二二二( ^ω^)二⊃
      |    /       リダイレクトブーン
       ( ヽノ
       ノ>ノ 
   三  レレ


解説。

レコードの削除は次の書式で実現します。

[モデル]->del( ID );

[モデル]-> remove( ID );

レコードの削除はモデルクラスに用意されている「del」または「remove」というメソッドで行います。

引数に、削除したいレコードのIDを指定して呼び出すと、そのレコードが削除されます。

非常に単純☆ミ




以下余談。

WEBシステム構築時にDBを使用しないほうが珍しい時分。

それゆえ、「DB関連の確認のためにいちいち登録・削除・更新処理を書くなんて」と思ってる人向けにscaffoldについて説明するじぇ(´・ω・`)ノ


「テスト用DBを操作する仮のシステムがほすぃ」

「管理用にDBアクセスする機能がほすぃ」等システムの中の必須部分ではない面でいちいちシステムを一から導入していられるかっ!!て人に最適なのがscaffold。

今から解説するぉ。



とりあえずDB関連のシステムがほしいのよ。という時に活用くだしあ。


Blogモデルを利用するための機能をscaffoldで実現してみませう。



まずはコントローラークラスを次のように修正しませう。


blogs_controller.php

<?php
class BlogsController extends AppController{

public $name = 'Blogs';

function index(){
$data = $this->Blog->find('all');
$this->set('data',$data);
}


function add(){
if(!empty($this->params['form'])){
$data = array('Blog'=>array());
$data['Blog']['timestamp'] = time();
$data['Blog']['title'] = $this->params['form']['title'];
$data['Blog']['content'] = $this->params['form']['content'];
$this->Blog->save($data);
$this->redirect('.');
}

}

function delete(){
if(!empty($this->params['form'])){
$this->Blog->del($this->params['form']['id']);
$this->redirect('.');
}
}
}

?>

↑を↓のように修正。

<?php
class BlogsController extends AppController{

public $name = 'Blogs';
public $scaffold;
}

?>


これでおk。

コントローラーには一切メソッドを用意する必要はありません。

また、ビューも不要。

「views」内に用意した「blogs」フォルダを削除するなり他に移動するなりして取り除きませう。



PHP2009-cake32
とりあえず「blogs」を↑の階層に移動。


(゚д゚)クワッ これでなにもなくなった!!さぁどうなる!?



PHP2009-cake33
なん…だと?


(゚д゚)↑からもわかるようにメソッドもビューもへったくれもなくてもDB関連の処理が実現できてしまうのがscaffoldの機能。


scaffold…恐ろしい子…!!!


画面を確認すればわかるのですが、なんとView Edit Deleteと、一通りの操作が全部行えますYO。


ちなみにscaffoldを使用するための準備はコントローラークラスでメンバー変数「public $scaffold;」を用意するだけ。これだけ。


あとはscaffold側でDB関連の機能一切を担ってくれます。ウホッ、いいscaffold。


scaffoldはすべての機能を使わなくてはならないわけではありませぬ。


コントローラークラスにアクションメソッドがある場合に、そのメソッドが優先されます。


例えばscaffoldのindexメソッドで一覧表示が出ますが、コントローラークラスに他のindexメソッドがあればそちらが優先されます。(もちビューも用意されたものが使われる)

なので一般に使うindexのみ作って他はscaffoldにやってらう、ということも可能ですYO。


      ./       ;ヽ
      l  _,,,,,,,,_,;;;;i  <いいぞ ベイべー!
      l l''|~___;;、_y__ lミ;l  逃げる奴は一般人だ!!
      ゙l;| | `'",;_,i`'"|;i |  逃げない奴はよく訓練された一般人だ!!
     ,r''i ヽ, '~rーj`c=/
   ,/  ヽ  ヽ`ー"/:: `ヽ
  /     ゙ヽ   ̄、:::::  ゙l, ホントモデル解説は地獄だぜ! フゥハハハーハァー
 |;/"⌒ヽ,  \  ヽ:   _l_        ri                   ri
 l l    ヽr‐─ヽ_|_⊂////;`ゞ--―─-r| |                   / |
 ゙l゙l,     l,|`゙゙゙''―ll___l,,l,|,iノ二二二二│`""""""""""""|二;;二二;;二二二i≡二三三l
 | ヽ     ヽ   _|_  _       "l ̄ ̄ ̄ ̄ ̄ ̄ |二;;二二;;二=''''''''''' ̄ノ
 /"ヽ     'j_/ヽヽ, ̄ ,,,/"''''''''''''⊃r‐l'二二二T ̄ ̄ ̄  [i゙''''''''''''''''"゙゙゙ ̄`"
/  ヽ    ー──''''''""(;;)   `゙,j"  |  | |

長いorz


(゚д゚)というわけでようやくMVCの最後のMが終了。


次回はヘルパーについてやっていきますYO!

TO BE CONTINUED!

人気ブログランキングへ

cakePHP for windows 3

(゚д゚)コンチャ、中の人デス。珍しく昼間up(ぉ


(´Д`;)なんかどんどん更新時間が遅くなってってる ||orz


とりあえず今回はビューをやっていきますYO


コントローラー編では直接echoで画面出力していましたが本来ならちゃんとビューを使います。

ってかビューを使ってやっていきましょうYO。


ビューを作るとか言うとビューのファイル作って終了というイメージがありますがcakePHPではどうやらそんな単純なものではないらしいです。


cakePHPでのビュー=「複数の要素の組み合わせで作られる」モノ。


               \  __  /
               _ (m) _ピコーン
                  |ミ|
               /  .`´  \
             -‐ '´ ̄ ̄`ヽ、
             / /" `ヽ ヽ  \
         //, '/     ヽハ  、 ヽ
         〃 {_{ノ    `ヽリ| l │ i|
         レ!小l●    ● 从 |、i|
          ヽ|l⊃ 、_,、_, ⊂⊃ |ノ│<ア○エリオンにょろー。
        /⌒ヽ__|ヘ   ゝ._)   j /⌒i !
      \ /:::::| l>,、 __, イァ/  /│
.        /:::::/| | ヾ:::|三/::{ヘ、__∧ |
       `ヽ< | |  ヾ∨:::/ヾ:::彡' |


別に合体はしません。


大体イメージ的には次の通り。


PHP2009-cake11
テンプレがレイアウトという土台の上に設置されているイメージ?


□レイアウト

ページの土台となるもの。ページ全体の基本的な配置などをまとめたもの。

ヘッダー部分、フッター部分、実際のコンテンツを表示するボディ部分といったものの構成などを考え記述される。通常コントローラー毎に用意され、そのコントローラーのすべてのアクションページで共用される。


□テンプレート

実際に表示するコンテンツとなるもの。各アクションごとに用意され、そのアクションが呼び出されると、対応するテンプレートが読み込まれ、レイアウトのボディ部分にはめ込まれてレンダリングされる。


□エレメント

テンプレートの中に埋め込まれる「部品」となるもの。例えばバナーなどの複数のページに決まった表示をあちこち埋め込む場合にエレメントとして作成し、それをテンプレート内に配置する。


あくまでビューの基本はテンプレートです。

レイアウトは特に用意せずともCakePHPに標準で用意されているものが自動的に使用されます。

エレメントは特に必要がなければ作成する必要はないでしょう。


ページの基本はとりあえずテンプレートを作るということだと理解しておけばおkなんじゃないでしょうか。(゚ω゚)


                  ''';;';'';';''';;'';;;,.,   ザッ
     ザッ            ;;''';;';'';';';;;'';;'';;;          テンプレートはあるかい
                    ;;'';';';;'';;';'';';';;;'';;'';;;
 テンプレートはあるかい    ,.~^,.~^,.~^..~^      ザッ
                   ⌒vv⌒yv⌒vv⌒yv⌒vv、
                , '´ ̄`ヽ -^, '´ ̄`ヽ -^, '´ ̄`ヽ         テンプレートはあるかい
ザッ           ,‐ '´ ̄`ヽ ,‐ '´ ̄`ヽ ,‐ '´ ̄`ヽ ,‐ '´ ̄`ヽ
           ,‐ '´ ̄ ̄`ヽ__‐ '´ ̄ ̄`ヽ _‐ '´ ̄ ̄`ヽ    ザッ
        -‐ '´ ̄ ̄`ヽ、       -‐ '´ ̄ ̄`ヽ、       -‐ '´ ̄ ̄`ヽ、
      / /" `ヽ ヽ  \    / /" `ヽ ヽ  \    / /" `ヽ ヽ  \
    //, '/     ヽハ  、 ヽ //, '/     ヽハ  、 ヽ //, '/     ヽハ  、 ヽ
    〃 {_{ノ    `ヽリ| l │ i| 〃 {_{ノ    `ヽリ| l │ i| 〃 {_{ノ    `ヽリ| l │ i|
    レ!小l●    ● 从 |、i| レ!小l●    ● 从 |、i| レ!小l●    ● 从 |、i|
     ヽ|l⊃ 、_,、_, ⊂⊃ |ノ│ ヽ|l⊃ 、_,、_, ⊂⊃ |ノ│ ヽ|l⊃ 、_,、_, ⊂⊃ |ノ│
 /⌒ヽ__|ヘ   ゝ._)   j /⌒i !ヽ__|ヘ   ゝ._)   j /⌒i !ヽ__|ヘ   ゝ._)   j /⌒i !
 \ /:::::| l>,、 __, イァ/  /│:;::::| l>,、 __, イァ/  /│:;::::| l>,、 __, イァ/  /│
  /:::::/| | ヾ:::|三/::{ヘ、__∧ | ::/| | ヾ:::|三/::{ヘ、__∧ | ::/| | ヾ:::|三/::{ヘ、__∧ |
  `ヽ< | |  ヾ∨:::/ヾ:::彡' |ヽ< | |  ヾ∨:::/ヾ:::彡' |ヽ< | |  ヾ∨:::/ヾ:::彡' |



では前回作成したTestコントローラーのindexアクション用のテンプレートを作成しませう。


まず『app』内の『views』フォルダを開き、その中に「test」というフォルダを作成してください。



PHP2009-cake12
(゚д゚)こんな感じにね!!


テンプレートは『views』内に、それぞれの名前のフォルダを用意して、そこに作成します。


であ『test』フォルダ内に次のようなテンプレを作成しませう。


index.ctp

<h1>INDEX</h1>
<br />
<div>これはテスト用コントローラーによるindexアクションの表示ですYO</div>


テンプレートは基本的にHTMLベースで記述しますが通常のHTMLとは異なります。


普通なら<html><body></body></html>といったタグが必須になりますが、テンプレートでは<body>タグ内に実際に表示されるコンテンツの部分だけを記述すればいいのです。


ぶっちゃけかなり簡略化されるわけです。


続いてテンプレートを使うようにコントローラーの修正も行っていきましょう。『controllers』フォルダの「test_controller.php」を次のように編集。


test_controller.php

<?php

class TestController extends AppController{

public $name = 'Test';
public $uses = null;

function index(){

}

function other(){
echo "<html><body>";
echo "<div>これはotherアクションの表示です。</div>";
echo "<br/><a href=\"index\">indexアクションに戻る</a>";
echo "</body></html>";
}

}

?>


今回の変更点ではまず$autoRenderの宣言がなくなりました。テンプレートを用意したので自動レンダリング機能が必要なくなった為です。


次にindexメソッドが空になりました。これはindexメソッド内でコントローラー側でやっておく処理が特になくなった為です。前回書いたように処理がなにもなくてもメソッドを残して起きてください(理由は前回参照)。



PHP2009-cake13
↑以上のやうにひょうじされたらおk。


今回はヘッダーフッター共に特に指定かけなかったのでcakePHPのデフォCSSが適用されています。


(゚д゚)このようにパーツ単位で組み合わせることで同じデザインのページをたくさんのページで使いまわすことが可能になるわけですね。


いやこのように大量のページを一つのファイルで管理することで手間を減らし、工数を減らすのがフレームワークたる所以なのですが…


ここでは「全部おんなじデザインじゃ嫌だ!」という変わり者のアナタのために。
レイアウトを使うのを放棄してみませう。


                _,. --- 、─-- .,
            ,. -イ          ヽー 、
           /   レ /,.  ,ィ   /    } ヽ
              /   iゞァ' _,.ノ  / , / /i   ヽ
          〈     !、 ',. - 、∠,. ノ. - 、'' /|   /
          ヽ   ! {   .},.- 、{   }' i  /    飛ばねぇ豚は
        ,. -'" ヽ /  ,`ー'´〃 ヾヽー'  ト、/
       i    / i  (ゝ.,_,ィr--- く_ァ' )  ! iヽ       ただの豚さ
      /´  ,. ´ ̄`ヽ/,>    ̄ ̄     / ' ノ`ヽ_
  ,. - '"   / 、 `ヽ.  l_)________,. '",. '"    `ヽ,
./,. --‐  /  、 \  Y-'  `ー '"   / / /       ',
    / ,/ 、__ \ ヽノ \__ ,. - '7   |          ',
    i {   フ>-'"\     ,. - '/   |           ヽ
    ゝ \___ノ i 〉  `ー-‐'  /    /            i

ですよねー。


では「レイアウトはいらねぇYO」用。

『controllers』の「test_controller.php」を次のように修正。

test_controller.php

<?php

class TestController extends AppController{

public $name = 'Test';
public $uses = null;
public $autoLayout = false;

function index(){

}

function other(){
echo "<html><body>";
echo "<div>これはotherアクションの表示です。</div>";
echo "<br/><a href=\"index\">indexアクションに戻る</a>";
echo "</body></html>";
}

}

?>


次にテンプレの修正。

レイアウトを使わない場合、<DOC TYPE>宣言などテンプレートですべてのHTMLタグを用意しなければなりません。

index.ctp

<!DOCTYPE html PUBLIC "-//W3C/DTD XHTML 1.0 Transitional//EN"
"
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">
<html xmls="
http://www.w3.org/1999/xhtml ">
<head><title>Hello Page</title>
<meta http-equiv= "Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1>INDEX</h1>
<br />
<div>これはテスト用コントローラーによるindexアクションの表示ですYO</div>
</body>
</html>



PHP2009-cake14
こうなるはず(゚∀゚*)


レイアウトを使わないと、テンプレートの記述は面倒くさくなります。

実際問題としてレイアウトを使用しない場合にはそれぞれの要素の表示をCSSなどで調整する必要があります。

その手間を考えるなら、自由度は制限されますがレイアウトを使ったほうが手間が少なくてイイと思うのですがどうなのでしょう…。



(゚д゚)クワッ ではレイアウト自体を自分で作ってみませう。


            ,,;:' ';,     ,;:'';
          ,;    ';,,,.,.,.,.,.,;:'   ';
         、:`           ':,    / 、、  _ 、、 _/_ _/_
        ,'              ':,  /ヽ  _/  //  //  ・ ・ ・
        ';               ':,                      ∧/|
        ';    ○  __ ○  ;         _ - _ -_- = ::ζ∧∧=-
焼き払え! ';      /_- _-=ー =- 三= - ̄- ̄- _= _-  =ニ -_<(>>  )
         '':;,    / - _ニ- _- ̄-ニ _--ニ_  = _ ニ - 二Σ⊂_:::::::)=-

     ∧_∧:'     ヽ - ニ-=, - -ニ -= _ 二 _=-ニ -- ニ- ̄ 二<と:::::::::~
     _i┐・Д)         ̄  ;         =  - ニ ̄_- ̄_==< =`J>
     〉  フ='つ           ';                       //Wヽ
     ) ( l .|            ;'
    ノ~'__)._).,..,.,.,.,..,).,.,.,..,.,.,.(,..,.,.,.,.)


とはいっても本格的なのは置いといて、とりあえず基本的なものでいきませう。

把握できたら各自で改良するよろし。


レイアウトは『views』フォルダ内の『layouts』フォルダ内に配置します。

テンプレート同様にctpファイルを作成。以下作成しる。


test.ctp

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">
<html xmlns="
http://www.w3.org/1999/xhtml ">
<head>
<?=$html->charset() ?>
<title>
<?=$title_for_layout ?>
</title>
<?=$html->css('test') ?>
<?=$scripts_for_layout ?>
</head>
<body>
<div id="container">
<div id="header">Test Layout</div>
<div id="content">
<?=$content_for_layout; ?>
</div>
<div id="footer">copyright 2009 naka_no_hito</div>
</div>
</body>
</html>


続いてスタイルシートの修正。デフォを使わないので当然CSSも自作で。

CSSは『app』内の『webroot』フォルダにある『css』フォルダ内に格納しますYO。


test.css

body{
background: #AAAAFF;
color: #000066;
margin: 0;
}

#header{
font-size: 12pt;
font-weight: bold;
text-align: right;
}

#content{
background: #EEFFFF;
color: #000099;
padding: 10px 20px 20px 20px;
}

#footer{
text-align:right;
}

h1{
font-size: 12pt;
font-weight: bold;
color: #000066;
}

p{
font-size: 10pt;
font-weight: plain;
color: #333399;
}


ここでぁぼでー以外にヘッダー、コンテンツ、フッター、h1とpのテキスト表示についてスタイルを設定しておきました。


ではコントローラーのndex.ctpもレイアウトを使用するように修正しておきましょう。


<?php

class TestController extends AppController{

public $name = 'Test';
public $uses = null;

public $layout = 'test';
function index(){

}

function other(){
echo "<html><body>";
echo "<div>これはotherアクションの表示です。</div>";
echo "<br/><a href=\"index\">indexアクションに戻る</a>";
echo "</body></html>";
}

}

?>

public $autoLayout = false;を削除。そして新たに作成したCSSを読み込むので$layout = 'test';を記述。



PHP2009-cake15
うまくいけば↑のような画面が表示されますYO。



このやうにレイアウト用ファイル・CSS・コントローラだけで一応のレイアウトは作れます。

このレイアウトをベースにデザインを行っていけばいいでしょう。


     ,、‐'''''''''ヽ、
    /:::::;;-‐-、:::ヽ             _,,,,,,,_
     l::::::l  _,,、-‐"iiiiiilllllllllllliiiiiiiー-、__ゞ:::::::::::`ヽ,
    ヽ::`/: : : : iiiiiilllll||llllliiiiii: : : : : : ヽイ~`ヽ:::::::i
.     /;,..-‐、: : : : : l|l: : : : : : : : : : : : : \ ノ:::::}
     /: /: : : : :`.: : : : : : : : :/´ ̄\ : : : : : ヽ:::ノ
.    !: : : :iflllli、: : : : : : : : : : : : : : : :ヽ: : : : : :.!
    |: : : :llllf l: : : : : : : : : : :.iflllli、: : : : : <iiii|
    |: : : :|llll |: : : : : : : : : : .llllf l: : : : : : : : :.|
    |: : : :.!lllll!' : : : : : : : : : : |llll |: : : : : : : : :i
   /: : : : :    ○    : : .!lllll!' : : : : : : : :.i
   ̄|: : :"  ,,,,,,,,,,,,,|____    : : : : : : : :.<iii/      ______________
.  /!.:   |:::::/    ̄''''''''l ヽ: : : : :-─/─   />>1くん!くそすれをたてないで!
    ヽ   ヽ/        ノ    : : :ヽ/   <  すぐにくびをつってしんでね!
     \  \,,_    _,,,/     : /\       \しまじろうとお約束だよ!!!
       `''‐、、__  ̄ ̄   __,,,、-‐"            ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
.     //:::::/ヽ ̄ ̄ ̄ ̄ノ::::/\
.   / /:::::/  ` ̄ ̄ ̄/:::::/.  \


しまじろう…。



では簡単なビューの表示がわかったところで、ビューとコントローラーの間でやり取りをしていきましょう。


(゚д゚)クワッ まずは基本のフォームの送信ですYO。


         ,. ‐''三ヾ´彡シ,=`丶、
     /'".:=≡ミ_≧_尨彡三:ヽ、
    //.:;:彡:f'"´‐------ ``'r=:l
    /〃彡_彡′,.=、 ̄ ̄ ,.=、 |ミ:〉
   'y=、、:f´===tr==、.___,. ==、._ゞ{
   {´yヘl'′   |   /⌒l′  |`Y}
   ゙、ゝ)       `''''ツ_  _;`ー‐'゙:::::l{   あきらめたら
.    ヽ.__     ,ィnmmm、   .:::|!   そこで試合終了ですよ・・・・
  ,.ィ'´ト.´     ´`"`"`゙″ .::::;'
イ´::ノ|::::l \         "'   :::/
::::::::::::|:::::l   ヽ、      ..::  .:::/.、
:::::: ::: |:::::ヽ    ヽ、.......::::/..:::/!\\
::::::::::: |::::::::ヽ    ``''‐--ァt''′ |!:::ヽ:::\
:::::::::::::|::::::::::::ヽ、       /i|iト、  |l:::::::ヽ:::::\
:::::::::::::|::::::::::::::/:ヽ、   ∧|i|i|i|〉. ||::::::::::ヽ:::::::\


index.ctpに次のように修正。ちなみにビューで(ややこしい・・・)。


index.ctp

<!DOCTYPE html PUBLIC "-//W3C/DTD XHTML 1.0 Transitional//EN"
"
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">
<html xmls="
http://www.w3.org/1999/xhtml ">
<head><title>Hello Page</title>
<meta http-equiv= "Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1>INDEX</h1>
<p><?=$result ?></p>
<form action="./index" method="post">
<input type="text" name="text1" size="60">
<input type="submit" />
</form>
</body>
</html>


次にコントローラーのindexメソッドを次のように修正。


index

function index(){
$result = "";
if(!empty($this->params['form']['text1'])){
$text1 = $this->params['form']['text1'];
$result = "あなたは「".$text1."」と書きました(゚∀゚*)";
}else{
$result = "入力してください(゚Д゚#)ゴールァ!!";
}
$this->set("result",$result);
}


できたらhttp://localhost/cakeapp/test/index へレッツアクセスヽ( ^ω^)ノ サクセス!


PHP2009-cake16
うまくいくとこのような画面に。


PHP2009-cake17
入力してクエリボタンを押すと…。


PHP2009-cake18
(゚Д゚#)ゴールァ!!


もしエラーが出てしまう場合にはindex.ctpの<form action="./index" method="post">部分をよく確認。場合によっては修正。

もし間違えて"../index"とかやった場合。


PHP2009-cake19
インデックスコントローラーなんかねぇよ(゚Д゚#)ゴールァ!!と怒られるので注意。


ちなみに修正したのにエラーのまんまかよ!!(三村風に)となった場合IEの場合キャッシュ残りが疑われますのでF5連射で直してください。


         ,. ‐''三ヾ´彡シ,=`丶、
     /'".:=≡ミ_≧_尨彡三:ヽ、
    //.:;:彡:f'"´‐------ ``'r=:l
    /〃彡_彡′,.=、 ̄ ̄ ,.=、 |ミ:〉
   'y=、、:f´===tr==、.___,. ==、._ゞ{
   {´yヘl'′   |   /⌒l′  |`Y}
   ゙、ゝ)       `''''ツ_  _;`ー‐'゙:::::l{   あきらめたら
.    ヽ.__     ,ィnmmm、   .:::|!   そこで試合終了ですよ・・・・
  ,.ィ'´ト.´     ´`"`"`゙″ .::::;'
イ´::ノ|::::l \         "'   :::/
::::::::::::|:::::l   ヽ、      ..::  .:::/.、
:::::: ::: |:::::ヽ    ヽ、.......::::/..:::/!\\
::::::::::: |::::::::ヽ    ``''‐--ァt''′ |!:::ヽ:::\
:::::::::::::|::::::::::::ヽ、       /i|iト、  |l:::::::ヽ:::::\
:::::::::::::|::::::::::::::/:ヽ、   ∧|i|i|i|〉. ||::::::::::ヽ:::::::\


では解説に移っていきますよ。


indexメソッドで何が行われているのかをチェック。


index

function index(){
$result = "";
if(!empty($this->params['form']['text1'])){
$text1 = $this->params['form']['text1'];
$result = "あなたは「".$text1."」と書きました(゚∀゚*)";
}else{
$result = "入力してください(゚Д゚#)ゴールァ!!";
}
$this->set("result",$result);
}


まずはフォームのテキストエリアに入力があるかチェック。なければ何もしない。


                                =     =
                               ニ= 荒 そ -=
                               ニ= 巻 れ =ニ
                                =- な. で -=
  、、 l | /, ,                         ニ .ら. も ニ
 .ヽ     ´´,                        r :   ヽ`
.ヽ し き 荒 ニ.                        ´/小ヽ`
=  て っ 巻  =ニ            _,,..,,,,_
ニ  く. と な  -=    、,  ,,, 、,,  ./ ,' 3/⌒ヽ-、_   、 ,,  @
=  れ.何 ら  -=       、,   /l.  /____/   n  ヽ|ノ,,
ニ  な も   =ニ     @   ,,, 、,,  ̄,, ̄ ̄ ̄ ̄,, ̄   ,,, 、,,
/,  い     ヽ、     ヽ|ノ 、、,  ,, 、,,   , "  ,,  、、, ,,
 / :     ヽ、


もしなにがしか入力があれば$text1に入力内容をセット。そして文字列形式にして$resultに渡す。もし空なら(゚Д゚#)ゴールァ!!と入る。条件文を抜けた後にset関数でresultに$result、つまり入力があれば入力内容を含む文字列、なければ(゚Д゚#)ゴールァ!!の入ったresultをセット。それをビューで受け取り、<p><?=$result ?></p>で受け取り、表示する。


っデータ受け取り

$this->params['form']['text1'];


データ送信形式がPOSTの場合、

$this->params['form']['コントロール名'];

でフォームのデータを取得できます。(GETは$this->params['url']['コントロール名'];)


$thisというのはこのコントローラークラスのインスタンス自身、つまりindex。

送信フォームの内容は、自身に用意されているparams連想配列の中にあります。

もしこれが空ならば、フォームからのデータがない、つまり未入力となり、「(゚Д゚#)ゴールァ!!」と怒る訳です。

!empty($this->params['form']['text1'])をチェックして分岐しているのはそのような理由からです。


もしこれが空でなければそのまま値を取り出し、加工した上で$resultに渡し、そのまま結果としてビューで表示する。最後にsetを使って値を設定していますが、これは


$this->set(変数名、値)

という形式になってます。

今回の場合で言えば、'result'という変数に$resultの中身、つまり中身入りなら「あなたは「中身」と書きました。」もし空なら「(゚Д゚#)ゴールァ!!」が入るわけです。


テンプレート側で<?=$result ?>となっていましたが、このようにコントローラー側で$resultに値を用意したからテンプレートに値が渡ったのです。


このように、「コントローラーで必要な処理をし、setでビューに値を渡す」「ビューでコントローラーから渡された値を<?= ?>で出力する」というかたちで両者の間で値のやりとりをする。これがcakePHPの基本スタイルなのですYO。


                 |

                 h
              冊冊冊冊
              〃〃〃〃
                 |
                 |
                 |  ぬるぽ
                 |
            ∧_∧ | クイッ
            ( ´∀` )づ
           /  _ノ⌒⌒⌒`~、_
        ( ̄⊂人 //⌒   ノ  ヽ)
       ⊂ニニニニニニニニニニニニニニ⊃




             ||| || |
             ||| || |
           ガッ   h
            ∧冊冊冊冊
            ( `Д´)つ
           /  _ノ⌒⌒⌒`~、_
        ( ̄⊂人 //⌒   ノ  ヽ)
       ⊂ニニニニニニニニニニニニニニ⊃


(゚д゚)

ビューの説明は以上になりまする…。


次回はモデルについてやっていきますYO。

(´Д`;)なるべくがんばってはやくageます…orz



      /\___/ヽ
     /       :::::::\
    .|          .::::|
    |  ''''''   ''''''   .:::|
    .|(●),   、(●)、::::|
     \ ,,ノ(、_, )ヽ、,,.:::::/
     /``ーニ=-'"一´\
   _/((┃))_____i |_ キュッキュッ
.. / /ヽ,,⌒) ̄ ̄ ̄ ̄ (,,ノ   \
/  /_________ヽ..  \
. ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

       /\___/ヽ
     /''''''   '''''':::::::\
    . |(●),   、(●)、.:| +
    |   ,,ノ(、_, )ヽ、,, .::::|
  .   |   `-=ニ=- ' .:::::::| +
     \  `ニニ´  .:::::/     +
     /ヽ、ニ__ ーーノ゙\_
    .| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄.|  トン
   _(,,)TO BE       (,,)_
.. /. |..CONTINUED!!   |  \
/   .|_________|   \
人気ブログランキングへ

cakePHP for windows 2

(゚д゚)ノこんばんわ、中の人デスヨ。


(´Д`;)ブログ掛け持ちすると更新がryになるのが困る。


でぁ引き続きcakePHPのコントローラーについてやっていきますよ。


       _,,:-ー''" ̄ ̄ ̄ `ヽ、
     ,r'"           `ヽ.
 __,,::r'7" ::.              ヽ_
 ゙l  |  ::              ゙) 7
  | ヽ`l ::              /ノ )
 .| ヾミ,l _;;-==ェ;、   ,,,,,,,,,,,,,,,_ ヒ-彡|
  〉"l,_l "-ー:ェェヮ;::)  f';;_-ェェ-ニ ゙レr-{   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  | ヽ"::::''   ̄´.::;i,  i `'' ̄    r';' }   | 久々にワロタ
 . ゙N l ::.  ....:;イ;:'  l 、     ,l,フ ノ   | 毎日更新してた
 . |_i"ヽ;:...:::/ ゙'''=-='''´`ヽ.  /i l"  < のが昔の俺なんだよな 今の俺は
   .| ::゙l  ::´~===' '===''` ,il" .|'".    | 更新が遅いから困る
    .{  ::| 、 :: `::=====::" , il   |     \________
   /ト、 :|. ゙l;:        ,i' ,l' ノト、
 / .| \ゝ、゙l;:      ,,/;;,ノ;r'" :| \
'"   |   `''-、`'ー--─'";;-'''"   ,|   \_

困る。


cakePHPで実際に動かす際に重要になるのがMVCのうちのCにあたるコントローラーだ。

コントローラーがないとWEBアプリ自体が動かない。まさに困る。


ビューもなければ表示されないが、ぶっちゃけコントローラーにechoを書くという荒業さえしてしまえば問題ない。


最後のモデルについてはDBを使わないならイラン。まずは基本的なところから解説していくのでモデルは後回しになる悪寒。


とりあえずちゃちゃっとコントローラーを作っていきますYO!!


『app』フォルダ内の『controllers』内にファイルをつくりますYO


ファイル名は「test_controller.php」。


<?php

class testController extends AppController{

public $name = 'test';
public $uses = null;
public $autoRender = false;

function index(){

echo "<html><body>";
echo "<div>これは、テスト用コントローラーによるindexアクションの表示です。</div>";
echo "</body></html>";
}
}

?>


{の位置とか間違えないように注意。

保存したら、http://localhost/cakeapp/test  へレッツアクセスヽ( ^ω^)ノ サクセス!



PHP2009-cake8
(゚∀゚)こういったページが表示されれば成功。


とりあえずファイルを保存する際にはUTF-8でBOMなしで保存汁。


では解説。

<?php

class testController extends AppController{

public $name = 'test';
public $uses = null;
public $autoRender = false;

function index(){

echo "<html><body>";
echo "<div>これは、テスト用コントローラーによるindexアクションの表示です。</div>";
echo "</body></html>";
}
}

?>


まずcakePHPでは"名前"がかなり重要な役目を果たします。

とろあえずその辺は後述しますが。


まずコントローラーは、名前_controller.phpという形式のファイル名で保存します。

そこに名前Controolerというクラスを配置して作成する決まりになっています。


□□_controller.php


class □□Controller extends AppController{


function index(){

デフォルトの処理

}

メソッド***

}


コントローラーは必ず「AppController」というクラスを継承して作成します。また、クラス内にはデフォルトで呼び出される「index」というメソッドを用意しておきます。これは通常引数も返り値もないシンプルなメソッドとして定義しておきます。

この基本形にメソッドを追加してコントローラーを作成していきます。


ひとつ注意として、処理がないからといってメソッドを削除してはならない、という点があります。

メソッドを削除すると、"そのアクションそのものがない"と判断されてしまいます。

何も処理がなければ、空のメソッドを用意します。メソッド自体を消しちゃダメです。


WEBブラウザからアクセスをする場合、アドレスは「名前」と「アクション」の組み合わせになります。


http://サーバー/CakePHPディレクトリ/名前/アクション


今回の環境(XAMPP)では、サーバが"localhost"でディレクトリは"cakeapp"、名前は"test"でアクションはなし。


このように名前を指定したアドレスにアクションの指定がない場合、デフォルトでは"index"というメソッドが実行されます。これはWEBサーバにアクセスした際に何も指定しないと"index.html"が呼び出されるという仕組みと同じです。


でぁこの「アクション」とは何なのか。


それは、"その名前での様々な動作や処理を示すもの"と考えてください。

例えば、あるデータを扱うコントローラーの中で、「データを表示する」「フォームからデータを受け取る」「データを追加する」といったような複数の種類の処理を扱う際にそれぞれの機能のアクションを用意します。


言ってしまえばアクションを指定することでコントローラーの中の「データを一覧表示する」機能を呼び出したり「データを追加する」機能を呼び出したりすることができる。つまり自分の意図した機能を呼び出す為の値とでも理解すればいいと思います。


cakePHPではそれぞれのアクションが実行されると、コントローラーの中でそのアクションに対応するメソッドが実行されるようになっています。


アクションに対応するメソッドですから、これを「アクションメソッド」と呼んだりします。

今回はtestControllerクラスにindexアクションメソッドを定義したということになります。



このようにコントローラーの作成というのはアクションメソッドを定義して様々なアクションごとの処理を実装していくという、というのが基本です。


今回はただ単にメソッドを実行するだけで終わりですが通常だとメソッド終了後にビューが呼ばれてクライアント側に送り返されるのです。


要はアクションは「コントローラーに用意されたメソッドを実行し、対応するビューを生成して返信する」といった一連の流れを示すものだと考えてください。


何か新しい画面を作成する。そのためのアクションを設計士、アクションメソッドとビューを用意する―それがcakePHPにおける基本的な開発の流れになります。



それでは↑で触れた名前に関する解説を。

名前の付け方は、cakePHPにおける基本となります。


cakePHPの基本思想は「設定よりも規約!」というスタンスをとっています。

cakePHPの場合、個々のコントローラーやビュー、モデルの動作に関する設定などは一切記述しません。


でぁ、cakePHPはどうやって「ここはどこのコントローラーを使い制御を行い、どのアクションでどのビューを、モデルを使ってDBへアクセスするのか。」ということを知るのか。


cakePHPではMVCそれぞれの名前の命名規則が定められています。つまり、その規則にしたがって命名したファイルを用意することで使われるコントローラーやビュー等がcakePHP側で勝手に判断し、自動的に認識されるのです。


では、以下でcakePHPの命名規則について説明します。


MVCのファイル名の命名規則


コントローラー:[名前]_controller.php


ビュー:[名前のフォルダ]/[アクション].ctp


モデル:[DBのテーブル].php


コントローラーは名前の横に「_controller」とつけたファイル名に。ビューはその名前のフォルダを用意し、その中にそれぞれのアクション名のファイルを作成します。ビューは独自のテンプレートファイルとして用意するので拡張子はctpとなります。


MとCのクラス名の命令規則


コントローラークラス:[名前]Controller

モデルクラス:[テーブル]


コントローラーは名前の後に「Controller」と続けたクラス名になります。

モデルクラスは、テーブル名をそのままクラス名とします。尚ビューはクラスとしては定義しません。



ファイル名はアンダースコア記法


名前が複数の単語を組み合わせたような形になっている場合、ファイル名は「アンダースコア記法」と呼ばれる形式で記述されます。


これはそれぞれの単語をすべて小文字にし、それぞれをアンダースコアでつなげて一単語にまとめたものです。

例えば「nakaProject」の場合、コントローラーのファイル名は「naka_project_controller.php」となります。


クラス名、メソッド名はキャラメル記法


クラス名やその中で定義するメソッド名は、一般に「キャラメル記法」と呼ばれる形式で記述します。

これは複数の単語があった場合、それぞれの最初の文字だけを大文字にし、その他すべてを小文字にするものです。


例えば「nakaProject」という命名にしたい場合にコントローラークラス名は「NakaProjectController」となります。



PHPでは原則として"クラス名は大文字で始まり、メソッドやメンバー変数は小文字で始まる"という名づけ方がされますが、このことはキャラメル記法でも同様です。例えば「This Name」はクラス名なら「ThisName」、メソッド名なら「thisName」となります。


テーブル名・名前は複数形。


ただし、モデル使用時のみつぎの決まりになります。

それは、DBにあるテーブルを利用する場合には、テーブル名を名前としてつける(つまりテーブル名と名前が同じになる)、という規則です。

テーブル名は通常複数形で名づけます。

テーブルが「Books」なら「Books」という名前になり、コントローラーは「books_controller.php」というファイル名になりモデルは「books.php」に、モデルクラスは「Books」というようにテーブル名が決まると順次決まっていきます。



次にコントローラーのメンバ変数について解説。

先ほど作成したコントローラーには、3つのメンバー変数


public $name = 'test';
public $uses = null;
public $autoRender = false;


が設定されていました。このメンバー変数について解説していきます。

まず$nameですが、コントローラークラスではこのように最初に「$name」というメンバー変数に値を設定しています。これはこのコントローラーの名前を指定するものです。これは、実はcakePHP1,1時代に必要とされていたもので、現在の1,2では特に必要ではなくなったみたいです。(ただし名前をデフォルトのものとは異なるものに変更する場合等に利用することはあります。)



つぎに$uses。これはここで使用するモデルの指定になります。ここではヌルポ(゚д゚)ガッ が指定されています。

ここで値を設定しておくと、コントローラー内のメソッド類が実行される際にはすべて設定された値に基づいて使用されるモデルが決まります。今回は使用していないのでヌリポ(゚д゚)ガッ!!になっているわけです。


つぎに$autoRender。

cakePHPではクライアントに表示を送信する際ビューとして用意されているファイルを読み込んでそれを基にしてレンダリングして画面表示用のHTMLを生成しています。

ビューのデータは純粋なHTMLのみで書かれているわけではないので一度読み込んでHTML形式に翻訳する必要があるわけです。


cakePHPでアクションが送られるとコントローラー内の対応するアクションメソッドが呼び出される訳ですが、その処理が終わるとcakePHPは自動的にそのアクション用に用意されたビューを読みこんでレンダリングし、クライアントに送り返します。


これが自動レンダリング機能というものです。

今回はビューは使わずコントローラーのみで出力を行っているので、この自動レンダリング機能は偽になっているわけです。


ではindexとアクションの基本がわかったところで別のアクションをコントローラーに呼び出して実行してみませう。


<?php

class testController extends AppController{

public $name = 'test';
public $uses = null;
public $autoRender = false;

function index(){

echo "<html><body>";
echo "<div>これは、テスト用コントローラーによるindexアクションの表示です。</div>";
echo "</body></html>";
}
}

?>


↑を↓のように修正。

<?php

class testController extends AppController{

public $name = 'test';
public $uses = null;
public $autoRender = false;

function index(){

echo "<html><body>";
echo "<div>これは、テスト用コントローラーによるindexアクションの表示です。</div>";
echo "<br/><a href=\"other\">otherアクションを呼び出す</s>";
echo "</body></html>";
}

function other(){
echo "<html><body>";
echo "<div>これはotherアクションの表示です。</div>";
echo "<br/><a href=\"index\">indexアクションに戻る</a>";
echo "</body></html>";
}

}

?>



以上のように修正したら、http://localhost/cakeapp/test/index へレッツアクセスヽ( ^ω^)ノ サクセス!




PHP2009-cake9
こんな画面がでただろうか。



PHP2009-cake10
otherリンクを押下後。このようにアクションメソッドによって処理が変わる。


以上軽く流したところでコントローラー・アクション部分は終了。



      /\___/ヽ
     /       :::::::\
    .|          .::::|
    |  ''''''   ''''''   .:::|
    .|(●),   、(●)、::::|
     \ ,,ノ(、_, )ヽ、,,.:::::/
     /``ーニ=-'"一´\
   _/((┃))_____i |_ キュッキュッ
.. / /ヽ,,⌒) ̄ ̄ ̄ ̄ (,,ノ   \
/  /_________ヽ..  \
. ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

       /\___/ヽ
     /''''''   '''''':::::::\
    . |(●),   、(●)、.:| +
    |   ,,ノ(、_, )ヽ、,, .::::|
  .   |   `-=ニ=- ' .:::::::| +
     \  `ニニ´  .:::::/     +
     /ヽ、ニ__ ーーノ゙\_
    .| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄.|  トン
   _(,,)TO BE       (,,)_
.. /. |..CONTINUED!!   |  \
/   .|_________|   \
人気ブログランキングへ