2008年08月28日

翻訳ありがとうございます。(book.cakephp.org/ja)

http://book.cakephp.org/ja
今日のRSSを見たところ、
nuto さんと bobchinさんによって翻訳が着実に進んでいるようです。
この数ヶ月、他の方も翻訳に参加しておられると思います。
いろいろな人の協力でこの“本”が読みやすくなっていますね〜。
どうもありがとうございます。

もう、紙の書籍を購入しなくてもよい時代がそこまで…。
posted by SDozono at 10:36| 東京 🌁| Comment(0) | TrackBack(1) | CakePHP Tips | このブログの読者になる | 更新情報をチェックする

2008年05月30日

うーん。

みなさんはこれをどう評価します?

Google Trends - Trend history in Japan

trend2008.PNG



ラベル:cakephp
posted by SDozono at 14:56| 東京 🌁| Comment(0) | TrackBack(0) | CakePHP Tips | このブログの読者になる | 更新情報をチェックする

2008年05月26日

Ticket大片付け

あんなに山ほどあったTicketがみんな片付いている!

https://trac.cakephp.org/report/1

お疲れ様です。
ラベル:cakephp
posted by SDozono at 13:57| 東京 ☀| Comment(0) | TrackBack(0) | CakePHP Tips | このブログの読者になる | 更新情報をチェックする

2008年05月25日

DBマイグレーションか、DBスキーマシステムか

CakePHPのメーリングリストで熱い議論がかわされていたので参考まで。

Is migrations support planned for Cake?
http://groups.google.com.ar/group/cake-php/browse_thread/thread/1bde4426444fda5c/

ちなみに、下記のブログで言及されていたので知りました。
Juanfgs’s Blog
Rails Migrations vs CakePHP Schemas
http://juanfgs.wordpress.com/2008/05/23/rails-migrations-vs-cakephp-schemas/

migrationあたりの経緯を書いておくと、

1)まず、CakePHPには最初migrationのようなものが標準では存在しなかった。
2)Joelmossが個人プロジェクトとして、PHPマイグレーションを作り始めた。
(CakePHP migration)
3)しかし、YAMLを使用。PEARに依存、などの仕様のため、CakePHPのコア開発チームからは非公認のままだった。
4)CakePHP 1.2 で schemaタスクが開発される。
5)Joelmossのmigrationが、YAML以外にも、PHP配列でのデータ形式に対応、PEARに非依存にする作業中。

(今、このあたり。)

というところです。で、このMLでは、"マイグレーションとスキーマシステム、どっちがいいの?"という議論が交わされています。

Dr. Tarique Sani(CheeseCakeプロジェクト主宰)は、「それはオレンジとリンゴを比べているようなもので、コンセプト自体が違うということでいいんじゃないか」と言ってまとめようとしています。

簡単に言うと、

migration: 変更情報を差分として記録してゆく
schema: その時点でのDB構造のスナップショットを記録してゆく

というもので、migrationが嫌い(schema万歳)派の、「DB構造を変えるたびにいちいちコードを書くのが面倒だ」という意見も分からないでもないです。特にphpMyAdminを使っている場合などは、DBの変更が快適にできてしまいますからね。phpMyAdminが変更履歴一覧みたいなものを出力してくれてもいいかもですね。

ちなみに私は今のところ、SQLyogのエンタープライズ版で満足してしまっています。

www.webyog.com

Structure Synchronization toolが便利すぎなんですよ。phpMyAdminと組み合わせると、違うホストのDB構造を数クリックでシンクロナイズできます。データのシンクロナイズも“おそらく”うまくゆくと思います。しばらく前まではPHPのトンネル用ファイルに手を加えていましたが。
このツール、最初の頃は多言語対応化について結構、口を出したり開発にちゃちゃを入れたりしていたんですが、そのうち、使える機能だけ使えばいいか、という気になって、そういう使い方をしているツールです。日本語では100%の動作を期待しなくてもいい、という人は便利に使えると思います。
ラベル:cakephp SCHEMA migration
posted by SDozono at 10:23| 東京 ☔| Comment(0) | TrackBack(1) | CakePHP Tips | このブログの読者になる | 更新情報をチェックする

2008年05月19日

wildflower

お、これはいいかも。

Wildflower - CakePHP CMS
Content management system and application platform build on CakePHP framework and jQuery Javascript library.
http://wf.klevo.sk/


とりあえずダウンロードしてコードを見ただけですが、単なるたたき台としてではなく、実際に使えるコードがいろいろ入っているみたいです。
ラベル:cakephp CMS
posted by SDozono at 10:22| 東京 🌁| Comment(4) | TrackBack(0) | CakePHP Tips | このブログの読者になる | 更新情報をチェックする

2008年05月16日

CakePHPでRESTful

CakePHP 1.1でのRESTfulは下記に記事がありました。

RESTful Web Services With CakePHP
http://bakery.cakephp.org/articles/view/150

今回、1.2のRouterでRESTを扱う方法が、php|architect's C7Yに投稿されています。

REST and Resource Handling with CakePHP
by Nate Abele (2008-05-14)
http://c7y.phparch.com/c/entry/1/art,cakephp-rest

ちなみに、現在のCakePHPリードデベロッパーによる執筆です。

https://trac.cakephp.org/timeline
を見ると分かりますが、今は、みんなが「よってたかって」1.2のリリースのためにがしがしとTicketを整理中です。

私はというと、自分の仕事をがしがしとこなしています。
Cakeを使うほうで手一杯になってしまっていますが、本当は book.cakephp.org の訳を進めるのが自分の役割かなぁとも思っています。ただ、量がずいぶんありますので、われこそはと思う日本語ユーザは、book.cakephp.orgの翻訳で貢献してください!!
posted by SDozono at 10:15| 東京 🌁| Comment(0) | TrackBack(0) | CakePHP Tips | このブログの読者になる | 更新情報をチェックする

2008年02月26日

CakePHP1.2の簡単国際化

CakePHP1.2のbakeで自動生成した画面は、画面に表示される文字列が__('文字列') で囲まれています。これは、簡単に多言語翻訳ができるように配慮されているからです。

ここを無理やり日本語に書き換えても日本語化はできますが、せっかくなので、最初から国際化をにらんで、poファイルを生成、編集して日本語化を進めてもよいのではないか、と思います。

CakePHP1.2はgettextを使用した翻訳と流れは同じです。
http://ja.wikipedia.org/wiki/Gettext

(1)アプリで使用する文字リソース(メッセージ類)は、__('')で囲む

 こうしておくと、自動的に翻訳ファイルを作ってくれるのでこのルールは守りましょう。ちなみに、中のメッセージは英語で作り続けるのがよいと思います。

 *追記* 値を代入するような場合には、
$message = __('Message test!', true);
echo __('testtest', true);
などとできます。 

(2)consoleから、翻訳リソースファイルを作成

consoleフォルダに降りて、
> cake i18n
を実行します。

Welcome to CakePHP v1.2.0.6311 beta Console
---------------------------------------------------------------
What is the full path you would like to extract?
Example: C:\Program Files\xampp\htdocs\cake12\myapp
[Q]uit
[Q] >

と表示されるので、自分のアプリケーションのパスを指定しましょう。

[Q] > C:\Program Files\xampp\htdocs\アプリフォルダ
What is the full path you would like to output?
Example: C:\Program Files\xampp\htdocs\アプリフォルダ\locale
[Q]uit
[C:\Program Files\xampp\htdocs\アプリフォルダ\locale] >
I18n Shell
---------------------------------------------------------------
[E]xtract POT file from sources
[I]nitialize i18n database table
[H]elp
[Q]uit
What would you like to do? (E/I/H/Q)
>

ここで、Eを選択すると、Cakeが自分でプロジェクトファイルを調べまわって、翻訳リスト一覧を作成します。localeフォルダの中にある、default.pot ファイルはテキストファイルなので、適当に中身を見てみましょう。文章で書くと面倒そうですが、案外、短い時間でできあがってしまいます。

(3)日本語リソースフォルダの作成

\locale\jpn\LC_MESSAGES というフォルダを作成し、(2)で生成されたファイルを、"default.po"という名前にしてコピーします。

(4)翻訳

Windows上であれば、poeditが良いのではないか、と思います。

Poedit is cross-platform gettext catalogs (.po files) editor.
http://www.poedit.net/

翻訳メモリもついた、かしこい?翻訳リソース専用エディタです。[カタログ]⇒[設定]から、この翻訳ファイルに関する情報を追加できますが、その際、[複数形:]というところを、
nplurals=1; plural=0;
としておきましょう。
あとは、リソースを適当に訳してみます。

(5)ブラウザで確認。

適当に訳したところで、poファイルを上書き保存します。できたところで、自分のCakePHPアプリケーションを動かしてみましょう。勝手に日本語化されています。これは、HTTP_ACCEPT_LANGUAGEの値を見て、自動で切り替えているからです。

じゃあ、この設定を自分で決めたい場合にはどうするか、というと、どこかの beforeFilter() などに、

Configure::write('Config.language',"en");

と書いておくと、強制的に言語を指定できます。

ちなみに、新しい文字列をページに追加した場合には、(2)をもう一度実行すると、最新のpotファイルが作られます。それから、poeditの[カタログ]⇒[POTファイルを元に更新します]を選択し、新しくできた“potファイル”を指定すると、新しく加わった文字列を自動的に、今あるpoファイルに取り込んでくれます。

※国際化文字列をDBに保存したい、という場合には、
pm11op のブログ
cake_1.2 pre-beta での多言語対応のメモ
とか、
GoogleGroup
i18n translation in db tables - how to do this like Symfony?
などが良いのではないか、と思います。

このあたり、1.2からは本格的な国際化アプリケーションが作りやすくなっていると思います。現状Akelosは、「まぁPHPだから配列ベースの翻訳ファイルでいいか」と妥協している(?)んですが、Cakeは、poファイルでの翻訳リソースになっているので、各種の外部ツールを使ったり、逆にPHP以外のプロジェクトからの言語データファイルの流用がしやすくなっているのではないでしょうか。
ラベル:i18n cakephp
posted by SDozono at 21:01| 東京 ☁| Comment(1) | TrackBack(6) | CakePHP Tips | このブログの読者になる | 更新情報をチェックする

2008年01月16日

[1.2]Easy Bake on Windows

*Now, as the easiest way, you can specify the project path with -app!!*
*>cake bake -app project "app" path.*

In English:
Easy Bake on Windows:
1. Open the cake's console folder with "Command Prompt".
2. Type SET PATH=%PATH%;%CD%
This will add the console path temporarily only in the window.
3. Just type PATH(enter) and check the registered path info.
4. Type CD ../../
and return to the home directory of the cake.
5. Type md ProjectName (or use Explorer) to make a project folder.
6. Type cd ProjectName、and go into the directory.
7. Type cake bake

Cake1.2を使えそうな大型案件の前に、1.2に本腰をいれようかと思っています。

1.2からは、bakeはconsoleのひとつという位置づけとなり、少し動作が変更されています。より“フクザツ”なことができるようになりましたが、1.1の簡単スタートよりはちょっと面倒になったかもしれません。機能向上に付き、このあたりは仕方のない点でしょうか。

*[追記]現在、-appで出力させるプロジェクトの“app”ディレクトリを指定できるようになっています。下記も使えますが、こちらのほうがもっと簡単です。*
*>cake bake -app "appに相当する(app_controller.phpやapp_model.phpの入る)フォルダを指定"で開始できます。*

1.2の場合、appフォルダ以外の場所にプロジェクト名をつけてbakeできるようになっています。そのためには、
>cake bake
として、“カレントディレクトリ”にデータを生成させるため、cake.batのパスが通っていないといけません。

ところが、今回の場合はWindows上での単なるテストなので、環境変数にこのパスを登録するのはおっくうです。そもそも、Cakeの新バージョンがリリースされるたびに別フォルダに展開しているので、そのCakeごとのすべてのconsoleフォルダをパスに登録するなんて面倒です。それにどのフォルダの cake.bat を使うことになるんでしょうか。考えただけでもこんがらかりそうです。あと、bakeを使うのは、開発の本当に初期の段階だけです。

php.exe をPATH登録するのは納得できますが、cliスクリプトのフォルダにPATHを通せと言われても…。

このパスの設定って、なんかDOSのコマンドで便利なやり方があったはずだよなぁ…と、MS-DOS3.3C世代の人間なので考えてしまいました。

で、簡単な方法です。

bakeスクリプトをそんなに使わないので、毎回使用時に、PATHに一時的に設定できればよい。c:\Program Files\xampp\htdocs\cake ...みたいなタイプはしたくない、という人は使える技かもしれません。

Windowsで簡単にbake
(1) consoleフォルダをコマンドプロンプトで開く
  (開き方は自分で調べましょう。)
(2) SET PATH=%PATH%;%CD%
  と打ち込む。すると、そのコマンドプロンプトのウィンドウ上だけ、consoleフォルダのパスが追加されます。(%CD%は、カレントディレクトリ、という意味です。)
(3) 単に、PATH(Enter)と入れてみて、実際に登録されたかどうか、確認してみましょう。
(4) CD ../../
で、cakeの親フォルダに戻る
(5) md "プロジェクトファイル名"で、適当なプロジェクト名を作る。
このあたり、エクスプローラでフォルダを作成してもよいと思います。
(6) cd "プロジェクトファイル名"で、そのディレクトリに入る。
(7) あとは、cake bake で始まります。パラメータを駆使すれば、もっといろいろできるでしょう。

パラメータは下記を参考にできます:
cakebaker:Faster baking with bake

もっと簡単な方法があったら、教えてください。
posted by SDozono at 14:11| 東京 ☀| Comment(2) | TrackBack(3) | CakePHP Tips | このブログの読者になる | 更新情報をチェックする

2007年11月13日

RewriteCond %{REQUEST_URI} !\.(cgi|css|gif|jp?g|png)$

app/webroot/.htaccessの中に、

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !\.(cgi|css|gif|jp?g|png)$ *added*
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

って標準で入っていてもいいくらいですよね。Ticketを出してよい内容だと思います!

下記から引用:
WEBぷろぐらま〜 システム開発エトセトラ
2007-11-09 cakePHPで変なアクセスがある!?
http://d.hatena.ne.jp/takuya15/20071109/1194576191
ラベル:cakephp framework tips
posted by SDozono at 09:42| 東京 ☀| Comment(0) | TrackBack(0) | CakePHP Tips | このブログの読者になる | 更新情報をチェックする

2007年11月02日

「今度のサイトはCakePHPで構築して」と頼む利点10

「今度のサイトはCakePHPを使って構築してください」と制作会社に頼むと、できあがるサイトは、

1. (少しの修正、またはそのままで)PHP4のサーバでもPHP5のサーバでも動く。既存サーバでも、新規サーバでもOK。多くの顧客に配布するWebアプリケーションであっても、PHPが動くならたいていの客先で動作可能。開発者も「そのサーバはPHP5ですか?」と確認する必要がない。PHP5であればベターです。しかし、確認したらPHP4だった、という場合でもうろたえることはないでしょう。
2. データベースをMySQLで作っておいて、あとからPostgreSQLにしたり、Oracleにしたりできる。
3. 将来的な不可分散に対応可能。大規模サイトに発展してもそのままいけるはず。
4. デザインの変更に強い。デザインはテンプレートを作り変えるような感覚で作業できるでしょう。
5. 「スピード、もうちょっと速くならない?」とわがままを言っても、たぶん何とかしてくれるはず。(最適化の方法がいろいろある。)
6. あとから人(デザイナー、プログラマ)を増やしても、共同作業が楽。(ファイルが分かれているので分業しやすい。)
7. 開発者のやる気を引き出せる。(たぶん。PHP嫌いな人はしょうがないですけど。)
8. システムの仕様変更に強い。「〜を〜に変更してください」というような要望にも、素のPHPで書いてあるより、作業しやすい(はず)。あとからAjax化することも、それほどの大作業にはなりません。
9. 国際サービスにしたかったら、CakePHPの分かる技術者を海外からも調達できる。今のところ、Zend Frameworkの分かる技術者を探すよりも楽なはず。英語の技術情報のほうが、日本語より多くあります。
10. “ある程度”のセキュリティを確保できる。究極的には各技術者のレベルに左右されますが、安全面の大枠はクリアできるはず。

まぁ、CakePHP以外のフレームワークを使用しても、かなりの点があてはまると思いますが…。とりあえず、2008年には、“サイト開発”でフレームワークを使用するのが当たり前になるのではないでしょうか。PHPでサイトを構築しようとお考えであれば、ご一考を。
posted by SDozono at 17:09| 東京 ☁| Comment(0) | TrackBack(0) | CakePHP Tips | このブログの読者になる | 更新情報をチェックする

2007年09月22日

Quick Hack to change CakePHP to use object-based models

One of the CakePHP user in Japan wrote an interesting article.

Happy EngineerLife
"Use models of CakePHP as entities"

It explains how to change (or add) a CakePHP's model a "data object".

He added some functions to App_Model and App_Controller and make possible to write this code.


========================================
class ItemsController extends AppController
{
var $name = 'Items';

function index($id) {
$entity = $this->createEntity('Item', $this->Item->read(null, $id));
$this->set('item', $entity);
}
}
========================================


and then you can write your views in this way.

==============================================
//instead of "echo $item['Item']['price'];"
echo $item->g('price'); (or, echo $item->get('price'))
//You can calculate dynamically with Model values.
echo $item->taxOnPrice();
//You can set a value from View.
echo $item->s('price', 5000);
==============================================

posted by SDozono at 14:11| 東京 ☀| Comment(0) | TrackBack(0) | CakePHP Tips | このブログの読者になる | 更新情報をチェックする

2007年09月21日

CakePHP tutorials at www.scribd.com











ラベル:cakephp tutorials
posted by SDozono at 10:34| 東京 ☀| Comment(0) | TrackBack(0) | CakePHP Tips | このブログの読者になる | 更新情報をチェックする

2007年09月20日

Sorting Model data with usort()

For example, if you want to achive like this:


Controller -------------------
$data1 = $this->Reservation->findAll();
$data2 = $this->AdditionalReservation->findAll();

//If needed, change $data2's array name
"AdditionalReservation" to "Reservation". Then,

$data = array_merge($data1, $data2);

$data = $this->Reservation->sortbytime($data);
$this->set("reservations", $data);
------------------------------

You can use this technique.

Model ------------------------
function myCmp($array1, $array2)
{
$time1 = strtotime($array1['Reservation']['rsv_time']);
$time2 = strtotime($array2['Reservation']['rsv_time']);
if($time1 == $time2){
return 0;
}
return ($time1 > $time2)? 1 : -1;
}

function sortbytime($data)
{
usort($data, array("Reservation", "myCmp"));
return $data;
}
------------------------------
ラベル:tips cakephp Model
posted by SDozono at 11:44| 東京 ☀| Comment(0) | TrackBack(0) | CakePHP Tips | このブログの読者になる | 更新情報をチェックする

2007年09月16日

ついに1.2マニュアルが登場

ついに、1.2マニュアルのプレビューが登場しました。
http://tempdocs.cakephp.org/

訂正:まだ、レビュー前の未公開ドキュメントだったそうです。

記事:
cakebaker
First version of the CakePHP 1.2 manual online

1.2の新機能などについて、これから詳しく追加されていくのではないか、と思います。

ちなみに、現在の日本語マニュアルは1.1用で、こちらにあります。
http://cakephp.jp/doc/

[追記]
あれ〜っ、これは読めるなぁ。
https://cakeforge.org/plugins/scmsvn/viewcvs.php/?root=cakedocs
posted by SDozono at 23:01| 東京 ☀| Comment(0) | TrackBack(0) | CakePHP Tips | このブログの読者になる | 更新情報をチェックする

2007年09月11日

PDT(Eclipse)+xdebug

ちょっと苦労しましたが、Eclipse PDTとxdebugを組み合わせて、cakephpのデバッグ環境を作れたみたいです。これから実際に使い始めるわけですが…。

以前、ほかのEclipseプロジェクトを試した時には、どうしてこんなに遅いんだろうという感触で使う気にもならなかったのですが、今回、入れてみたところ、思ったより速かったので驚きました。PDTだからなのか、それともマシンのスピードによるのか。起動時のみ待たされますが、その後はわりとさくさく動きます。

Zend Debuggerを最初に入れたのですが、mod_rewriteをOFFの設定にしないとうまく動きませんでした。MLでもmod_rewriteは使えない、という意見がありました。xdebugならうまくいきます。

Debugging Cake app via DBG or Zend Debugger
debugging methods with cakePHP

xdebugに変更したところ、mod_rewriteそのままでうまく動くようになりました。(設定がおかしいと、breakpointがうまく動きません。)

しばらく使い勝手を試してみようと思います。なお、画面は、最新の decorate.php で焼いてみたところです。コマンドラインでテーブルを指定するだけで、ソート機能、検索(サーチ)機能、ページングのついたDBテーブル編集画面のMVCファイルが自動生成されます。ついでに、今回から、セキュリティコンポーネントもデフォルトで使うようにしました。トークン形式のCSRF対策もできています。

PDT+XDEBUG.PNG

PDT
http://www.eclipse.org/pdt/
"The PDT project is working towards providing a PHP Development Tools framework for the Eclipse platform."

xdebug
http://www.xdebug.org/
The Xdebug extension helps you debugging your script by providing a lot of valuable debug information.

Prebuilt Binary of XDebug Support
から、現在有効なバイナリを取ってきて、PDTに入れる。
https://bugs.eclipse.org/bugs/show_bug.cgi?id=169408
ラベル:PDT xdebug cakephp
posted by SDozono at 13:33| 東京 🌁| Comment(0) | TrackBack(3) | CakePHP Tips | このブログの読者になる | 更新情報をチェックする

2007年08月07日

invalidateの使い方

実は下記のスレッドには非常に重要なことが書いてあります。
1.1系でも、コントローラ内で複雑なバリデーションをかける機能が標準で組み込まれているという話です。

Problems with simple invalidate test
http://groups.google.com/group/cake-php/browse_thread/thread/354a677b21779c0/

通常、bake.php や decorate.php などを使ってデータを出力すると、下記のようなコードが生成されます。


function add() {
    //もしデータがPOSTされていない=一回目なら
    if (empty($this->data)) {
        //入力画面を出力
        $this->render();
    } else {
        //データがPOSTされているなら、
        //日付データの連結処理をする“まとめ”関数
        $this->cleanUpFields();
        //$this->dataの内容を保存
        if ($this->Category->save($this->data)) {
            $this->Session->setFlash('The Category has been saved');
            $this->redirect('/categories/index');
        } else {
            //バリデーションに失敗したのでエラーを出力。修正を促す
            $this->Session->setFlash('Please correct errors below.');
        }
    }
}



しかしこれを、

function add() {
    //もしデータがPOSTされていない=一回目なら
    if (empty($this->data)) {
        //入力画面を出力
        $this->render();
    } else {
        //データがPOSTされているなら、
        //日付データの連結処理をする“まとめ”関数
        $this->cleanUpFields();
    
        //データを移動 *ここがポイント*
        $this->Category->set($this->data);
        //データをチェックして必要であれば、条件で下記のようなエラーを発生させる。
        $this->Category->invalidate("name");
        $this->Category->invalidate("ビューのtagErrorMsg()に設定する値");

        //$this->dataの内容を保存
        if ($this->Category->save()) { //*注意*
            $this->Session->setFlash('The Category has been saved');
            $this->redirect('/categories/index');
        } else {
            //バリデーションに失敗したのでエラーを出力。修正を促す
            $this->Session->setFlash('Please correct errors below.');
        }
    }
}



と書き直すと、複数フィールドをまたいだバリデーション処理や、ひとつのフィールドに複数のバリデーションルールを適用することができます。

ちなみに、これまで
$this->data['Category']['name']
などとして操作していたデータは、$this->Category->set($this->data)後は、
$this->Category->data['Category']['name']
という形でのアクセスになります。
posted by SDozono at 21:23| 東京 ☁| Comment(0) | TrackBack(0) | CakePHP Tips | このブログの読者になる | 更新情報をチェックする

2007年06月29日

redirect()で困ったら〜"Don't redirect directly!"

ログイン認証まわりでつまずいている方が多いようなので、参考情報を書いておきます……。

Cakeには、

「すべてのアクションの前には、親玉app_controller.php の "beforeFilter"が呼ばれる」

というルールがあります。


[追記:各コントローラにbeforeFilterを独自に設定してしまえば、parent::beforeFilter();としないかぎり、app_controller.phpのbeforeFilter()は呼ばれませんね。「すべてのアクションの前には、“コントローラで独自にbeforeFilterを設定していなければ”、親玉app_controller.phpのbeforeFilterが呼ばれる。独自設定していれば、各コントローラの独自beforeFilterが呼ばれる。独自にbeforeFilterを設定していて、それでも親app_controller.phpのbeforeFilterを呼び出したい、という場合には parent::beforeFilter()とする」としたほうが、正確ですネ。]

別のフレームワークでは、アクションチェインなどというのに似ているでしょうか。なので、ここでログインしているかどうかをチェックすれば、門番として立派な役目を果たすと期待できます。

ただ問題はここからです。

1)ログインしていないことが判明
2)ログイン画面へ飛ばす

というこの簡単な流れをだれでも考えますが、1)のアクションで app_controller.phpのbeforeFilter() を通ったあと、単純に 2)に $this->redirect('ログイン画面用アクション')として飛ばしてしまうと、CPU100%になったり、Firefoxに、“リダイレクトがおかしい”と言われて止まったりしてしまいます。

なぜなら、2)に入った時点でも、「もう一度、app_controller.php のbeforeFilter()が呼ばれる」からです。

つまりは何も考えずにコーディングしてしまうと、app_controller.phpのbeforeFilter() から、app_controler.phpのbeforeFilter()へ、同じところをぐるぐると回るだけになってしまいます。

このあたりを解決するには幾つかの方法があります。

(1)そもそも$this->redirectを使わない
  例えば、$this->layout = "login.thtml"なととして、レイアウトを変更してしまうというアイデアです。

いちばん簡単な認証システム
http://cakephp.seesaa.net/article/20317502.html

(2)DBやセッションに、“今、ログイン作業をはじめたよ”と情報を書き込んでおき、その場合にはリダイレクトしない。(この方法だと、3回ログインに失敗したらアウト、などの処理もできます。)

othauth
http://bakery.cakephp.org/tags/view/othauth
☆このコンポーネントがいまのところ、一番、最先端をいっているコンポーネントです。ただbeforeFilter内に置いて設定するだけで、あとはよしなに取り計らってくれます。

YACCA Yet Another Cake Component for Auth
http://bakery.cakephp.org/articles/view/yacca-yet-another-cake-component-for-auth

(3)今現在、ログインアクション中ならば、リダイレクトしない

if($this->action != 'login' && $this->action != 'logout')

でチェックしています。

http://bakery.cakephp.org/articles/view/simple-form-authentication-in-1-2-x-x

では、bakery.cakephp.org自体のソースコードはどうなっているんだろう、と見てみると、(1)から(3)には該当していませんでした。(4)番目の方法です。

(4)user_controller(=ログインをチェックするコントローラ)内に自分がいるかどうかをチェックする


if(($action != null && $this->action === $action) || $this->action === 'edit' || ($this->action === 'add' && $this->params['controller'] != 'users')){


という仕方でチェックしていました。

いろいろありますね!
posted by SDozono at 11:27| 東京 🌁| Comment(0) | TrackBack(0) | CakePHP Tips | このブログの読者になる | 更新情報をチェックする

2007年06月21日

あのidex*ideaでもCakePHP開発記事がスタート

ネットビジネス情報ブログ『百式』さんの個人ブログ“IDEA*IDEA”でも、cakephpによる開発ブログがはじまっています。

CakePHPでSNSっぽいものを作ろうとして挫折するまでのコーディング日記
http://www.ideaxidea.com/archives/cakephp/

ものすごいスピードで記事が投稿されていますね。果たしてサイトは完成するでしょうか……。


とりあえず、CakePHPの概略を知りたい、という方は下記の記事をどうぞ。登録が必要ですが、すぐ見られます。

CakePHPフレームワークによる快速WEB開発
http://codezine.jp/a/article/aid/670.aspx
CakePHP内の処理を理解する
http://codezine.jp/a/article/aid/768.aspx
ラベル:cakephp PHP
posted by SDozono at 11:54| 東京 ☀| Comment(0) | TrackBack(1) | CakePHP Tips | このブログの読者になる | 更新情報をチェックする

2007年03月28日

decorateは常時提案募集中

decorate.php は bake.phpの拡張で、「テーブルデータから、ページネーション、検索、ソート機能のついたWEBインターフェイスを自動生成する」ツールです。

decorate - advanced bake.php for 1.1
http://cakeforge.org/projects/decorate/

そしてまた、「データベースの指定だけで、数百のテーブルがあったとしてもボタン一発で編集WEB画面を作り出す」という、MasterBakeプロジェクトにもコードが使われています。(なんでもこの作者、数百のテーブルをこれで管理しているらしいです。)

MasterBake - extending bake.php
Jeffrey Gilbert
http://cakeforge.org/projects/autobakery/

かおるんさんのこちらの記事にコメントできなかった(403 Forbiddenと出る)のでトラックバックでお返事しておきます。

PHPのテクメモ
http://php.atseason.com/?eid=490851
decorate.phpおかしくないか?


今手元にあるdecorate.php(Revision:4597、lastmodified:2007/3/7)、データベースの接頭文字列を指定してあるとうまく動いてくれなかった。追試はしていないけれど、バグっぽい。ソースを少しだけ眺めたけど・・・、じっくり見ないとやっぱりわからない。

そうなんです。bake.phpで試してもらえると分かりますが、bakeクラスのインターフェイスが改良された時に入ったバグのようです。
decorateクラスはbakeクラスから派生させているので、bakeクラスという親ガメにバグがあると、"子ガメも"こけてしまいます。しかしこの問題は、下記のTicketで修正され、bake.php rev4669で修正されています。

https://trac.cakephp.org/ticket/2253
それに合わせて、decorate.php 1.1.13.4669.2 をUpしてありますので使ってみてください。


decorate.phpは非常に便利だが、今回、自動生成したスクリプトを覗いてみて、少しイマイチだった

これももしかすると bakeクラスについてですかネ。
提案常時募集中ですのでよろしくお願いします!

当初はbakeクラスを編集していたのですが、Updateするたびに変更するのが大変だったので、decorateクラスをbakeクラスから派生させて、差分だけを書くようにしています。decorateクラスはわりと編集しやすいように書いている(タブの処理など)ので、どしどし変更してみてください。よろしくお願いします。
ラベル:cakephp decorate
posted by SDozono at 11:03| 東京 ☀| Comment(2) | TrackBack(0) | CakePHP Tips | このブログの読者になる | 更新情報をチェックする

2007年01月25日

Do you want to read the missing Wiki?

There are many who want to read the closed wiki pages of CakePHP again.
It's already closed. And some documents became too old to use.
Still, some think that we missed some knowledge about CakePHP....

You can access the historical Wiki even now!
Good news?

go to:
http://web.archive.org/web/20060424173814/http://wiki.cakephp.org/

Then you'll found some pages.
Thanks to the web.archive.org!
You can check the all pages from a URL below.
http://web.archive.org/web/*sa_/http://wiki.cakephp.org
ラベル:wiki cakephp ARCHIVE
posted by SDozono at 20:56| 東京 ☀| Comment(0) | TrackBack(0) | CakePHP Tips | このブログの読者になる | 更新情報をチェックする