2006年07月31日

bake:adding "confirm" step

If you need to add "confirm" step in your cakephp script, you can try this:

http://www12.atwiki.jp/nezox/pages/6.html

CakePHPまとめ@Wiki を始めた方がいらっしゃるようです。
参考になりますね。

POST で判別して、

if(@$_POST['mode']=='confirm')
{
if(!$this->Login->validates($this->params['data']))
{
$this->render();
}
else
{
$this->set('form', $this->params['form']);
$this->set('data', $this->params['data']);
$this->render("confirm");
}
}
とするのがミソです。
ラベル:bake PHP cakephp controller
posted by SDozono at 10:02| ロサンゼルス ☁| Comment(0) | TrackBack(0) | CakePHP Controller | このブログの読者になる | 更新情報をチェックする

2006年07月30日

dojotoolkit

CakePHP と dojo を組み合わせて使おうとしている方がいるようです。
その場合には、default.thtml などで、すべての javascript ファイルを読み込んでおきましょう、という話です。

http://groups.google.com/group/cake-php/browse_thread/thread/f7a42ab0422fb765/

で、dojo というのは、
http://dojotoolkit.org/
“JavaScript ツールキット”というもので、
http://manual.dojotoolkit.org/WikiHome/DojoDotBook/Book2
このあたりに詳しい説明があります。

デモとして置いてあるものには下記のようなものがあります。
多岐にわたりますね。

Mail  メイラーサンプル
Moxie  エディタサンプル
Effects 各種効果サンプル

DragDrop ドラッグ&ドロップ類
JSON-RPC Client
Layout
Accordion
ContentPane
Dialog
LayoutContainer
SplitContainer
TabContainer
TitlePane
Windows
Wizard

FormTour
Editor
Checkbox
CiviCrmDateTimePicker (きれいなカレンダー)
ColorPalette
ComboBox
DatePicker
Dialog
TimePicker
Validation

Tree
Button
Menu
Fisheye(OSXのようなメニュー)
InlineEditBox
SortableTable
Chart(SVGの表)
Tooltip
SlideShow
GoogleMap
YahooMap

posted by SDozono at 09:53| ロサンゼルス ☁| Comment(2) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2006年07月29日

ドイツ語による CakePHP ブログ

ドイツ語での CakePHP に関する情報ブログがはじまりました。
複数で書いていくようです。

http://cakebakery.de/
germanblog.PNG

PHP関係では、ドイツ語の情報も結構速いですね。
posted by SDozono at 15:45| ロサンゼルス ☁| Comment(0) | TrackBack(0) | CakePHP General | このブログの読者になる | 更新情報をチェックする

2006年07月28日

ディレクトリ構造2(つぼを知る)

Wikipedia によると、ツボ(経穴)とは、『ツボと呼ばれ、「気と血」のエネルギーの通り道である経絡上に点在し、その経絡をつなぐ点のことである。鍼灸で施術することにより様々な作用を表わす』ものだそうです。フレームワークというのは、“プログラミングにツボを作る”システム、と言ってもいいかもしれません。

ある1箇所を調整するだけで、「全体に影響」を与えることができます。ですから、どこを調整するとどんな変化が起こるのか、その全体像をつかむことが大切です。

まず、CakePHP Framework には基本となる二つのディレクトリとして、

Cake: フレームワーク自体が入っているフォルダ
app: 自分のプロジェクトを入れるフォルダ

という二つがあります。そして重要なこととして、「この二つのフォルダ内の構成はかなり似ている」ということです。どういうことかというと、もし、Cakeフォルダ(フレームワーク本来の)コードを書き換えたい、修正したいと思った場合には、

「該当するファイルを Cake フォルダから App フォルダにコピーし、そのコピーしたものを自分用に修正してしまう」

という手法が使えるということです。Cakeは、同じ名前のファイルが app フォルダにあることに気がつくと、そちらのほうを実行します。

Cake フォルダ自体には手をふれずにすみますので、Cake の最新版が出た場合には、単に Cake フォルダだけを上書きするだけでよいかもしれません。
(テストは必要ですが。)誤って、せっかく自分の書いたコードを上書きしてしまった、という状況をなくすことができます。

もうひとつの“ツボ”アプローチは、“クラスの階層図”という観点から理解を深めることです。

Cake のすべてのクラスは、object クラス(libs\object.php)から派生しています。つまり、このクラスがすべての親となっていますので、ここに何か機能を書き込むと、Cake内のありとあらゆるクラスが同じ機能を持つようになります。

現在、ここに書いてあるメソッドには、

toString() ……  クラス名を文字列で出力する
requestAction() …… コントローラのメソッドを呼ぶ
log() ……   ログを取る
cakeError() ……   エラー処理用

などがあります。これはどのCakePHPのクラスからでも呼べる基本的なメソッドです。

また、フレームワークの屋台骨となる、

AppController クラス(app_controller.php)
AppModel クラス(app_model.php)

があります。これらのファイルを cake フォルダから app フォルダ直下にコピーし、自分のメソッドを加えると、それぞれ、すべての“controller”クラス、また"model"クラスに同じ機能を追加することができます。

例えば、MYSQL 4.1 以上を利用している場合には、接続直後に、"SET NAMES テーブルの文字コード"という SQL を発行しないと、文字化けに見舞われることが多々あります。オープンソース開発であれば、自分の環境ではOKだからなにもしないというのではなく、「だれの環境でも動くように意識した開発」が大切なので、環境に応じてこうしたコードを実行するようにしておくなどの、気配りは大切かもしれません。

AppModel 内に一度、このSQLを発行するコードを書いておくと、あとは model クラスを新たに作るたびに親の性質を受け継いでいますので、子どもたちには何も手を加える必要がありません。

ということは、数百のファイルがある大きなプロジェクトであっても、一箇所を変更するだけで、アプリケーションのふるまいを変更できることになります。

これがどれだけの省力化とDRY(同じことを何度もしない!)に役立つかを体験すると、手放せなくなります……。

directories.PNG

 









posted by SDozono at 11:22| ロサンゼルス ☀| Comment(0) | TrackBack(0) | CakePHP Tips | このブログの読者になる | 更新情報をチェックする

2006年07月27日

ディレクトリ構造

従来型のPHPの開発では、ファイルの最初のところに、

1)
include_once "基本ファイル";
require_once "基本ファイル";

などとすることがほとんどでした。プロジェクトが大きくなればなるほど、読み込むべきファイルが増えてゆく、というパターンでした。

さて、プロジェクトが大きくなって、数百を超えるぐらいのファイル数になってきた場合はどうでしょうか。さすがにすべてに1)を追加してゆくのはたいへんなので、“include するファイルをinclude する”手法を使うようになるかもしれません。

2)
まずは、

-a.php ----------
include "1.php";
include "2.php";
include "3.php";
-----------------
として、

実際のファイルでは、

include_once "a.php";

とすれば、数百のファイルで include したとしても、a.php だけを変えればOK!どんなもんだい。

といいことばかりのように思えますが、今度は、“ファイルによって、読み込むphpを変えたい”とか、“あとから追加したいファイルは、1.php を読み込んでほしいが、3.php の前に読み込んでほしい”などの要求が往々にして出てくるものなんです。

本当ですよ。

例えば、これまでの開発では、デザイン部分もこういう中で読み込んでしまうことが多々ありました。ところが、HTML の出力を始めてしまうと、例えば、

header ("location:...."); // 〜のURLに処理をジャンプさせる。

という命令が使えなくなってしまいます。この命令を使いたい場合には、html の出力を始める“前に”、条件分岐をするなどして設定してやる必要があります。

このへんがからまってくると、どうにも手がつけられなくなってしまいます。

そこで、Cake Framework の登場です。
フレームワークを使うと、このあたりをどのように解決できるのでしょうか?

posted by SDozono at 10:53| ロサンゼルス 🌁| Comment(0) | TrackBack(0) | CakePHP General | このブログの読者になる | 更新情報をチェックする

2006年07月26日

CakePHPのビデオ・チュートリアル

cakephp.org には、screencasts という動画によるCakePHPの説明があります。
少し情報が古かったり、開発環境がかなり自分のものと違ったりしていて、すべて参考になるわけではありませんが、雰囲気はつかめるかもしれません。
IE Beta3 ではうまくcakephp.orgのサイトが表示されなかったりするので、
Internet Archive にある大元のデータへのリンクを掲載します。

archive.PNG

1)CakePHP ブログチュートリアル
http://www.archive.org/details/CakePHP_BlogTutorialJohn

2)CakePHP による Debugシステムhttp://www.archive.org/details/UsingDebugMessages

3)TortoiseSVN を使用したアプリケーションのSync
http://www.archive.org/details/SyncDevAppAndProductionApp

4)Bake の仕方
http://www.archive.org/details/CakePHP_BuildingtheBakery_Part1

posted by SDozono at 15:33| ロサンゼルス 🌁| Comment(0) | TrackBack(0) | CakePHP General | このブログの読者になる | 更新情報をチェックする

2006年07月25日

この数ヶ月で大躍進したCakePHP

オープンソースのプロジェクトは、コミュニティの力があれば、数ヶ月でかなりの改良が進む。

ためしにこちらを見てほしい。
https://trac.cakephp.org/report/6
tickets.PNG


さまざまな人から送られたバグ報告・機能追加・要望などだ。灰色になっている部分は考慮され、CakePHP に追加されたか、却下されたかして、処理が終了したものだ。

コミュニティが大きくなるということは、テスタとコンサルタントを無償で大量に雇っているようなものだ。

この要望・報告一覧システムも、別なオープンソースプロジェクトなので、利用したい人はだれでもダウンロードできる。

Trac is an enhanced wiki and issue tracking system for software development projects.
http://trac.edgewall.org/


posted by SDozono at 12:10| ロサンゼルス ☀| Comment(0) | TrackBack(0) | CakePHP General | このブログの読者になる | 更新情報をチェックする

2006年07月24日

Google Trends:CakePHP,Symfony,ZF,Mojavi...

posted by SDozono at 17:02| ロサンゼルス ☀| Comment(0) | TrackBack(0) | PHP Framework | このブログの読者になる | 更新情報をチェックする

2006年07月23日

Symfony が digg で。

Symfony が digg のファーストページに掲載されたようです。

http://digg.com/programming/Nice_Symfony_(PHP_Framework)_Tutorial

PHP フレームワークに興味を持つ人が多くなるのはよいことだと思います。
最も手軽な WEB 構築言語であることは間違いないと思いますので。

Symfony の宣伝ですが、コメントを見ると、CakePHP を推す声も結構あがっています!
posted by SDozono at 20:33| ロサンゼルス ☀| Comment(0) | TrackBack(0) | PHP Framework | このブログの読者になる | 更新情報をチェックする

2006年07月22日

タグ機能のあるWEBアプリを最小限のコードで製作する方法

もし、タグ付けのできるサイトを製作するのであれば、CakePHP の Association を使いこなしてみましょう。

例えば、
・users テーブル(ユーザの基本データ)
・profiles テーブル(ユーザの詳細情報)
・posts テーブル(投稿データ)
・tags テーブル(タグの種類)
・posts_tags テーブル(投稿データとタグの関連情報)

があったとします。CakePHP の model にきちんとこの関連情報を設定すると、

【パターンその1】
・$this->User->findById(ユーザID)で、users と profiles の両方の情報が取ってこれます。

・$this->Profile->findByID(ユーザID)で、users と profiles の両方の情報が取ってこれます。

※つまり、親子関係のあるテーブルのどちらからでも両方まとめて情報を取ってこれますし、細かい条件を指定できます。

また、

【パターンその2】
・$this->User->findById(ユーザID)で、users と profiles の両方の情報、またすべての投稿データも取ってこれます。

・$this->Post->findById(ID)で、投稿したデータと、それについているタグデータをすべて取ってこれます。

※これに関しても細かく条件が設定されているので、例えば、“承認された投稿(コメント)のみ出力”とか、“時間軸で並べ替えて出力”といったこともできます。

【パターンその1】と【パターンその2】で違うところは、“1対1の関係”か、“1対多の関係”かというところです。

【パターンその1】用として、
・hasOne    (親から子を見る)
・belongsTo  (子から親を見る)

【パターンその2】用として、
・hasMany   (親から子どもたちを見る)
・hasAndBelongsToMany[HABTMとも言う。](二つのテーブルが、もう一つのテーブルで関連づけられている状況をまとめあげる)

があります。

ラベル:PHP cakephp web framework
posted by SDozono at 12:06| ロサンゼルス 🌁| Comment(0) | TrackBack(0) | CakePHP Model | このブログの読者になる | 更新情報をチェックする

2006年07月21日

データベーステーブル間の関連付け/ORM/オブジェクト・リレーショナル・マッピング/Table Association

Excel であれば、1枚の上にすべての情報を載せてゆきます。でも、データベースの場合には、効率的に管理するために“正規化”という作業を行ないます。すると少ない労力で大量のデータを管理できるようになりますが、副作用としてテーブルの数が増えてしまいます。ですので、実際のデータベース・アプリケーションを作成する場合には、この部分をどうやって効率的に管理するかが一つのポイントになります。

正規化したために数の増えたテーブル管理を、フレームワークが面倒を見てくれたっていいはずです。

というわけで、今日は、ORM(オブジェクト・リレーショナル・マッピング)についてです。これは、“関連し合っている複数データベーステーブルを、まるで1枚の Excel の表を扱っているように簡単に扱うための手法”と言ってもよいかもしれません。

これまでの単純PHPプログラミングで正規化したテーブルを扱う場合には、
1)複数回(テーブルの数だけ)、Query を呼ぶ!
2)SQL の"JOIN"をうまく使う。
という方法がありました。ただし、問題点として、1)の場合にはもちろんコード(作業)量が増えます。また、2)の場合には、JOIN であちこちをつなげてしまうと、データベースの種類によっては、“データベースサーバを複数に分けて運用することが難しくなる”場合がありました。

このあたりを、フレームワークがうまく働いてくれればよいのですが、現状としてはこんな具合でした。(最新状況が変わったり、記述が間違っていたりしたらコメントしてください。)

・Ruby on Rails(言語:Ruby) …… ORM(テーブル間の関連付け) をサポート。
(日本語情報としては、http://www.goodpic.com/mt/archives2/2005/10/railsdbor.html など。)
・Ethna        …… データベース関連は Ethna_DB_PEAR,Ethna_DB_PDO など。関連付けなどはない?
http://dozo.matrix.jp/pear/index.php?Framework%2FEthna%2FPDO
・Maple        …… BaseDAO(超α版) 関連付けのできるモジュールを作った方はいるようです。正式サポートではない?
 (http://www.wikihouse.com/hacking/index.php?%A5%DE%A5%C3%A5%D4%A5%F3%A5%B0%A5%B3%A5%F3%A5%DD%A1%BC%A5%CD%A5%F3%A5%C8BaseDAO
・Code Igniter     …… ORM があったらいいなぁという議論はあるが、将来的にもライブラリの1ファイル程度になりそう。
http://www.codeigniter.com/forums/viewthread/569/
・Symfony     …… 自前でサポートするのではなく、propel/creole という別のOSSプロジェクトの成果を組み込む。xml か yml で記述する必要がある。
http://www.symfony-project.com/content/book/page/model.html
・PHP on Trax     …… ORM を自前でサポート。ちょっと意外。ただし、ActiveRecord のファイルが 96.5KBもあるのは大きすぎ?
http://svn.phpontrax.com/wiki/ActiveRecordTableAssociationUsage
・ちなみに Django(言語:python)…… ORM のサポートあり。
http://www-128.ibm.com/developerworks/linux/library/l-django/index.html など。)

というわけで、CakePHP の場合には?
・CakePHP …… ORM を自前でサポート。PHP4用モジュール 40KB PHP5用モジュール 39KB。
http://manual.cakephp.org/chapter/6 の Section 4 "Associations" を参照。)

と、きっちりサポートされています。
ラベル:cakephp framework PHP
posted by SDozono at 15:50| ロサンゼルス ☁| Comment(0) | TrackBack(0) | CakePHP Model | このブログの読者になる | 更新情報をチェックする

2006年07月19日

値のチェックにまつわるいろいろ

入力されたデータのチェック方法に関しては、

http://manual.cakephp.org/chapter/12

ここにいろいろ説明があります。日本語関係のものは、自分でいろいろ設定できます。

で、ここで設定したチェックルールがどこで利用されるか、というと、

1)上記のマニュアルにあるように、
    if($this->Post->validates($this->data))
とすれば、$this->data で送られた入力データが、Post モデルの設定ルールに適合しているかチェックできます。正しければ true が返ってきます。
これは、モデルにあるメソッドであることに注意。

2)それぞれの値のどれがおかしいのか調査・設定させるには、
    $this->validateErrors($this->User);
 とします。これは、“コントローラのメソッド”であることに注意しましょう。この作業では、あるモデルのデータをひとつ一つチェックし、ルールにあてはまらないものがあれば、その“スイッチをパチッと入れる”ような動作をします。つまりは、モデルの invalidate というメソッドを実行し、$this->validationErrors[$field] という配列を 1(スイッチ・オン!)に設定します。

3)$this->Property->save($this->data['Property'])

などのようにして、モデルのsaveメソッド(入力されたデータ)
を実行すると、自動的に validateErrors のチェックがかかります。(2と同じ。)強制的に保存したい場合には、

$this->Property->save($this->data['Property'], false)

とすれば、チェックを無視できます。

4)自前で、“この値はだめだよチェック”をしたい場合には、

if(チェックが通らなかった場合){
$this->User->invalidate('username'); //“エラースイッチ”をON。
}

とすれば、 username というフィールドのデータは通らなかったことになります。ここで複数条件でチェックしたい、エラーメッセージを変えたい、などの場合には、username_hiragana などのように、自分で勝手に作ってしまって大丈夫です。

5)View でのエラー表示
   $html->tagErrorMsg('Post/title', 'タイトルを記入してください')

  という形を使います。例えば上の場合には、"Postデータのtitleという名前のフラグが立っていれば、エラーを表示する"ということになります。
続けて、

   $html->tagErrorMsg('Post/title_hiragana', 'タイトルはひらがなで記入してください')

なども並べておけば、 $this->Post->invalidate('title_hiragana') をしていた場合には表示されることになります。

ちなみに、

・ Model クラスの中には、
  validates,    チェックが通ったら True を返す。
  invalidFields,  チェックに引っかかった配列を返す。
  invalidate    チェックが通らなかったある項目のスイッチをON。
というメソッド。

・ Controller クラスの中には、
  validate, エラーの“数”を返す。
  validateErrors  エラーのあるデータを調査、スイッチを入れてゆく。
というメソッド。

という似て非なる命令がありますので、使い分けに注意しましょう。
  

 



posted by SDozono at 12:33| ロサンゼルス 🌁| Comment(0) | TrackBack(0) | CakePHP View | このブログの読者になる | 更新情報をチェックする

2006年07月18日

CakePHP 日本語情報サイト

CakePHP に関する日本語情報を集めるために、http://www.cakephp.jp があります。
まだはじまったばかりです。気軽に情報を投稿してください。
CakePHP の進展と共に、日本語情報サイトも徐々に"CakePHP fully Powered" にして改良できればと思います。
posted by SDozono at 11:31| ロサンゼルス ☀| Comment(0) | TrackBack(0) | CakePHP General | このブログの読者になる | 更新情報をチェックする

2006年07月17日

いちばん簡単な認証システム

CakePHP には、ACL という認証システムが標準で入っています。しかし、ログイン画面やアクセスチェックなどは自前で用意する必要がありますし、データベースでユーザと権限を管理するなど、かなり本格的なものです。

自分が今、作成しているアプリケーションは、少人数(または一人)で管理できればいいものなので、単純にパスワード一つを登録できて、それで全体の認証チェックをしてくれればよい、という程度のものです。

そこで簡単なスクリプトを書いてスニペットに登録してみました。
データベースを使わず、ユーザ名とパスワード一つでアプリケーション全体を守るタイプのものです。ソースを見れば一目瞭然なコードです。

http://cakeforge.org/snippet/detail.php?type=package&id=20

関心を持ってくれたShane Shepherd さんが、CAKE_ADMIN ルーティングの場合にはどうできるか、というアイデアを出してくれました。

http://www.shepherdweb.com/2006/07/14/single-user-admin-area-authentication-with-cakephp/

これを使えば、アプリ名/admin/コントローラ/アクション というadmin専用の形での認証に使えます。

自分でも必要になったのでちょっと調べてみたところ、こういう書き方もできるかな、と思いました。

class AppController extends Controller {

var $components = array(’SdAuth’);

function beforeFilter()
{

//for CAKE_ADMIN(admin) rooting.
if(defined(’CAKE_ADMIN’) && !empty($this->params[’admin’])){
//start admin check.
if($this->SdAuth->isloggedin() == FALSE)
{
//$this->layout = “login”;
***$this->layout = '';
***$this->render('../layouts/login');
***exit();
*など。pm11opさん、ありがとうございます。*
*http://pm.11op.net/2007/12/post-28.php*
} else {
$this->layout = “admin_default”;
}
}

これだと、/admin/ を間にはさんでアクセスした場合にのみ、認証チェックをかけてくれます。
posted by SDozono at 14:38| ロサンゼルス 🌁| Comment(0) | TrackBack(1) | CakePHP Controller | このブログの読者になる | 更新情報をチェックする

2006年07月16日

form と $data の連携メカニズム

通常、素のPHP で入力フォームを作る際、名前などは任意に付けてしまいます。そして受ける側で、それを読み取り、データベースに入れる、という動作をします。

例えば:

1)入力フォーム:<input name="name" >

2)入力フォームから受ける.php: $name = $_POST['name'];

そして、3)サニタイズ+4)(データの加工)+5)データの検証+6)データベースへ、という形になります。

問題として、

★1)の名前がどんなものでもよい。ルール(規則)が何もない。⇒ページごとに、または開発者ごとに名前の付け方がばらばらになる可能性がある。
★5)で失敗した場合にどうやって1)まで戻すか〔他の正しいデータフィールドをどうするか〕という問題が生じる。

などが往々にして生じます。これまではみんなそれで苦労しました。ところが、CakePHP には、そのあたりを解決する手法が組み込まれています。

★基本となるのは、
--------------------------------------------------------------
・フォームからのデータは、名前を“data['テーブル名']['フィールド名']”として送信すると、自動的に変数$dataに格納してくれる。
・Model の save メソッドは、$変数名['テーブル名']['フィールド名'] = "値"というデータを一括格納できる。
--------------------------------------------------------------
というルールです。

例えば、users テーブルの中に、name フィールドがあるとします。入力フォーム(ビュー)の中に、
--------------------------------------------------------------
echo $html->input('User/name', array('id' => 'user_name', 'size' => '40', 'value' => $users['User']['name'], ))
--------------------------------------------------------------
と書いておくと、実際の HTML には、
--------------------------------------------------------------
<input name="data[User][name]" id="user_name" size="40" value="" type="text" />
--------------------------------------------------------------
と展開されます。

ここにデータが入ってきた場合、コントローラ側では、

empty($this->User) …… データが入力されていなければ True.

という関数でデータが入ってきたかどうかを調べ、もしデータが入力されているようであれば、

$this->User->save($this->data['User'])

という一文で、“usersテーブルへの1行分のデータをすべて”、保存することができます。これを理解していると、保存前にデータを加工したり、独自のデータを計算・追加することなども可能になります。

さて、データバリデーションはどういう仕組みになっているんでしょうか……。このあたりもかなり考え抜かれています。次回へ続く。


posted by SDozono at 11:11| ロサンゼルス ☀| Comment(0) | TrackBack(0) | CakePHP Model | このブログの読者になる | 更新情報をチェックする

2006年07月15日

PHP FrameworkS behind a curtain

I like RoR-style frameworks. And I like phpMyEdit & MyDBO.

But It doesn't mean that I don't like traditional PHP frameworks.
In Japan, there some unique PHP Frameworks which has only Japanese pages. In the future, they may make English community. I think there are potentials to become one of the famous frameworks.

1) Ethna(http://ethna.jp/) - An enterprise level, quite mature PHP Framework.

Ethna.PNG

This framework is being used for one of the largest SNS commercial service in Japan. GREE.jp They released their foundation, PHP framework as a opensource project. And originator of this framework is a member of "php.net".

2) Maple(http://kunit.jp/maple/)

I believe this is the first major framework developed and released in Japan. This framework has a "InterceptingFilter pattern".
Now, the auther is making S2Container.PHP5(DIContainer with AOP) too. (http://www.seasar.org/en/products.html)

3) Quicty(Quick application build environment for PHP depends on PEAR and Smarty)
http://quicty.zubapita.jp/?FrontPage

I think this is the latest PHP Framework being developed in Japan.(a framework announced at the PHP Users ML in Japan.) This framework has a unique feature, kind of "interactive scaffolding" feature. BSD licence.

Other frameworks:
- guesswork(http://www.guesswork.jp/)
- 速構Web Framework (http://www.pm9.com/newpm9/itbiz/php/framework/)
- Dino Lib (http://openlab.dino.co.jp/?key=%5B%5Bdinolib%5D%5D)
- Sabaphy(http://satolab.tiu.ac.jp/SabaphyHome/sabaphyMainHome/index.html)
Educational PHP Framework for university students. / for learning J2EE, EJB.
- Laiz (http://www.n314.com/Laiz/pukiwiki/)
- Pokox (http://www.glamenv-septzen.net/pukiwiki/index.php?pokox)
- rhaco (http://www.rhaco.org/)








posted by SDozono at 23:07| ロサンゼルス ☀| Comment(0) | TrackBack(0) | PHP Framework | このブログの読者になる | 更新情報をチェックする

2006年07月14日

Ruby on Rails と CakePHP の比較/rubyonrails.org での議論。

2006年6月、rubyonrails.org のメーリングリストにて、「Ruby on Rails と CakePHP の比較」というテーマが議論されていました。Ruby使いであっても、WEB関連でPHPを利用したことがない、という方はまずいないと思います。合計31通にもなるディスカッションの中で、いろいろ出てきました。

ror.jpg

最初の一言は、
">From a development standpoint, what are the features that make Ruby on Rails a better choice compared to CakePHP?"

開発の点から考えると、Ruby on Rails を選択することには CakePHP よりもどんな利点があるでしょうか?

というものでした。そこから、

「CakePHP なんて知らなかった〜。」
「PHP は Ruby ほどにはいろいろできるようにならないだろう。」
「お客の共有サーバにスクリプトを入れてくれと言われたら?」
「使い分けもいいかもしれないけど、Ruby をホストしているサーバは PHP だって動くだろう。」
「共有サーバのわずかな値段で、使う技術が左右されるのかい!」
「CakePHP なら、新しい言語を覚えなくていい。でもRubyとRoRの簡潔さとデザインもいい。」
「新しいことを学べば、必ずそこから何かを得る!」
「PHPは、1)テンプレートが簡単。2)DBアクセスが楽。3)どこにでも入っている。Ruby は、1)Blocks。2)ホントのオブジェクト指向。3)Blocks。4)妥当なオブジェクトモデルとスタンダードライブラリ。5)Blocks。……続く。」
「あれっ、なんかフレームワークの話じゃなくて言語そのものの話になってきた。PHPを使いたい人はCakePHPを使えばいいだろう。でも、CakePHPってコードジェネレーションがないんじゃない?」
「(ここでCakePHPの作者が)いや、scripts/bake.phpで使えますよ。設定もほとんどないですし。ビデオキャプチャをどうぞ。」
「RoR はプログラミングの楽しさを教えてくれる!この業界に入ったばかりの気持ちを思い出すよ。」
「あの〜。お客の使用している共有サーバにスクリプトを入れてくれ、というのは、Wordpress Expression Engine などのブログとか Typo3 ,Drupal, Mambo とかのパッケージの意味で書いたのですが……。RoR もいずれ色々なパッケージが出てくるかもしれませんが、数年かかるんじゃないですか。」
「既存の CMS パッケージには満足できない!」
「WEBアプリのソースはもう公開したくない。PHPで書きたくない。」
「あのさ、要するに CakePHP は、PHP版のRailsなんだよ。PHPのソリューションとしてはいいんじゃないの。Rubyのほうがずっと使いやすいけど。」
「色々分析してまとめてみました〜。(まとめ)」

とまだまだ続きますので、関心のある方はご自分で続きをどうぞ。

http://lists.rubyonrails.org/pipermail/rails/2006-June/046592.html

posted by SDozono at 11:03| ロサンゼルス ☀| Comment(0) | TrackBack(0) | CakePHP General | このブログの読者になる | 更新情報をチェックする

2006年07月13日

CakePHP の分かりやすいチュートリアル

Fabio Cevasco さんは別の記事で SQLyog も紹介しています。WEB開発での好みが似ているかもしれません。

簡単なアプリケーションを作成してみるチュートリアル記事を発表されました。

article1.jpg
http://www.sitepoint.com/article/application-development-cakephp

日本での開発のための参考点として、
・自宅サーバで試す場合には、mod_rewrite が効くようにしておきましょう。
・$scaffold は基本的にfield名をそのまま使用するので、日本語環境ではあまり実用的でないと考えていたほうがよいと思います。(日本では、field名には英語が使用されます。しかし、Viewの項目名では日本語が使用されます。)この記事の後のほうに出てきますが、view 部分でテンプレートを簡単に作成できるので、そちらを利用できます。
・Rails流儀では、テーブル名を複数形にしたほうが簡単です。しかし、既存プロジェクトなどの場合には、おいそれとテーブル名を変更できない場合がありますよね。そんな場合でも、単に、Model の中に、

$useTable = テーブル名

とかけば、あとはすべて面倒を見てくれるので、フレームワークを利用することを心配しなくて大丈夫です。(ちなみにここに False を入れると、データベース・テーブルを見に行かないモデルを作成できます。)あっ、でもprimary key がないテーブルを使用している場合はつらいかも。$id という名前でない場合は $primaryKey 変数でセットできます。
・削除機能に「本当に削除しますか」のような確認ポップアップを追加するのは簡単です。$confirmMessage というパラメータを true にしましょう。

詳細はこちらを参照してください。

$scaffold に関しては、phpMyEdit の機能を取り込むことができたら、本家Ruby on Rails を超えることができると考えています。暇ができたら書いてみたいと思います。(しかしもう一つのアイデアも捨てがたい……。)

posted by SDozono at 07:46| ロサンゼルス 🌁| Comment(0) | TrackBack(0) | CakePHP Tips | このブログの読者になる | 更新情報をチェックする

2006年07月12日

直感的なCakePHPのディレクトリ構造

CakePHP のディレクトリ構造は非常に直感的です。

・フレームワーク本体は Cake の中に、
・自分の作成するアプリケーションは、app の中に、

保存します。

データベースの中に、例えば books というテーブルがある場合、

テーブル名:books
モデル(modelフォルダの中に):book.php
コントローラ(controllerフォルダの中に):books_controller.php
ビュー:(view フォルダの中に)
\books\index.thtml
\books\edit.thtml
\books\add.thtml
\books\view.thtml

という配置になります。なお、これらのファイルを手作業で書く必要はありません。cake\scripts\bake.php というスクリプトファイルを作ると、一発で自動生成してくれます。(ほかのテーブルとのリレーションまで設定可能です。)

directories.PNG

posted by SDozono at 17:20| ロサンゼルス ☀| Comment(0) | TrackBack(0) | CakePHP Tips | このブログの読者になる | 更新情報をチェックする

2006年07月11日

$this->Set()命令のミステリー

CakePHP はMVC(モデル、ビュー、コントローラ)を分離させる(つまり別々のファイルに分ける)システムです。ですから当然、モデル⇒コントローラ⇒ビューと、データを渡していく必要があります。

仕事を3人で分けたら、必ずそこにコミュニケーションが発生するのと同じです。この3者をつなぐ電話のようなものは何でしょうか。

1)モデルからコントローラへは?

  チュートリアルなどにもかかれていますが、コントローラがモデルの情報を知りたい場合には、
  
class PostsController extends AppController
{
    この中で、
    $result = $this->Post->findAll();
    などのようにして、Postモデルの情報を受け取ることができます。
}

2)コントローラからビューには?

 ここで登場するのは、
 $this->set('変数名', データ); という構文です。コントローラでこれを設定すると、ビューの中でデータが取り出せます。

 注意してほしいのは、

 $this->set('nanika', "これはデータです。"); などのようにすると、

 ビューからは、

echo $nanika;

 として取れるということです。つまり、「set命令でデータをセットすると、ビューの中では変数の名前になる」ということです。また、変数でも配列でも何でも渡すことができます。

Cやその他の言語では、この「データが変数に化ける」という使い方はあまりしないと思うので、最初、戸惑うところかもしれません。また、PHPらしいところをうまく使っていると言っていいかもしれません。CakePHPにはキャッシュの機能もありますので、これと組み合わせると、Smarty などの外部のテンプレートシステムを使用する必要がないほどです。

内部的にはどうやって実現しているかというと、view.php の中に、

extract($___dataForView, EXTR_SKIP);

という文があります。ここでデータを変数に展開しています。

そういえば Ruby には extract に似た関数があるのかな、と思い調査したところ、そんなに簡単ではなさそう?でした。
http://www.html.com/forums/ruby/48892-extract-hash-into-local-variables.html

Ruby の方、Rails では、このあたりがどんな具合になっているんでしょうか……?

*追記*

3)ビュー(送信フォーム)からコントローラには?
これはちょっとヒントだけ書いておきます。考えてみてください。
マニュアルのブログ・チュートリアルを見ると、

function add()
{
  if (!empty($this->data))
  {
    if ($this->Post->save($this->data))
    {
      $this->flash('Your post has been saved.','/posts');
    }
  }
}

とあります。 $this->data の中にデータが入っている場合には、データベースに登録する、ということは……。また、フォーム(ビュー)のほうでは、
<?php echo $html->input('Post/title', array('size' => '40'))?>
と書いてありますね……。

また今度、この辺を詳しく解説してみます。




    
posted by SDozono at 13:11| ロサンゼルス 🌁| Comment(3) | TrackBack(0) | CakePHP Controller | このブログの読者になる | 更新情報をチェックする