デザイナーのためのCakePHP入門

5月 2nd, 2008 admin

対象

プログラマがCakePHP(1.2)を押し付けてきてひどい目に遭っているコーディング担当用
PHPが< ?phpで始まり、?>で終わるということぐらいは知っているということにします。

拡張子

CakePHPで使われるデザインが書かれたファイル(以下テンプレート)の拡張子は.thtmlと.ctpがあります。.htmlだったら便利なんですけどね。プログラマからの嫌がらせだと思ってください。
Dreamweaver CS3で.thtml(CakePHP)の拡張子を編集できるようにするTIPS (what a bringdown)
STUDIO KINGDOM Blog � DreamWeaverでCakePHP開発を行う際の設定(.thtml)

編集すべきファイルの場所

ファイルは/app/viewsとかにあります。さすがにこの場所はプログラマに教えてもらいましょう。(プロジェクトによっては場所が違いますので)

テンプレート・・・/app/views/*
スタイルシート・・・/app/webroot/css
画像・・・/app/webroot/img
Javascript・・・/app/webroot/js

webrootにおいては上記の4つのディレクトリ以外は基本的に自由にファイルを配置したりディレクトリを作っても大丈夫です。ただし画像やスタイルシートを上記の4つ以外に入れたいという場合はプログラマに相談してください。

テンプレートの編集

view.gif
ここからは/app/views以下のテンプレートの編集の話です。CakePHPでは1つのページをいくつかのテンプレートを組み合わせて表示させています。
使われるのは「レイアウト」「メインのテンプレート(コンテント)」「エレメント」の3つです。
DreamWeaver使いの人なら
・レイアウト = テンプレートファイル
・コンテント = 普通のファイル
・エレメント = ユーティリティー
と考えてもらっていいと思います。

レイアウト

/app/views/layoutというディレクトリがあると思います。ここにはレイアウトファイルといってテンプレートの大枠部分が入っています。ヘッダやフッタ部分ですね。

エレメント

/app/views/elementsというディレクトリには各ページで共通のパーツが入っています。メインメニューや、カレンダーなどの表示部分をココに入れておくことが多いです。

helpers,scaffolds,errors

この3つは最初から用意されているディレクトリですので無視して大丈夫です。

それ以外

普通のページ用のテンプレートです。ブログでいうなら記事の表示部分に相当します。

どのファイルを編集すればいいのか

どのページがどのファイルかわからない場合は、編集したいページのURLをみてみてください。
http://example.com/users/edit/1
だった場合は
http://example.com/フォルダ名/ファイル名.ctp/1
ということになります。今回の場合は
/app/views/users/edit.ctp(もしくはedit.thtml)を編集するということです。
たまに違う場合もありますが、フォルダも違うということは滅多にないと思うので同じフォルダのそれっぽい名前のファイルを開いてみてください。

まとめ

これでCakePHPを使った開発の概要がわかってもらえたかと思います。なんだか素朴にPHPを編集していたときと比べるとかなり違っていますが、レイアウトやエレメントは使いこなすことでデザイナーの人にもメリットがある仕組みだと思います。次回は具体的なソースの編集Tipsなどを書く予定です。

CakePHPで検索機能の実装を少し楽する

4月 22nd, 2008 admin

  • 検索
  • ページング
  • ソート

この3つさえなければ僕はWebアプリが大好きです。

CakePHP1.2での簡単なやり方

CakePHP1.2ならLIKE文なんかをある程度作ってくれるのでWHER 1=1 AND...とか書かなくてOKで少しうれしいです。

コード

usernameとpasswordが入ったUserモデルとuser_idとかnameとかname_ruby,tel_mobileとかが入ったProfileモデルに対してAND検索をする例。

/admin_index.ctp

PHP:
  1. <h2>ユーザの検索</h2>
  2. <form action="<?php echo $html->url('/admin/users/index'); ?>" method="get">
  3. <table>
  4.     <tr>
  5.         <th width="20%">ログインID</th>
  6.         <td>
  7.             <?php echo $form->input('Words/username', array('size' => '20','label'=>false));?>
  8.         </td>
  9.     </tr>
  10.     <tr>
  11.         <th>名前</th>
  12.         <td>
  13.             <?php echo $form->input('Words/name', array('size' => '30','label'=>false));?>
  14.         </td>
  15.     </tr>
  16.     <tr>
  17.         <th>フリガナ</th>
  18.         <td>
  19.             <?php echo $form->input('Words/name_ruby', array('size' => '30','label'=>false));?>
  20.         </td>
  21.     </tr>
  22.     <tr>
  23.         <th>携帯電話番号</th>
  24.         <td>
  25.             <?php echo $form->input('Words/tel_mobile', array('size' => '15','label'=>false));?>
  26.         </td>
  27.     </tr>
  28. </table>
  29. <?php echo $form->submit('検索');?>

/users_controller.php

PHP:
  1. function admin_index() {
  2.         //検索ワードがあるかどうか
  3.         $conditions = null;
  4.         if(isset($this->params['url']['data']['Words'])){
  5.             $this->data['Words'] = $this->params['url']['data']['Words'];
  6.             $like = $this->_create_like_conditions($this->params['url']['data']['Words']);
  7.             $conditions = array('and' => $like);
  8.         }
  9.         $this->User->recursive = 0;
  10.         $this->set('users', $this->paginate($conditions));
  11.     }
  12.  
  13.     function _create_like_conditions($data){
  14.         $like = array();
  15.         foreach($data as $k=>$v){
  16.             $like[$k] = 'like %'.$v.'%';
  17.         }
  18.         return $like;
  19.     }

まとめ

likeのところは、or,not,in,between,regexp,<>にも対応しています。また今回はand検索でしたがもちろんorでもいけます。

みんなには嫌われているけど現場では他に選択肢がないため大活躍なジャックバウワーのような存在「PHP+CakePHP」、今日も助かったよ!

CakePHP::ユニークな値かどうかチェック(重複チェック)

4月 15th, 2008 admin

ユーザIDなど重複したら困る時のチェック。よく使うのでメモ
MySQLの場合は、DBのuniqueを使ったスマートな方法もあります。

コード

/model/user.php

PHP:
  1. function unique($field){
  2.        foreach( $field as $key => $value ){
  3.            $this->recursive = -1;
  4.            $found = $this->find(array("{$this->name}.$key" => $value));
  5.         }
  6.            return !$found;
  7.     }

/controller/user_controller.php

PHP:
  1. //省略 addメソッドとか
  2.             if($this->data['User']['username'] && !$this->User->unique(array("username" => $this->data['User']['username']))){
  3.                 $this->User->invalidate("unique");
  4.             }
  5.  
  6.             if ($this->User->save($this->data)) {
  7. //・・・以下省略

/view/user/add.ctp

PHP:
  1. <td width="65%">
  2.         <?php echo $form->input('User/username', array('label' => false)); ?>
  3.         <?php echo $form->error ('User/unique', 'このIDはすでに使用されています。');?>
  4.     </td>

CakePHP1.2での管理者用レイアウト設定

4月 14th, 2008 admin

admin routingを使っていて、adminの時だけ別のレイアウトを設定したい場合。
こうやってみればいいんじゃないかという例

コード

PHP:
  1. <?php
  2. //app/app_controller.php
  3. class AppController extends Controller {
  4.     function beforeRender() {
  5.         echo $this->action;
  6.         if (preg_match("/^" . Configure::read('Routing.admin')  . "_/i", $this->action)) {
  7.                 $this->layout = 'admin_default';
  8.         }
  9.     }
  10. }
  11. ?>

まとめ

他のやり方ってあるのかな?知りたいです。
あと、管理者用とユーザ用のコントローラを分けたいときにRailsのようにcontrollers/admin/user_controller.phpみたいにディレクトリを切りたいんだけど、それもやり方を知りたい。今はadmin_user_controller.phpとかを作っているけどカッコ悪い

CakePHP::HABTMの編集画面を作る

2月 13th, 2008 admin

CakePHP1.1の話。ほかのやり方があったら教えて欲しいです。ちょっと面倒。

目的

CakePHPのブログチュートリアルのようにエントリーに複数のタグをつけるような場合で

<?php echo $habtm->checkboxMultiple('Tag/Tag', $tags, $selected_tags, array('multiple' => 'multiple')) ?>

こうやって書いたら、チェックボックスでタグがダラダラーとでてきて、もちろん選択済みのものが選択されている状態を作るのが目的。

選択済みのタグのリストを作る

shepherdweb
上記サイトのとおりにやってください!

セレクトボックスをやめてチェックボックスにする

Create Multiple Checkboxes Instead of a Multiple-Select in your Views
上記サイトのとおりにやってください!(habtmヘルパーをインクルードするのを忘れずに)

以上