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

CakePHP:Security Componentでハマる(最中)

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

CakePHP1.2ガイドブック
CakePHP1.2ガイドブック
おすすめ平均
starsサンプルコードが提供されず不便
stars入門から応用まで対応

Amazonで詳しく見る by G-Tools

Security Componentを使っているのだけれど、全くわからず…。

// コントローラー
class EnqueteController extends EnqueteAppController{
  var $components = array('Security');

  function beforeFilter(){
    parent::beforeFilter();
    // CSRF&リロード対策
    $this->Security->requireAuth('post_data');
    $this->Security->blackHoleCallback = '_reload_error';
  }

  /**
   * アンケートの回答を受付
   */
  function post_data(){
    // 受付処理
  }

  function admin_add(){
    // 管理者用アンケート追加処理
  }

  function _reload_error(){
    // blackHole処理
  }
}

というふうに作っているのであるが、admin_addで、データをpostすると正常な場合は登録されるのであるが、わざとエラーを起こした場合に、validates()の結果をフォームに反映するのではなく、blackHoleCallbackで設定されている_reload_errorメソッドを実行されてしまう…。

validates()の結果がエラーになるとblackHole行きになるの???

1.2.5 SecurityComponentでハマったときに確認するポイント

を参照して、$form->create()と$form->end()を使っているのだが…。
(ちなみにtableFormヘルパーを作ってるので、$tableFrom->create()とかだけど)
$tableForm->submit(’送信’);も使ってるけど。

だいたい$this->Security->requireAuth()にメソッド名加えてないんだから、Securityコンポーネントに関係ない処理になるんじゃないの?また、もしブラックホールに吸い込まれるんなら、この場合は正常なときも吸い込まれるんじゃないの?わけわかんないっす・・・。

とりあえず、Securityコンポーネントを外して実装してから考えようか(ガックリ…)
なんか実装がどんどん遅れていくなぁ。
フレームワーク使う目的って効率上げることなのになぁ。


CakePHP:昨日のプラグインのはバグじゃなかった

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

CakePHP1.2ガイドブック
CakePHP1.2ガイドブック
おすすめ平均
starsサンプルコードが提供されず不便
stars入門から応用まで対応

Amazonで詳しく見る by G-Tools

昨日、プラグインの$useTableが効いていないという投稿をしたけれど、あれはバグじゃなかった。なんてことはない。自分の勘違いだった。

class Enquete extends EnqueteAppModel{
  // var $hasMany = array('EnqueteAnswerList'); // ここがミス
  var $hasMany = array('Enquete.EnqueteAnswerList'); // プラグイン名.モデル名でつなげばOK

}

$useTableの問題だけかと思っていたら、明らかにモデルを見ていないような感じの処理を行ったので(画面が真っ白になったり、モデルクラスに作成したメソッドをコールしても呼ばれなかったり…)、CakePHPのCookBookのプラグインモデルのページを確認したらあっさりと答えが書いてあった。

バグ扱いしてすみません〜(T_T)

多分、昨日のもこれが原因だったんだろうな〜。


CakePHP:pluginのModelで$useTableが効かないバグ?

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

CakePHP1.2ガイドブック CakePHP1.2ガイドブック

毎日コミュニケーションズ 2009-06-27
売り上げランキング : 51427
おすすめ平均

Amazonで詳しく見る by G-Tools

(訂正)この記事でCakePHPのバグかと勘違いしていましたが、自分の設定ミスでした。
詳しくは、次の日の投稿を参照のこと。

CakePHP1.2.3を使ってたのであるが、プラグインを開発していて(といっても、1.1で開発したやつを1.2に移植してるだけ)、さて動かすかという算段でアクセスしてみたら、

Error: Database table enquetes for model Enquete was not found.

と言われた。このエラーメッセージから、アンケートプラグインを作っていたのがわかるw
それはともかく、Enqueteモデルでは、

<?php
class Enquete extends EnqueteAppModel
{
  var $name = 'Enquete';
  var $useTable = 'enquete'; // テーブル名はenquetesではなく、enqueteなのだ
}
?>

なのである。ただ、俺は掲示板プラグインも作っているのだが、掲示板プラグインではそんな事にはなってない。掲示板プラグインとアンケートプラグインの違いは、掲示板はbbsテーブルのみだが、アンケートは、enquete, enquete_answer_list, enquete_resultという3つのテーブルを使っている事だ。hasManyとかで参照しているModelの$useTableを見てないんじゃないだろうか?

googleで検索してみたら、以下を発見。
https://trac.cakephp.org/ticket/4131
チケット出てるやん。でもcloseされてるみたい。でもその後に、再現するからもう一度テストしろっていう書き込みが見られるが、スルーされてるっぽい。1.2 RC1の頃のチケットだからなぁ…。

CakePHP 1.2.5が出てたのでひょっとしたら直ってるかな〜と思ってcakeディレクトリを上書きしてみたけれど、結果は変わらず。直ってないやん。

なんか面倒だったので、テーブルを複数系にして対応してしまった。
でも、enquete_answer_listsって、リストなのに複数形ってオイ!!と自分で突っ込みたくなる。正直気持ち悪い。まあとりあえずってことで。


CakePHP: WindowsでのXAMPPが異常に遅い

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

CakePHP1.2で、ヒルクライムしようぜの開発をしているのだけど、現在停滞中。
理由は、CakeをデバッグモードにしているとXAMPPが異常に遅いから(やる気を削がれた)。
XAMPPが遅い理由は、わからない…。

MacBookにMAMPをインストールして、こちらで全く同じソースを走らせたら2秒で表示されたのに対し、Windows環境のXAMPPなら、22秒。もう遅すぎ…。1ページ修正して様子を見るのにあまりに時間がかかるため、あきらめた。解決策を探してみたものの、見つからないし。

試しに、Cakeをダウンロードしたままの状態でXAMPPで走らせてみたら、それでも3秒かかった。まっさらな状態で3秒かかるって。

まあ考えられるのは、Apacheの設定とかなんだろうと思う。Cakeのソースが同じなんだから。とりあえず、ヒルクライムしようぜの開発はMacBook側で行うことにして、ソースを移動させた。画面の大きさが小さいので開発しにくいと思ったので、以前使っていたUXGAのディスプレイにつないでデュアルディスプレイにした。
前に使っていたやつはヤフオクで買ったやつでもう古いためか、久々に電源を入れたら画面が黄色がかっててショックだった。MacBookの画面がきれいなだけに余計際立ってしまった。ソースを書くためのディスプレイだから、問題ないけど。

WindowsのXAMPPで遅いのを解決する方法をご存知の方がいらっしゃったら、ぜひ教えてください!


CakePHP1.2:cleanUpFieldsって無くなってたのか…。

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

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

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

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

Amazonで詳しく見る by G-Tools

Cake1.1のプログラムをCake1.2に移植中ってずっと言っていることなんだけど、
こいつは本当に時間がかかるかも…。
今日は$controller->cleanUpFields()がないというエラーメッセージが出てきて、なんでかな~と思ってネットで調べてもなかなか答えに行き当たらず、CakePHPポケットリファレンスで見て、無くなっていることに気付いた。Model::deconstructに変更になったらしいっすわ。そうですか。

まあね、Model側に持たせておけば、beforeValidateのときに自動的に合体させるようにしておけば、漏れがないしね~。コントローラから分離するにはそちらのほうがいいですわ。

修正箇所が多すぎて、心が折れそうになるときもあるけど、じっくりと取り組みます。
それにしても、CakePHPポケットリファレンス、情報は結構古くなってきたけど、まだ使えるなぁ。
このポケットリファレンスの最新版が出たら、即買いするんだけど。


CakePHP:schema.phpのindexesの更新でバグ

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

CakePHP1.2の話。

データベースのテーブル定義を更新しようと、schema.phpを編集してcakeコマンドでスキーマの更新をかけようとしたら、失敗した。

Can't DROP 'indexes'; check that column/key exists

indexesがDROPできないから更新できないよ~!ということらしい。
Googleで検索してみたところ、Google groupのcakephpのところに答えがあった。

http://groups.google.co.jp/group/tickets-cakephp/browse_thread/thread/84cbdf3093415923

ただ、cakeのコアを編集することになるので、
Cakeのバージョンがアップしたときに対応されてないと
またバグになってしまうので注意が必要かと思う。

// CORE/cake/libs/model/schema.phpの430行目
$tables[$table]['drop']['indexes'] = $diff['drop'];
$tables[$table]['add']['indexes'] = $diff['add'];
// を下記のように編集する

// $tables[$table]['drop']['indexes'] = $diff['drop'];
// $tables[$table]['add']['indexes'] = $diff['add'];
if(!empty($diff['drop'])) {
        $tables[$table]['drop']['indexes'] = $diff['drop'];
}
if(!empty($diff['add'])) {
        $tables[$table]['add']['indexes'] = $diff['add'];
}

この修正後、スキーマの更新を再度行ったら、indexesが正常に更新されました。
よかったよかった。


CakePHP: xdebugインストール

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

CakePHPのユニットテストを使ってみようと思って、
xdebugをインストールしたのでメモ。
インストール自体は、peclで簡単。

pecl install xdebug

ただ、上記の方法でインストールしたら、xdebug-2.0.4がインストールされた。
2.0.4だと、コードカバレッジの画面を表示したら真っ白になってしまった。

以下に、xdebug-2.0.3で動かなくて、xdebug-2.0.0にしたら動いたとあった。
http://taichino.com/?p=123

なので、xdebug-2.0.0をインストールしてみる。

pecl uninstall xdebug
pecl install xdebug-2.0.0

これで、ちゃんとコードカバレッジが動いてくれました。
よし、ユニットテストの勉強をしよう!!


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
    }
?>