2006年10月12日

WEBアプリの自動作成

しばらく CakePHP まわりで作業をしていました。

http://cakephp.seesaa.net/article/25299712.html

スクラッチで書いたら、ここまでたどり着くのに相当かかったと思いますが、フレームワークのおかげで、実質、3日くらい?でphpMyEditにかなり近づく機能を実装できたと思います。あとは、phpMyAdmin でデータテーブルを作りさえすれば、同じ機能をもったページをぽこぽこと生成できるようになりました。

dbQwikEdit やら、Scriptcase やら、ほんの1年前まではこういうツールに●万円の値段がついていたと思うので、使いやすいMVC構造のファイルを自動生成できるフレームワークが無料で使用できる、というのはかなり便利な時代になったものだと思います。

今後の間近な流れとしては、レポート・統計画面の自動生成でしょうか……。


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

2006年07月19日

cakephp 専用ブログ

cakephp について書くことが増えたので、cakephp用のブログを作りました。

cakephp のおいしい食べ方
http://cakephp.seesaa.net

(k2crowさん、ご指摘ありがとうございます。)

関心のある方はどうぞ。こちらのブログでは種々雑多なことを書くような方向性でいきたいと思います。

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

2006年07月18日

CI(Code Igniter)とCakePHP。双子のようで双子ではない。

Code Ingniter も CakePHP も共に、PHP4/PHP5 のどちらでも利用できるPHPフレームワーク。CakePHP が兄だとすれば、Code Igniter は弟だ。兄は出来がいいが気難しいところがあり、弟は単純だが活動的、というところだろうか。

後発の Code Ignier は、「手軽・簡単・直感的」を売りにデザインなどをスマートに決めているが、今後の方向性として、「兄とは違う自分」を求めて葛藤もあるようだ。

Cake使いにも参考になる議論がここにあった。

CI review
http://www.codeigniter.com/forums/viewthread/554/
CI gets a good review on this site however is says one of the “cons” is “Does not seem to support table associations.”
What does that mean?

object persistence layer/Object-relational mapped layer
http://www.codeigniter.com/forums/viewthread/569/

ORM(オブジェクト・リレーショナル・マッピング)をどうするか、という点でCake と CI は住み分けができるのかもしれない。フレームワークとして、コアレベルでORMをサポートし、Ver1.0 に到達した Cake と、スピードと手軽さを重視し、あえて深入りせず、その機能をはずしている CI。

チュートリアルレベルではそれほど違いがないように見えても、実務レベルのコードを書き出すと、書く必要のあるコード量は目に見えて違ってくる。

しかし、現時点では、自分でチューニングしたコードを書いたほうがスピードがあがることも事実だ。また、複数台の MYSQLサーバで運営したいと思う場合に、あまりがちがちに関連付けていないほうが楽だ、というのも事実だ。(MYSQL5が使えるなら心配無用だが……。)

個人的には、Cake にしても、CI にしても、Propel ではなく MyDBO を使って static なDAOモデルを書けるようにしておき、ある程度データベース構造が固まったところでスタティックモデルに移行できるシステムができれば、スピードの点でもメリットがあるのではないかと考えている。

フレームワークを使えば、モデル部分だけ取り替えるのも簡単なので、単純に現在のスピードだけでフレームワークの選別はできない。
posted by SDozono at 11:26| ロサンゼルス ☀| Comment(0) | TrackBack(0) | CakePHP | このブログの読者になる | 更新情報をチェックする

2006年07月10日

admin の入ったURLだけ挙動を変える

admin だけ編集・修正作業ができるようにしたい、という場合:

core.php の中の CAKE_ADMIN をアンコメント(定義)する。

http://dokokanoCake/users/test

とすると、
users_controller.php の中の“test”メソッドが呼ばれる。

しかし、

http://dokokanoCake/admin/users/test

とすると、
users_controller.php の中の“admin_test”メソッドが呼ばれるようになる。


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

2006年07月06日

generateList でひっかかる。

なんどやっても selectTag まわりがうまくいかない。
何でだろうと思ってたどってみると、generateList でうまく取ってこれてなかった。
しばらく(かなり)悩んだあと、generateList の引数の書き方が変わっていることに気が付きました。(*_*;

$keyPath と $valuePath は、当初、'id', 'role_name'と書けばよかったのに、最新版では、'{n}.Role.id','{n}.Role.role_name'と書かなければいけない、というように修正されていました。

で、この{n}って何?という話は、ここにあります。

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

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

2006年06月28日

データテーブルのないモジュールは?

基本的に、Cake PHP の Model は、“データベースのテーブル”です。
リレーションなども扱える便利なモデルですが、データベースを使わない場合にはどうすればよいでしょうか?

いちばん簡単なのは、“コンポーネント”として作成することだと思います。
自作の最小ログインチェックをコンポーネントで作ったところ、うまく動くようになりました。ビューも必要なし。
posted by SDozono at 17:16| 東京 🌁| Comment(0) | TrackBack(0) | CakePHP | このブログの読者になる | 更新情報をチェックする

日本語環境では、Scaffold より bake.php を使ったほうがよい!

cake\scripts に、bake.php というファイルがあります。
Windows 環境の場合はコマンドプロンプトから

PHPの環境\php.exe bake.php として実行してみましょう。
対話形式で自動的にテーブルから Model, View, Controller を作成してくれます。

日本語の場合は、どうしても、表の「項目名」を日本語に編集する作業が入ってきますので、 scaffolding よりも bake.php でファイルを作成してしまったほうが便利です。手間もかかりません。
posted by SDozono at 00:49| 東京 ☀| Comment(0) | TrackBack(0) | CakePHP | このブログの読者になる | 更新情報をチェックする

CakePHPで快適デバッグ環境

Cake PHP で SQL文のデバッグをするためには、 core.php で設定しましょう。app\config の中にあります。

* - 0: プロダクション
* - 1: 開発
* - 2: SQL文付きのフルデバッグ
* - 3: 現在のオブジェクトダンプとSQL文を含めたフルデバッグ

PHPの開発ではよく、echo $query."
" なんてはさみこむもんですが、Cake PHP を使えばそんなことをしなくても、自動的にページの下に、表になってSQL文が表示されます。どれくらい時間がかかったか表示されるのも気が利きます。


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

2006年06月27日

Rails流の Name Conversion を使用したくないとき

Cake PHP は Rails の流れをくんでいるので、「DBテーブル名は複数」が基本。

でも、すでにDB構造ができてしまっているものに対してあとから作業をする場合には、ほかのスクリプトとの兼ね合いから、テーブル名の変更なんて今更できない、という場合だってある。

それでもまったく問題なし。

考え方としては、

1)“テーブル名が複数形であるかのようにして, Model と Controller を作成する。”
2) Model の中に、

var $useTable = '本当のテーブル名';

を書く。

これでよい。


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

2006年06月13日

Cake PHP でオフショア開発

オフショア開発を考慮に入れた大規模案件をPHPで始める予定です。
裾野の広がったPHP開発者の中から良い技術者を探してくるのはなかなか難しいのですが、Cake PHP を使える技術者、ということで探せばよいかな、と計画しています。

PHPの先を考えている技術者は、どこの国でも同じようなことを考えていると思いますので。
http://www.ccls.jp での成果を元に地域を選定します。

ただ、Aspect 志向プログラミングが徐々に次の技術として進み始めているような……。

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

2006年06月02日

Cake PHP: Model の研究(1)

Mojavi系PHPフレームワークと違い、Cake PHP の場合は、

[M]odel クラス
[V]iew クラス
[C]ontroller クラス

ときれいに分離しており、自分のクラスはそれぞれこのどれかから派生しているので、はじめての人でも直感的で分かりやすいと思います。

(Mojavi やそれをお手本にしたフレームワークでは、このあたりがあいまいになっているような気がします。)

また蛇足ですが、
===================================================================
・上記三つのクラスはすべて object クラスから派生している。
 (Cake の根幹の修正は、object クラスに書けばよい。)

・Cake は、PHP4 か PHP5 かを判断して、該当するバージョンの Model クラスを自動的に派生させる。(Cake内)

・Model クラスから、AppModel クラスが派生している。
 (自分のアプリケーションのModel クラス全体に影響する修正はここに書ける。)

・app フォルダの中に、AppModel クラスから派生した、“データベーステーブル名が付いた”モデルクラスを作成する。
 (基本的には、この作業が“アプリケーションの作成”になります。)

===================================================================

モデルクラスの作成は簡単で、

class クラス名 extends AppModel
{
var $name = 'クラス名'; // PHP4用に変数として登録
}

と、これだけでOKです。ブログアプリ作成チュートリアルなどもこうなっています。

でも、これだけではなんだかよく分かりません。
また、どんな恩恵があるのかもいまひとつはっきりしません。
しかし、実はこの時点で、様々な機能がモデルクラスに追加されています。
また、このクラスにちょいちょいとメソッドを追加するだけで、便利なことがずいぶんできるようになります。

それは……(次へ続く)。
posted by SDozono at 07:48| 東京 🌁| Comment(0) | TrackBack(0) | CakePHP | このブログの読者になる | 更新情報をチェックする

2006年06月01日

CakePHP:同一コントローラ内のリダイレクト

MLより。

http://groups.google.com/group/cake-php/browse_thread/thread/a14dcb99f5935b00/e88eb739c2ce8973#e88eb739c2ce8973

Cake で同じコントローラ内のリダイレクトであれば、
$this->redirect('コントローラ名/メソッド名');
とするのは、コントローラ名がいらないんじゃないの?という話。

あっという間に色々アイデアが集まって、

・$this->redirect('/'.$this->params['controller'].'/action');
・$this->redirect ($this->name."/"."methodName");
とか、
・コントローラの redirect メソッドをオーバーライドすればいいんじゃないの

とか、がやがや言っているうちに、

同じコントローラ内なら、

$this->setAction('action2');

でいいんだよ、と nate が投稿して、この話はうちきり。
コミュニティの力だ。
面白い。
posted by SDozono at 23:15| 東京 🌁| Comment(0) | TrackBack(0) | CakePHP | このブログの読者になる | 更新情報をチェックする

Cake Software Foundation

Cake PHP フレームワークを使える人をリストアップする

http://www.cakefoundation.org/

Certified Engineers 制度を作ることを考えているようです。
これはスマートなやり方ですね!

オープンソースでビジネスをするためには色々と知恵を絞る必要がありますが、これはかなり賢いと思います。

CakePHP, すごいのはフレームワークだけではなかった!

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

2006年05月20日

CakePHP:値をどうやって受け取るか

フレームワークを使うと、URL, $_GET や $_POST などの使い方が単純なPHPプログラムと異なる場合があります。検索エンジン対策としてURLから?param=123のような形を追い出すことができたり、逆にコントローラの名称が URL に含まれたりしますので、便利であると同時に最初はややこしく感じるわけです。そのあたりを、フレームワークがどうやって処理しているのか、という点を知る必要があります。

今日はこのあたりを解説してみます。

例えば、CakePHP の blog チュートリアルはそのあたりをさらっと流しているので、ここでつまづく人もいるかもしれません。

例えば、
blog のチュートリアル

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

の部分では、

/app/views/posts/index.thtml (edit links added)

の中で、

<?php echo $html->link('Edit', '/posts/edit/'.$post['Post']['id']);?>

と書いています。例を挙げれば、「10番の記事を編集したい」と言う場合には、

/posts/edit/10

という URL が生成されることになります。しかし、本当にこのアドレスで示す“実ファイル”があるわけではありません。

ところが、このリンクをクリックすると、posts_controller.php が呼ばれ、その中の edit メンバ関数が呼ばれます。

posts_controller.php 内の edit 関数は次のようになっています。

function edit($id = null)
{
if (empty($this->data))
{
$this->Post->id = $id;
$this->data = $this->Post->read();
}
else
{
if ($this->Post->save($this->data['Post']))
{
$this->flash('Your post has been updated.','/posts');
}
}
}

つまり、 $id に自動的に 10 という数字が代入されて入ってくる、ということを示しているのですが、どうしてこうなるのでしょうか?これは単純な PHP プログラムでは起こらない“現象”です。

この仕組みを理解するには、まず .htaccess を開いてみることが必要です。
この中には mod_rewrite という機能を使っています。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>

上記の命令により、「もし、送信された URL に該当するファイルがないのであれば、“index.php?url= のあとに送信されたURLを追加した形”に変更しなさい」という処理が実行されることになります。

つまりこの機能によって、
/posts/edit/10
という URL は、実際のファイルが存在しないので、
index.php?url=posts/edit/10
というURLに“変換”されることになります。

それにより、Cake の index.php が呼ばれ、フレームワークが読み込まれ、URL が解釈されて、該当するモジュール(この場合は、postsコントローラのeditアクション)に処理が振り分けられ、引数(今回は10)が渡されることになります。

では、「二つ以上の引数を渡したい」場合には、どうすればよいのでしょうか?答えは、「スラッシュを足して、単純にURLに足していけばよい」ということになります。つまり、

/posts/edit/10/1/2/ ...

とすれば、posts_controller.php の edit メソッド内で、

function edit($id = null, $sono2 = null, $sono3 = null, .....)
{

などのように設定しておくと、
$id   には 10 が入力される。
$sono2 には 1 が入力される。
$sono3 には 2 が入力される。

などのように延々と引数を増やすことができます。基本としてはこの形でほとんどの場合、処理できると思います。

では、これまでの、 index.php?test=1&test2=2&test3=3 という形は使えないのか、というとそういうわけでもありません。

/posts/edit/10/1/2?test=1

とした場合には、

$x = $_GET['test'] とすれば、$x のなかに 1 が入ってきます。

ためしに、
function edit($id = null, $id2 = null, $id3 = null)
{
echo "** url=".$_GET['url']."<BR>";
echo "** id=".$id."** id2=".$id2."** id3 = ".$id3."<BR>";
echo "** test=".$_GET['test']."<BR>";
echo "** this->params".var_dump($this->params)."<BR>";

などのように付け足して、どんな値が入ってきているのかを見てみると、かなり具体的に把握できると思います。

Cake のURLの変換処理を把握するためには、
.htaccess
index.php
object.php
bootstrap.php
dispatcher.php
などのファイルがかかわってきますので、ご自分で参照されることをお勧めします。

メーリングリストに流れた問い合わせとしては、
・パラメータの数によって、コントローラを変えることはできないか
・SEO対策として、スラッシュの数を減らす(データをくっつける)ことができるか
・言語別の振り分け
などもありました。

特に、何か変則的なことをやりたい時などは、bootstrap.php に処理を追加することができます。










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

2006年05月16日

CakePHP プレゼン資料

安藤祐介さんによる資料

http://puyo2.upper.jp/cake/
posted by SDozono at 12:41| 東京 ☁| Comment(0) | TrackBack(0) | CakePHP | このブログの読者になる | 更新情報をチェックする

CakePHP: コントローラ->flash

「データを更新しました」など、
メッセージを数秒表示して、その後、ほかのページに移動(遷移)した場合には、コントローラー内にある flash 関数を使用して、

コントローラ内:
$this->flash('データを更新しました。','/飛び先URL');

などとする。

ちなみに、flash.thtml の中で、
if(DEBUG == 0) {
 /*移動処理*/
}
となっているので、デバッグモードのときには勝手にジャンプはしない。

ちなみに、flash.thtml は、文字コードを変更して、app フォルダに自分用を準備しておいたほうがよい。

なんだ。うまく動かないのかと思った。

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

CakePHP: $html->hidden

hidden タグを出力。
http://api.cakephp.org/class_html_helper.html#817431872fecdf3cbc7715059196e76e

HtmlHelper::hidden (
 $ fieldName,
 ★フィールド名。$html->hidden('Post/id')とすると、Postモデルのidを出力しなさい、ということになる。
$ htmlAttributes = null,
 ★例えばここに、array('name'=>'Testlink')と書いておくと、<a href="……" name='Testlink' > と展開される。
$ return = false
 ★ false のままだと、echo文で出力する。 True に設定すると、“文字列”として返ってくるので変数に代入できる。
)
posted by SDozono at 11:41| 東京 ☁| Comment(0) | TrackBack(0) | CakePHP | このブログの読者になる | 更新情報をチェックする

CakePHP: $html->link 関数の説明

APIの説明はこちらに。
http://api.cakephp.org/class_html_helper.html#147be609c2c5901201380516d105ac29

HtmlHelper::link (
$ title,           
 ★リンクタイトルの文字列
$ url = null,        
 ★URL
$ htmlAttributes = null,   
 ★例えばここに、array('name'=>'Testlink')と書いておくと、<a href="……" name='Testlink' > と展開される。
$ confirmMessage = false,
 ★本当にリンク先へ飛びますか?のようなメッセージ。
$ escapeTitle = true,
 ★ htmlspecialchars($title, ENT_QUOTES)をかけるかどうか。デフォルトでかけている。
$ return = false
 ★ false のままだと、echo文で出力する。 True に設定すると、“文字列”として返ってくるので変数に代入できる。
)
posted by SDozono at 11:09| 東京 ☁| Comment(2) | TrackBack(1) | CakePHP | このブログの読者になる | 更新情報をチェックする

2006年05月15日

CakePHP:MYSQL 4.1, 5.0以降で使用する場合のTips

MYSQL 4.1以降は、文字コードを設定しないといけない。
そうしないと日本語はクエスチョンマークのオンパレードになってしまう。

解決策としては、MYSQL本体に設定しておくか、PHPでDBに接続するたびに、

mysql_query("SET NAMES UJIS");

などとすればよい。

CakePHP フレームワークのどこで設定しておくか?
ここにちょっとした情報があった。
http://cakebaker.wordpress.com/2006/01/16/trouble-with-utf-8/

少しアレンジして、cake\app_model.php にこう書き足しとく。

function __construct() {
parent::__construct();
if(!defined('GLOBAL_UJIS')) {
$this->query('SET NAMES UJIS');
define('GLOBAL_UJIS', TRUE);
}
}



これでMYSQL 4.1 以上を使う人にも安心してコードを渡せる。
posted by SDozono at 18:29| 東京 ☁| Comment(0) | TrackBack(0) | CakePHP | このブログの読者になる | 更新情報をチェックする

CakePHP:文字コードの初期設定

とりあえず、EUC-JP を使用しているなら、
libs\view\templates\layouts\default.thtml の33行目

charset('UTF-8')?>

charset('EUC-JP')?>

に変更しておきましょう。
posted by SDozono at 17:19| 東京 ☁| Comment(2) | TrackBack(0) | CakePHP | このブログの読者になる | 更新情報をチェックする
WebとCTI、VoIP技術の高みを目指して - 技術者の24時間
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。