Technote

by sizuhiko

TreeBehavior の left, right ってそういう事だったのね

<!– more –>CakePHP でとっても役に立つビヘイビアに TreeBehavior があるんです。

このビヘイビアを使うと、商品カテゴリとかディレクトリみたいに、ツリー構造になっているモデルを簡単に扱うことができます。簡単になるのは、ツリー構造を取得したり、階層を1つ上に移動したり、特定の階層の下に追加したり、といった自分で作ったら、チョー面倒な処理ばかりです。

で、これまで大変お世話になったのに、あんまり意味もわからず parent と left,rightの列があればいいんでしょ、ぐらいにしか思ってませんでした。DB弱者なんで TreeBehavior のソースも追わなかったし・・・・

で、たまたまSQL関係で調べ物をしていたら、すばらしいページを発見。

SQLで木と階層構造のデータを扱う(1)―― 入れ子集合モデル

いや、(自分にとっては)すごく難しい話なんですが、すごくわかり易く解説してあって、left,rightってそういう事だったのね、とわかってきた時は感動します。CakePHPのtreeはparent_idが必要なんですが、この理論で行くといらないですね。たぶん何かの都合でparentを持つことにしたと思うんですけど、TreeBehaviorのコードからそこまで読み取ることはできませんでした。

第42回PHP勉強会@関東に参加しました。

<!– more –>今回はフレームワーク特集ということだったので、ものすごく久しぶりにPHP勉強会へ参加してきました。

http://events.php.gr.jp/events/show/75

お初の方がいっぱいでしたが(というか自分が参加してないというのもあるんですが)、とても楽しく交流できました。

半日と勉強会としては比較的長めの時間ということもあり、皆さん濃い内容&素晴らしい発表で、ほんと勉強になりました。

特にTCPDFの話は、以前Cakeから使って同じようなことではまった事があり、とても共感しました。

それと合宿ネタでLTやりましたので、スライドをUPしておきます。

CakePHPハンズオンのサポータ募集してまーす。

「CakePHPによる実践Webアプリケーション開発」が出ます

<!– more –>Amazonにupされていたので、もう告知してもいいかな。

3/26(木)3/31(Amazonでは4/8になってますね)に発売される「CakePHPによる実践Webアプリケーション開発」という本を企画&共著しました。

内容は入門的な内容はほとんどなく、淡々とサンプルアプリケーション(サイボウズ的なスケジュール表)を作っていくというものです。

今までCakePHPではこの手の本がなかったので、1冊ぐらいあっても良いかな?ということで。皆様、手にとって・・・というかぜひ買ってください!:cry:

CakePHP1.2stableをベースとした最初の書籍となる・・・・なんて書いたのですが、なんとその2週間ぐらい前の14日に、秀和システムさんから題名も良く似た「CakePHPによるWebアプリケーション開発」という本も出るようです(こちらはAmazonに登録がないので、実体はよくわかりません)。うーん執筆中に他の本の状況はわからないですからねー。

CakePHPハンズオン@Tokyo#2が実施されました。

<!– more –>CakePHPハンズオン@Tokyo#2にサポーターとして参加してきました。

えーXAMPP方面でいくらかヘルプできたかな?と。

後は皆さん以外とスムーズに進んでいたようで、感心が高く事前に予習している感がありました。すごーい。

反省としては、あんまり本のCMができなかったことでしょうか:ko:

来週九州でCakePHP勉強会があるので、共著の皆様に宣伝をお願いする事にします・・・

CakePHP1.2.1.8004 で AuthコンポーネントとScaffoldを併用する際の注意事項

<!– more –>先日セキュリティアップデートとして、1.2.0から1.2.1に更新されたのは、皆さんご存知のことと思います。

で、昨日やっとこさ1.2.1を使い始めたら、なんとAuthでログインしてなくてもscaffoldのアクションが動いちゃうじゃないですか!!。これはまずい。。

なお肝心のセキュリティアップデートは、CakePHP 1.2.1.8004へアップデート推奨からリンクされている「Changeset 7979」の差分のようなので、今回の回避策を使っても、問題なさそうだと判断しています。まぁscaffold使ってなければ関係ないのですけどね。

で、問題の箇所はAuthComponent::startup()で

$isErrorOrTests = (
    strtolower($controller->name) == 'cakeerror' ||
    (strtolower($controller->name) == 'tests' && Configure::read() > 0) ||
    !in_array($controller->params['action'], $controller->methods)
);
if ($isErrorOrTests) {
    return true;
}

という箇所があるのですが、

!in_array($controller->params['action'], $controller->methods)

というコードの「$controller->methods」にはscaffoldのアクションが含まれていないんですよね。なんでコントローラにそんなメソッドないよエラーページに遷移しようとして、ログイン画面には遷移しないんですが、ほんとのところはscaffoldに遷移して、一覧・追加・変更・削除ができちゃうというトホホな感じです。

なのでscaffoldをAuthのログイン傘下で使っている人は、Authから$controller->methodsに含まれているかどうかチェックは外してしまいましょう。

これから本家のTracにチケットを書くとします。。。

その後、あっさり本家から「Bakeしてね」とやんわり修正を断られてしまったので、Auth使う人はscaffold使わないか、$controller->methodsにbeforeFilterでscaffoldAction追加するとか(たぶんこれは良くないけど)、Authを継承して変えちゃう(startupの前でscaffoldActionをarray_mergeして、戻ってきたら元の値に戻せば・・・まぁ、どうか?というのもありますけど)とか、まぁいろいろ策はあるかな?と思います。

PS: この、$controller->methodsですが、どこで使ってんの?と調べてみたら、dispatcherとauthだけでした。dispatcherは当然として、なんでauthが!??という不思議な感は否めないのですが、こればっかりは仕方ないですね。今後使うところ増えるかもしれないし。