2010-01-01から1年間の記事一覧
モデルのアソシエーション(リレーション)として、これまで、hasOne、hasMany、belongsTo検証したので、HABTM(hasAndBelongsToMany)、つまり、N:Mの関係を検証してみる。scaffoldをやってびっくり。とっても簡単に定義できる。N:M(複数:複数)のリレーシ…
モデルのアソシエーション(リレーション)として、これまで、hasOne、hasMany、belongsTo検証したので、HABTM(hasAndBelongsToMany)、つまり、N:Mの関係を検証してみる。scaffoldをやってびっくり。とっても簡単に定義できる。N:M(複数:複数)のリレーシ…
先のログでAuthを使って、全てのコントローラーでログインチェックを行うことにした。 これは、面倒くさい。DRYじゃない。ということで、コントローラーのスーパークラスであるAppController.phpに設定してしまう。AppController.phpは、/cake/libs/controll…
前回のログに引き続き、usersテーブルをメンテナンスするプログラムを作成する。 今回は、hasOneの関係を試すために、user_attrsテーブルを以下のようなスキーマで作成する。 CREATE TABLE IF NOT EXISTS `user_attrs` ( `id` int(11) NOT NULL AUTO_INCREME…
Authコンポーネントを使って、以下のような認証を実装する。Mainというプログラムを作成し、以下のようなメニュー画面をつくる。 ここにアクセスするためには、以下のようなログイン画面を通すようにする。 また、メニューからログアウトすると以下のような…
画像アップロードを作った際に、モデルのinvalidateが言うことを聞かずにちょっとはまった。 multipartの部分は、あらかじめsaveの前にチェックしてエラーがあったら画面を戻してエラーメッセージを出したい。 invalidateを使うのは、入力値が残るため。これ…
前回の続き。 まず、以下のアップロード画面を作る。これがメイン。 プログラム名はDocとするので、/app/controllersにdoc_controller.phpを作成する。 ビュー /app/views/docsにadd.ctpを作る。 ファイルを複数uploadするには、DocImage.0.fileと同じ部分を…
前回の続き。 まず、以下のアップロード画面を作る。これがメイン。 プログラム名はDocとするので、/app/controllersにdoc_controller.phpを作成する。 ビュー /app/views/docsにadd.ctpを作る。 ファイルを複数uploadするには、DocImage.0.fileと同じ部分を…
前回の続き。 まず、以下のアップロード画面を作る。これがメイン。 プログラム名はDocとするので、/app/controllersにdoc_controller.phpを作成する。 ビュー /app/views/docsにadd.ctpを作る。 ファイルを複数uploadするには、DocImage.0.fileと同じ部分を…
ファイルアップロードをやってみようと思い、名高いMedia Pluginを試して、半日がかりでやってみたが、結局挫折。サイトを見て、おやおやと思ったのが、0.x系から飛んで、1.3RCが出てること。こういうのは経験的に危ない。YUI、Strutsなんかもそうですね。ア…
CakePHPではモデルを定義するだけで、基本的なSQLは書かなくていい。 だが、それだと困る場面もあると思う。 と思ってググってみると、shinbaraさんのブログにありがたいことが書いてあった(感謝です)。コードを見た方が早いので書いておく。 コントローラ…
つまらないことで30分もはまったので、覚え書き。 以下のように、円マークをつかって、金額をカンマ区切りで出そうと思い、Numberヘルパーを使った。 円マークを¥とするのは当たり前なんだけど、エスケープされてしまう。あれれ、と思ったら、numberヘルパー…
ORM(Object-Relational Map、もしくは、Object-Relational Mapper) モジュールでは、エンティティー間のリレーションが定義できることができるのが、一般的だ。話が脇にそれるが、先日、会社で教育をやったらエンティティー(Entity)という言葉に違和感を覚…
これまでのログではJavascriptを使ってこなかったが、使わないわけにはいかない。 レイアウトを使わずにテンプレート(ctpファイル)のみを使うのであれば、普通通りにscriptタグが使える。 だが、レイアウトを使いたい。 だが、たとえば、ctpファイルに <script>ale</script>…
こちらの記事の方がシンプルですね。どうもありがとうございました。 ==================================================================== よく間違ったURLを叩くと、以下のような画面が現れる。 とっても親切に、コントローラーがないよ、とか、アクシ…
CakePHPで秀逸だなぁと思うのが、このページネーション。とってもスマートに書くことができる。Myznalaでもオレオレ流のページネーションを提供しているが、自分で書くとなるとそれなりに面倒くさい。CakePHPでは、一覧表示画面に簡単なコードを追加するだけ…
それでは、顧客テーブル(customers)に更新、削除機能を実装して、とりあえずCRUDを完成してしまおう。更新は、前回の詳細画面に更新のためのリンクを張って実装する。 更新のリンクをクリックすると、以下のように更新画面に遷移し、更新ボタンで更新する…
今回は、これまでに作った一覧表示画面を修正して、明細参照の画面を追加する。 方法としては、以下のように、一覧にあるIDにアンカーを張る。 ここで、アンカーをクリックすると、以下のようなデータを照会する画面に遷移するようにする。 ポイントは、アン…
以前、scaffoldのログでモデルにバリデータを設定した。 実際にはいろんなパターンのバリデーションを適用するから、今回は自作のバリデータをモデルに設定する。 サンプルでは、これまで使ってきたモデルに対して、 名前;ひらがなに入力を制限する。 郵便…
前回のプログラムに、データの追加機能を追加する。初期画面は以下。 画面左下に、「登録」のリンクを張って、そこをクリックすると、以下の画面に遷移する。 また、いくつかのフィールドにバリデーション(Not empty)を実装して、エラーの場合、以下のよう…
今回は、前回の画面によくある絞り込み機能を追加する。 以下のように画面に入力フィールドを設け、それに合致するデータを一覧で表示する。 Formヘルパーを使うことで、入力後に送信しても入力フィールドがクリアされない。これは便利。 モデル モデルは先…
scaffoldを間にはさんでしまったが、以前のログの続きで、テーブルからデータを取得して一覧表示してみる。 以下がその画面。 モデルの作成 /app/modelにcustomer.phpを作成する。 コントローラーの作成 /app/controllersにcustomer_controller.phpを作成す…
CakePHPを勉強し始めて、Strutsが登場した頃の感覚がよみがえるのだが、決定的に違うのが、モデル(DAO:Data Access Object)にバリデーションを実装する点。 Strutsだと、印象としては画面の入力に対してバリデーションを行い、コントローラーでさばく。Str…
前回のログでは、CakePHPの「デフォルトレイアウト」を利用したscaffoldを作成した。 これはこれでいいのだが、他の画面とレイアウトを合わせたい、ということもあるだろう。 今回は、scaffoldに独自のレイアウトを適用してみる。以下が、初期画面(index画…
scaffoldのtimestampの件、解決しました。フィールド名に規約があるのですね。createdとmodifiedをDATETIME型にしたらscaffoldの画面から消えて、裏ではちゃんと動作しました(CakePHP1.3.14, PHP5.3.4, MySQL5.1.54, CentOS5)。どうもありがとうございました…
前置きが長くなったが、データベースを使ってみる。 CakePHPは、データベースに対して、「モデル」と呼ぶ独自のDAO(Data Access Object)を提供している。この場合のコンベンション(慣例、規約)は、 テーブル名は複数形(最後にsをつける)。 モデル名は…
今回は、以下のような画面をフォーム・ヘルパーで作ってみる。JavaEEをやっていた頃、Strutsのタグリブ(Taglib)で大はまりしたことがある。フォーム・ヘルパー(Form Helper)やHTMLヘルパー(HTML Helper)は、タグリブの臭いがするので、なんとなく気が…
前回のログでは、CakePHPに用意されたSanitizeライブラリ(プログラム)でサニタイズをした。実際のアプリでは、サニタイズや禁則処理を独自に実装したいことが多い。そこで、今回は独自のクラスを使ってサニタイズしてみる。入力は前回と同じで以下のように…
Formの入力値を処理するのに、最低限必要なのがサニタイズ。 下の画面のように、テキストフィールドに <script>alert('hello')</script> と入力して、以下のようになったらシャレにもならない。 CakePHPには、Sanitizeというライブラリー(プログラム)が用意されている。プロ…
前回、前々回のついでに、Formの送信先のアクションでコントローラーをダンプしてみる。 FormのメソッドはPOSTにするので、前々回のTestFormをコピーして、TestForm3を作成する。 index()で以下の画面を表示する。 コントローラーは以下。