‘CakePHP’ カテゴリーのアーカイブ

Cakephp1.2: setメソッドを使うときの注意

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

CakePHPでハマッた件のメモ。

// コントローラー
$hoge_fuga = 'test';
$this->set(compact('hoge_fuga'));

// ここからビューとして・・・
<?php e($hoge_fuga); // testと表示されると思ったのに、表示されない! ?>

15分くらい悩んだ…。変数名にアンダーバーつける前まではちゃんと動いていたし、アンダーバーを付けたらダメというルールもなかった気がする(ずっと使ってたし。)
ここでミソなのが、compact関数です。
compact関数を使うと、アンダースコアがキャメルケースに変更されてしまうらしいです。

参照情報:
http://www.rainorshine.asia/2008/08/10/post602.html

ですので、アンダースコアの場合、compact関数を使わずにsetしましょう。

// コントローラー
$hoge_fuga = 'test';
$this->set('hoge_fuga', $hoge_fuga);

// ここからビューとして・・・
<?php e($hoge_fuga); // testと表示されました! ?>

以上です。
て、久々の更新がメモかよっ!


CakePHPの新しい本が出るらしい

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

CakePHPの新しい本が出るらしい。著者が、CakePHPガイドブックの方なので安心。それと、個人的に楽しみなのは、Webアプリケーションテスト手法を書かれた岸田さんも著者におられること。CakePHPのテスト駆動開発方法が書かれているっぽいので、これは期待大!

あと、ケータイ対応とかについてもあるらしい。早速、アマゾンで予約しました!!

最近はCakePHPやれてないけれど、CakePHP1.2でヒルクライムしようぜ!をリプレースするのが3月中の目標。ほぼスタティックなサイトを作るにしても、CakePHPのほうがケータイ対応とかが理解できながら作れるから、DB使わないようなサイトでもCakePHPでやろうかな~とか。

CakePHPによる実践Webアプリケーション開発
CakePHPによる実践Webアプリケーション開発 安藤 祐介

毎日コミュニケーションズ 2009-03-26
売り上げランキング : 798

Amazonで詳しく見る by G-Tools


CakePHP1.2 Model::validates($data)の罠

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

CakePHP1.2の最新版である、1.2.1.8004にて、Model::validatesをオーバーライドして、モデル毎に独自のバリデーションを持たせていたのだが、いざ実験を行ってみると、全くバリデーションが効いていない。

<?php
    // コントローラー
    if ($this->Model->validates($this->data)) {
        // 検証OK
    } else {
        // 検証NG
    }
?>

上のように書いて、明らかにエラーになるような値を入力して渡しても、なぜかvalidatesをすり抜けてくる。

ちなみにモデル側は、

<?php
    // モデル
    function validates($data = array()){
        if(empty($data)){
            $data = $this->data;
        }
        parent::validates($data);
        // 独自のバリデーション

        if(count($this->validationErrors) > 0){
            return false;
        }else{
            return true;
        }
    }
?>

である。独自に定義したバリデーション自体は通っていた。問題は、フレームワークが最初から持っているバリデーションを通っていないということだ。
うーむ、俺はCakePHP1.1のときに、ずっと上記のような書き方をしていたので、全く理由がわからない。
とりあえずググると、こんな記述を発見。

注意:英語のサイトです。
http://lemoncake.wordpress.com/2007/06/26/validation-gotcha-in-cakephp-12/

どうも、$this->Model->validates($this->data)のように引数を渡したのでは、ちゃんと動いてくれないっぽい。確かに、CakePHPポケットリファレンスでも、引数を渡すのは非推奨と書いてあった。validatesをする事前に、setをする必要があるらしい。

<?php
    // コントローラー
    $this->Model->set($this->data); // 事前にsetしておく
    if ($this->Model->validates()) {
        // 検証OK
    } else {
        // 検証NG
    }
?>

こうしたら、フレームワークが最初から持っているバリデーション機能を通ってくれた。
CakePHP1.1と1.2で、こんな違いもあるのだな~。それにしても、こんなことに2時間くらい悩んでしまった…。相当ストレスがたまってしまったが、原因がわかったし、解決できたから、報われたっす。

■追記
$this->Model->create($this->data)でもよいという記事があった。
参考情報を以下に載せておく。

<?php
    // コントローラー
    // 新規作成の場合は以下でもよい
    if ($this->Model->create($this->data) && $this->Model->validates()) {
        // 検証OK
    } else {
        // 検証NG
    }
?>

Cakephp1.2でModel::findの条件指定変更だったとは!

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

愛媛ITフェアに向けて、社内でオリジナルアプリを作ろうという話になった。開発チームでは、作成するのものの大枠が決定したので、とりあえずプロトタイプを作って、社内レビューして、よさそうだったら出展という流れにしようかなと思って、開発を開始した。

使用するフレームワークはCakePHP。これは勝手に俺が決めて、作っているだけだが、まあプロトタイプ作成だし、手段はどうだっていいということだ。RedMineのWiki上に要求仕様をまとめて、制作開始。

CakePHP1.2もstableが出たし、CakePHP徹底入門も結構前に買ってたので、CakePHP1.2で作ることにした。バージョンが1.1から1.2に変わったことで、便利になった部分も多いが、1.1を覚えてしまったせいで、結構弊害もあって、なかなか難しい。

CakePHP徹底入門
CakePHP徹底入門 イージーゲート

翔泳社 2008-08-29
売り上げランキング : 120410

おすすめ平均 star
starこれから始める人にはお勧め
starがっかり

Amazonで詳しく見る by G-Tools

この本だけでは、正直CakePHPの使い方をマスターできるとは到底思えないが、CakePHP1.2からスタートする人にとっては必須になるだろうなとは思う。個人的には、CakePHPガイドブックから入った人には、CakePHPポケットリファレンスのほうが便利に感じるだろう。

CakePHP ポケットリファレンス (Pocket Reference)
CakePHP ポケットリファレンス (Pocket Reference) 株式会社ブルーオーシャン 岡田 佳典

技術評論社 2008-06-18
売り上げランキング : 16855

おすすめ平均 star
starこれだけで作れそうです。
star現状のCakePHPリファレンスでは最良
starサンプルコードがもう少し丁寧であれば5つ星

Amazonで詳しく見る by G-Tools

さて、本題に入るが、CakePHP1.1のときと同じような感覚で、Model::findメソッドの条件指定に以下のように書いたら、動かなかった。

<?php
// コントローラークラス内での記述
$conditions = array(
    'name' => '= ' . $name,
    'limitdate' => '> ' . date('Y-m-d')
);
$modelInfo = $this->Model->find($conditions); // Modelは任意のModelクラス
if (empty($modelInfo)) { // 追記:emptyを書いたら2重になった
    // 条件に合うものがなかった処理
} else {
    // 条件に合うものが見つかった処理
}
?>

動かなかったというよりは、条件に合うものがなかった処理が実行されてしまった。
確実に条件に合うものがあるのに。デバッグモードを2にしていたため、SQL文を見たところ、条件部分が明らかにおかしくなっていたので、ググってみたら、以下のサイトを見つけた。

CakePHP 1.2 RC1からfindの条件指定方法が変更となった

このページに書かれているが、CakePHP1.2RC1から、Model::findの条件指定方法が変更になり、条件は連想配列の値側ではなく、キー側に持たせるようになった。これらは書籍にはない情報だったので、非常に助かった。先ほどの条件式を新しい方式に書き直すと、以下のようになる。

<?php
// コントローラークラス内での記述
$conditions = array(
    'name =' => $name, // ココを修正
    'limitdate >' => date('Y-m-d') // ココを修正
);
$modelInfo = $this->Model->find($conditions); // Modelは任意のModelクラス
if (empty($modelInfo)) { // 追記:emptyを書いたら2重になった
    // 条件に合うものがなかった処理
} else {
    // 条件に合うものが見つかった処理
}
?>

これで、見事に動いてくれた。CakePHPの情報は本だけではなかなか難しい。一番参考になるのは、やっぱりCookbookかな~と思う。

追記:syntax-highlighterで、emptyを書いたら、2重に書かれてしまった…。plainでみたら、1つなんですけどね。syntax-highlighterのバグかな。


各都道府県のコース一覧でAtomFeedを作ってみた。

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

自転車でヒルクライムしようぜ!で、各都道府県のコース一覧のページでAtomFeedを出力するようにしてみた。これはCakePHPを使っていますが、Zend_Feedを使ったAtomComponentを作ってやってます。といってもAtomの仕様とかにもあんまり詳しくないので、適当に、Zend Frameworkのドキュメントを読んで作りました。

こいつをThunderbirdなどで購読すると、自分のいる都道府県に新しいコースが登録されたら自動的に通知されるはず。まあ、需要はあるかどうかは謎ですがw、とりあえず、色々とやってみるという気持ちでいますのでやってみたという感じ。作業時間は、1.5時間程度だったでしょうか。


CakePHP: AjaxHelper::editorでonFailureは出来ない?

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

CakePHP1.1の話。

CakePHP Users in Japanで質問してたんですが、
AjaxHelper::editorで、エラーの場合にどうすればいいのか?で、一応自分なりに答えが出たので、ブログでも書いておこうかなと。ネットで調べても情報がなかったもんで。。。(探すの下手?)

一応、私がぶつかった問題をおさらいしておきますと、例えば重複を許さないカテゴリーの編集などをした場合に、既に存在するカテゴリ名などを入力されたらエラーにして、『そのカテゴリは既に存在します』みたいなエラーメッセージを表示したかったんです。しかし、それがAjaxHelper::editorを使った場合にどうすれば実装できるのかわからなかったわけです。

まず、CakePHPのAjaxHelperは基本的にprototype.jsとscriptaculousを使ってるので、Ajaxヘルパーを使うとこれらを使ったソースを自動的に吐いてくれる。ところが、AjaxHelper::editorメソッドは、scriptaculousのInPlaceEditorのオプションであるonFailureが指定できないっぽい。

/cake/libs/view/helpers/ajax.phpを見てみると、有効なオプションを指定する配列($editorOptions)にonFailureがなかった。editorメソッド内もちょこっといじってみたが(onFailureを加えそうな感じに)、できなかった。まあこれは私が安直にやったからだろう。もっと時間かければできるかも。

ただどちらにしろ、時間がもったいないのとcakeディレクトリ以下のソースに手を付けたくなかったので(単純に面倒だし、バグになったら嫌)、viewのthtmlファイル側でscriptaculousのInPlaceEditorの呼び出しをajaxヘルパーを使わずに書いた。それならonFailure書けるし。

今のところ、AjaxHelper::editorは、自分だけが使うんなら使ってもいいけど(要は運用面でカバー)、一般ユーザに使ってもらうには難しい気がします。エラー制御できんのは致命的だと思うんですが、これってeditorメソッドを使ったエラー制御ってできるんでしょうかね?


CakePHP: お問い合わせプラグインを作成

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

CakePHP1.1で、お問い合わせプラグインを作りました。
入力項目は、

  1. 名前
  2. メールアドレス
  3. カテゴリー(選択)
  4. 件名
  5. 本文

です。

私が使ってるPEAR::Mailを使ったMailComponentが必要なので、同梱しています。もし、MailComponentが既にある場合は、InquiryControllerの内容を書き換えるか、私が使ってるMailComponentを使ってください。

デモというか、ページの感じは、私のサイトで確認できます。(実際に動いてます)

http://hillclimb.319ring.net/inquiry/

以下のリンクからダウンロード可能です。使用される方はreadme.txtをよく読んでから使用してください。

cake_inquiry_plugin_ver_1.0.zip


CakePHP: 掲示板プラグインを作成しました。

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

CakePHP1.1で、掲示板のプラグインを作成しました。そして、これを自転車でヒルクライムしようぜ!の掲示板に使っています。

http://hillclimb.319ring.net/bbs/

ネットでこういうプラグインないかなって探したんですけど、なんかなさそうだったので、じゃあ簡単なのでも作ってみるかということで。機能的にはショボイんですけど、プラグインを公開してるサイトってあんまりなさそうだったので公開します。
機能は、

  1. 投稿
  2. 投稿への返信
  3. 投稿の削除
  4. ページング
  5. コメントスパム対策キャプチャ画像表示(ON/OFF切り替え可能。ONなら要jpgraph)

というところでしょうか。編集機能はないんだな〜、これが。
なかなかいいアルゴリズムを思いつかなかったが、さっき思いついたのでバージョンアップしたら編集機能もつけるか。
ショボイくせして一応バージョンは1.0ということにします(メジャーリリース?)

インストールの仕方は、zipファイルの同梱しているreadme.txtを読んでいただけるとわかります。まあ、基本的にはDBにbbsテーブル作って、あとはソースをコピペすれば一応は動きます。テストもやったけど(使ってないノートPCにXAMPPインストールしてcakephpセットしてそこにすぐに当プラグインをインストール)、動いたのでOKでしょう。

もし使ってみようと思われた方は、以下をダウンロードしてください。
cake_bbs_plugin_ver_1.0.zip

バグがあったら私に連絡していただけますと助かりますw


JPGraphを使って標高グラフを出すようにした

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

自転車でヒルクライムしようぜ!で、コースの標高を出すようにした。
5時間ぐらいの作業だったが、ようやく出来たなぁ〜。

もちろん、CakePHPです。JpgraphComponentを作って、サクサクやりました。

しかも開発環境でやったあとに、本番環境に移行がちゃんとできんかったらアホみたいだからまた確認作業とかもやらなあかんし。軽くやけどね。ほんまに一人でやると大変ですな。でも個人サイトだから、仕様書とか作ってないからしゃーない。でもいつかまとめんとあかんな。。。

ただ、グラフは出るようになったけど、具体的な数値が表示されてないから、やっぱりそういうのって要望あるだろうなぁと思うし、そっちの表示もやらんといかん。できれば傾斜が何%とか、そういうのも求める式とか探しとかんといかん。

ちなみに三坂峠の情報とかは以下のURLで!!

http://hillclimb.319ring.net/courses/view/10

3時過ぎてもーた。眠い。。。寝よう。


CakePHP:携帯サイト開発続き

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

昨日の参考URLの情報を元に、携帯サイトの続きを行った。

http://cakephp.jp/modules/newbb/viewtopic.php?viewmode=flat&topic_id=751&forum=3

とりあえず、記録も登録できるようになったし、$this->Session->setFlash(‘登録しました’);の文字の文字化けもなくなった。ただし、すべてこの参考サイトの通りにやったわけではないので、一応自分なりに注意点を書いておきます。

  1. app_controller.phpのコンストラクタ
    if(ereg(“^/m/”, $_SERVER['REQUEST_URI'])){ …だが、
    ^/m/は、開発中には向かない場合がある。俺のように、phpmyadminを使う人は、おそらくhttp://localhost/cake/m/となっているんじゃないか?と思うが、その場合は、
    if(ereg(“^/cake/m/”, $_SERVER['REQUEST_URI'])){ …
    とする。もちろん、公開するときは修正必要なので注意!
  2. CakePHPガイドブックに従ってmobileヘルパーを作っている場合、afterRenderでmb_convert_encodingしていると、app_controller.phpのafterFilterメソッド内で文字コード変換済みなのでさらに文字化けするので注意。afterRenderをコメントアウトしてしまうとよい。

まあこれくらいかな?あとは、リンクにいちいちセッションをGETで引き渡さなければならないが、毎回のようにCAKE_SESSION_COOKIE . “=” . session_id()と書くのが、非常に面倒なので、mobileヘルパーに以下のようなメソッドを作ってみた。

function cake_session(){
return h(CAKE_SESSION_COOKIE) . "=" . h(session_id());
}

これを作っておくと、VIEWで、

<?php e($html->link('トップページ', '/?'. $mobile->cake_session())) ?>

と書けるので、なんとなく楽。


Get Adobe Flash playerPlugin by wpburn.com wordpress themes