2007年08月05日

ヘルパーメソッドJavascript->object()でJSON形式を出力できる!!(CakePHP)

ソースを徘徊しているとたまたま発見。
ドキュメントにはまだ掲載されていない。

これで、PEAR::Services_JSONもphp-jsonも使用せずフレームワークのみで完結できる。
しかし、JSONからPHPオブジェクトに変換する方法は提供されていないみたいだ。

これまで、PEAR::Services_JSONのencode()で行っていた処理を、Javascript->object()で動作確認してみたがとりあえず問題ないみたいだ。

問題は、objectという名前が直感的にわかりずらいことだ。
(toJSON()とかならね・・・)
ラベル:cakephp view Helper
posted by asaton at 21:48| Comment(40) | TrackBack(2) | CakePHP | このブログの読者になる | 更新情報をチェックする

2007年07月10日

CakePHPでレイアウトファイル以外のビューファイルからページのタイトルにアクセスするには

ページのタイトルは、$title_for_layoutに格納されている。
が、この変数はレイアウトファイルからしかアクセスできない。

その他のファイルからアクセスする場合
$page_title

という変数にアクセスするとコントローラの$this->pageTitleで設定したタイトルにアクセスできるみたいだ。
ラベル:cakephp ビュー
posted by asaton at 22:58| Comment(0) | TrackBack(0) | CakePHP | このブログの読者になる | 更新情報をチェックする

2007年07月09日

CakePHP:app/views/elements/配下をフォルダ分けする方法

ビューファイルのブロック描画の際、$this->renderElement()を多用するとapp/views/elements配下にファイルが多数作成され見にくくなる。

そこで、
app/views/elements/common/* 共通
app/views/elements/posts/* postsコントローラ
app/views/elements/users/* usersコントローラ

とある程度機能ごとに整理したくなる。

で、上記のようなファイル構成でrenderElementを呼び出すことが出来るか調べてみたところ意外に簡単に出来ることがわかった。
$this->renderElement('フォルダ名/エレメント');

とすればOKみたいだ。

例えば、app/views/elements/posts/element1.thtmlを描画したい場合
$this->renderElement('posts/element1');

とすれば問題なく動作する。


ラベル:cakephp ビュー
posted by asaton at 23:55| Comment(0) | TrackBack(8) | CakePHP | このブログの読者になる | 更新情報をチェックする

2007年07月08日

モデルのcondition配列の展開(CakePHP)

久々に更新!!
最近、CakePHPを色々な案件で使用しているのだが、
メモしておかないと次探すのが面倒なので書く。

CakePHPでは、findAllメソッドなどの$conditionsに配列を渡せばwhere句を構築してくれる。

例えば、
$conditions = array('and' => array('Field.id = 3', 'or' => array('Field.id = 1', 'Field.id = 2')));


とした場合

WHERE (`Field`.`id` = 3) AND ((`Field`.`id` = 1) OR (`Field`.`id` = 2))


としてくれるので、自分でandでつないで次、orでつないでと文字列として作成するよりプログラムが組みやすい。

で、$model->queryでも$conditionsを配列として構築しておき、sqlを発行する直前にwhere句を構築したい。
(自前で作成してもよいのだが、修正を重ねるとwhere句の直後にandがきたりしてDBに怒られるのがうっとおしいので・・・)

CakePHPのソースを追っているとどうやら、DboSourceクラスのconditionsメソッドを呼び出せばよいというのがわかった。
(実際はconditionKeysToStringメソッドで行っている)

でコントローラクラスのアクションメソッド内で

$conditions = array('and' => array('Field.id = 3', 'or' => array('Field.id = 1', 'Field.id = 2')));
$db =& ConnectionManager::getDataSource($this->Model->useDbConfig);
$conditions = $db->conditions($conditions);


と書くことでうまくいった。
DataSourceを取得するのが面倒なので、AppModelあたりに共通化しておこう。



ラベル:cakephp モデル
posted by asaton at 21:11| Comment(0) | TrackBack(1) | CakePHP | このブログの読者になる | 更新情報をチェックする

2007年04月23日

CakePHP:コントローラ内でヘルパークラスを使ってみる

CakePHPでヘルパーというのは、マニュアルでは
http://www.cakephp.jp/doc/helpers.html

ヘルパーは、データの整形や表示などの、ビューで一般に必要とされる関数を便利な仕方で提供する方法です。


と定義されており一般にビューで使用されるものだ。

しかし、CakePHPの標準で提供されているヘルパークラスの中には、TimeHelperクラスのdaysAsSqlメソッドなどSQLのwhere句を作成するのを助けてくれるような、コントローラクラスでぜひとも使用したい便利なメソッドも定義されている。

そこでコントローラ内で

var $helpers = array('Html', 'Form', 'Time');


と定義し、ビューファイルで$Time->daysAsSqlとアクセスするように、アクションメソッド内で

$sql = $Time->daysAsSql("2007/04/01", "2007/04/20", 'field');


として実行してみた。

しかし、$Time変数が定義されてないというエラーで失敗。

原因を調査してみると、ビューで使用する$Htmlや$Timeは、実はViewクラス(cake/libs/view/view.php)の_render(プロテクト)メソッドのローカル変数だからということが分かった。
(コントローラのset関数でビューに渡される関数もこの_render関数内でextractされている。)

そして、この_renderメソッドを覗いて見ると$this->_loadHelpersメソッドをコールしており、どうやらこの_loadHelpers内でヘルパークラスが作成されているというのがわかった。

_loadHelpersメソッドではコントローラの$helpersフィールドに定義されたヘルパークラスたちがnewされ、'base'や'webroot'などのコントローラクラスのフィールドをヘルパークラスのフィールドにコピーしている。
(実際にはコントローラからビューに設定されたフィールド)

ということは、コントローラ内で使用したいヘルパークラスをnewしてやればいいのではないかと考えコントローラ内のアクションメソッド内で

$Time = new TimeHelper();


としてみた。しかしTimeHelperクラスが見つからないとエラー。どうやらTimeHelperクラスのファイルが読み込まれてないみたいだ。

_loadHelpersメソッド内を調べてみるとloadHelper関数(グローバル)を使用し必要なヘルパークラスのファイルを読み込ませているのがわかった。

なので、コントローラクラスの任意のアクションメソッド内で

if(loadHelper('Time'))
{
$Time = new TimeHelper();
$sql = $Time->daysAsSql("2007/04/01", "2007/04/20", 'field');
echo $sql;
}


とloadHelper関数でヘルパークラスを読み込んでみると、

(field >= '2007-04-01 00:00:00') AND (field <= '2007-04-20 23:59:59')


と期待した結果が得られ、コントローラ内でへルパークラスを使用することに成功した。

これで今までコントローラ内にコピペしていたのがスッキリする・・・

ちなみに、loadHelper関数だが、cake/basics.phpで定義されている。
このファイルには他にもe()やh()などecho()やhtmlspecialchars()などのショートカット関数も定義されているみたいだ。
posted by asaton at 15:58| Comment(0) | TrackBack(1) | CakePHP | このブログの読者になる | 更新情報をチェックする

2007年04月16日

CakePHPでレンタルサーバでのサイト構築例(2)

Windows環境(xampp)で開発していると書き込み権限を設定する必要がないが、xreaなどのレンタルサーバはlinuxなどのunix系OSなので書き込み権限を設定することが必要だ。

CakePHPの場合、app/tmpフォルダにあるフォルダのいくつかに書き込み権限を与えなければならなかった。

具体的には下記の2つに書き込み権限を与えている。

/tmp/cache/models/
/tmp/logs/


/tmp/chache/modelsだがこれは、データベースのテーブルのカラム情報などのテーブル情報をキャッシュしている。
CakePHPが実行したSQLを表示するには?などの方法でSQLを実行するとDESC命令でカラム情報を取得する場合と取得しない場合がある。おそらくコントローラに変更がない場合、キャッシュから取得するために必要なのだろう。

/tmp/logs/だがこれは$this->log()でログを収集する場合に必要だ。自分の環境ではPHPのエラー情報もこのフォルダに居候させている。

関連記事
CakePHPでレンタルサーバでのサイト構築例

CakePHP製サイト
http://jobrss.net
ラベル:PHP cakephp
posted by asaton at 14:55| Comment(0) | TrackBack(1) | CakePHP | このブログの読者になる | 更新情報をチェックする

2007年04月13日

CakePHPのセッションのタイムアウトの設定

app/config/core.phpに
define('CAKE_SESSION_TIMEOUT', '120');

がありこれを変更すればタイムアウト時間を変更できる。

注意しなければならないのは、デフォルト値は120となっているがこれは120秒という意味ではない。

CakePHPのセションのタイムアウト時間の設定値は、
CAKE_SECURITY * CAKE_SESSION_TIMEOUT

から導き出される。

つまりデフォルトの場合、CAKE_SECURITYは
define('CAKE_SECURITY', 'high');

と設定されており
120*10=1200秒

ということになるのだ。

CAKE_SESSION_TIMEOUTの定義のコメント欄には英語で
high: multiplied by 10
medium: is multiplied by 100
low is: multiplied by 300

書かれており、highの場合10、mediumの場合100、lowの場合300をCAKE_SESSION_TIMEOUTに掛け合わせますよと書かれているのだが見落としてしまいがちだ・・・

120秒でリロードしてもまだ値が残っている。どうして?と思ったらこういうことだったのか・・・

マニュアルでも
11.2. CakePHP コアで定義された定数に一行さりげなく
CAKE_SESSION_TIMEOUT: セッションタイムアウトまでの秒数。この値は、 CAKE_SECURITY を掛け算したものになります。

と書かれているが

結構紛らわしいので要注意!!
自分の場合、ブラウザのキャッシュやらPHPの設定やらあれやこれや疑って時間を浪費してしまいました。。。
ラベル:cakephp PHP
posted by asaton at 12:58| Comment(3) | TrackBack(0) | CakePHP | このブログの読者になる | 更新情報をチェックする

2007年04月11日

CakePHPでレンタルサーバでのサイト構築例

CakePHPで下記サイトを構築してみた。
http://jobrss.net

jobrss.net

フィード配信している転職サイトの新着求人情報を検索できるサイトです。
定期的に巡回しているので新着求人情報がどんどん追加されていきます。
(1日500件以上追加されてます。今後が心配・・・)


環境を参考までに

サーバ : xrea+(PHP5,mysql)
フレームワーク : CakePHP(1.1系)、paginationコンポーネント
RSS解析エンジン: SimplePie

レンタルサーバ使用ですが結構快適に動いています。
(レンサバでも動くフレームワークってすごくないっすか???)
cronでrssフィードを取得していますがこれもCakePHPで動いています。
参考:Tips/cronで実行


今後の目標

1.検索機能の強化。(注目のキーワード等表示させると面白いかも・・・)
2.人気順に表示(ajaxで外部リンクを追跡)
3.ACLを使ってみたい


メリット、デメリットを書いておきます。フレームワーク選定の参考に・・・

CakePHPのメリット(選んだ点)

1.言語がphp(いざとなればソースを追っかけれる。)
2.日本語の公式マニュアルがある(翻訳元のコミュニケーションビジネスアヴェニューさんには感謝です)
3.日本語の情報が多い(CakePHP のおいしい食べ方さん等参考にしました)
4.軽い。レンサバでも動く。(現実的。これが一番大きい)

CakePHPは非常に使いやすいフレームワークだと思います。
ruby on rails等、最近のフレームワークを理解していればすぐに開発にとりかかれます。PHP等使ったことがあれば、言語習得にかかるコスト等無視できますし・・・。ほとんどのサーバで快適に動作する思います。実環境でrails使って重いなと感じた人にはおススメです。

CakePHPのデメリット

1.log周りが弱い。
2.phpのエラー出力レベルをフレームワークが直接書き換える。

1番のログ周りですが、DBの吐くエラーを捕らえる事が出来ません。
モデルのfindAll等失敗した場合アプリ側にnullが返って来るだけです。
2番のエラー出力レベルですが本番環境ではerror_reporting(0)とされてしまいます。デバック環境ではdisplay_errorsを勝手にONにされます。これをアプリ側で制御することは出来ません。対応策として自分は、フレームワークの該当箇所を削除し、.htaccessで制御してます。(他のサイトはどうしてるんだろう・・・)

上記2点はCakePHPのアマチュアっぽさを感じる点です。
大規模サイト採用への障壁となるんではないかと思います。
(少々かじっただけですがSymfony等このあたりしっかりしてるように感じました。)


今後、コンタクト(問い合わせ)フォーム等部品化できそうなものは公開していきたいと思っています。

ラベル:cakephp PHP 求人 転職
posted by asaton at 14:32| Comment(0) | TrackBack(0) | CakePHP | このブログの読者になる | 更新情報をチェックする

2007年04月05日

CakePHPでページのタイトルの設定方法

ビューの$title_for_layoutにページのタイトルが格納されている。

タイトルをカスタマイズしたい場合、コントローラの
$this->pageTitle

に設定してやるといいらしい。

でこのpageTitleだがマニュアルのコントローラの変数の説明には記述されていない。

どこに載っているかというとビューのレイアウトの説明(下のほう)のところに記述されている。

下記url
http://www.cakephp.jp/doc/views.html#id4808138


少しハマった・・・
posted by asaton at 18:06| Comment(0) | TrackBack(0) | CakePHP | このブログの読者になる | 更新情報をチェックする

2007年03月29日

CakePHPでページ作成にかかった時間を表示する方法

CakePHPはグローバル変数$TIME_STARTにスタートした時間を記録している。(cake/bootstrup.phpで記録しているので多少の誤差はある)

productionモード以外ならHTMLコメントとして最後のほうに出力されている。
(app/webroot/index.phpの85行目あたり参照)

なのでindex.phpの該当箇所を参考にして作成してみた。

ビューファイルに下記コードを挿入する。
(例、app/views/layouts/default.thtmlのfooterのdivに)

<?php global $TIME_START; echo round(getMicrotime() - $TIME_START, 4)."秒"; ?>


エレメント化したいなら、app/views/elements/にtimer.thtmlを作成し上記コードを挿入し、ビューファイルの任意の位置に下記コードを挿入する。

<?php echo $this->renderElement('timer'); ?>



ヘルパー関数にメソッドを追加してほしいな・・・
ラベル:PHP cakephp framework
posted by asaton at 17:11| Comment(0) | TrackBack(0) | CakePHP | このブログの読者になる | 更新情報をチェックする

2007年03月28日

CakePHPの本番稼動のerror_reportingについて

CakePHPでサイトを構築する場合、php関連のエラー情報をログに保存しておきたい。

具体的には、app/webroot/配下の.htaccessに下記のように記述して

php_flag display_errors off
php_flag log_errors on
php_value error_log "./logs/php_error.log"


しかし、app/configのcore.phpの52行目あたりを
define('DEBUG', 0); // 0はプロダクションモード

に変更してみるとログにエラーが記録されない。

で、原因を調査してみると、cake/libs/configure.phpのConfigure::writeでerror_reporting(0)が実行されている為と分かった。

さすがに本番稼動でerror_reporting(0)はまずい。。。
もちろん、画面にエラーを表示させてはいけないが、ログに保存しておかないと障害が発生した場合の原因が特定しづらくなるからだ。

で、対応策を考えてみた

1.error_reporting(0)をerror_reporting(E_ALL)に書き換える。
2.app/webroot/index.phpの78行目の
require CORE_PATH . 'cake' . DS . 'bootstrap.php';

の下でerror_reporting(E_ALL)を実行させる。

1の場合、cakeフォルダ配下になるのでできれば直接書き換えたくない。
2の場合、いったんerror_reporting(0)が実行されてからE_ALLと実行しているので、エラーを拾いきれない場合がある。

で結局、1の直接書き換えるを採用することにした。
理由は、エラー出力レベルをあちこちで変えられたくないことと、
CakePHPをバージョンアップに伴い書き換えないといけないが、これは、app/webroot/index.phpでも同じことだからだ。
ラベル:cakephp PHP framework
posted by asaton at 17:16| Comment(0) | TrackBack(0) | CakePHP | このブログの読者になる | 更新情報をチェックする

2007年03月24日

cakePHPのデバッグ方法(dBugを組み込む)

dBugの説明は下記ページ参照
PHP のデバッグが楽になる?変数の情報を見やすく表示する dBug

このライブラリをcakePHPへの組み込み方

1.venderディレクトリ(app/venders)にdBug/dBug.phpを配置する。

2.app/config/bootstrap.phpに下記コードを追加

vendor( 'dBug'.DS.'dBug' );


3.変数やオブジェクトを表示したい位置に下記コードを追加

new dBug(表示したい変数もしくはオブジェクト);


apiドキュメントは英語だし、ソース見るのもめんどくさいし(まぁ、最終手段として見なければいけないときもあるでしょうが・・・)

とりあえず、コントローラのオブジェクトに何があるのか表示させたり、モデルのアソシエーションをどうやってcakePHPが配列に格納しているのか調べたりするのに便利。

これだけで、デバッグがすごく楽になります。
posted by asaton at 21:42| Comment(0) | TrackBack(0) | CakePHP | このブログの読者になる | 更新情報をチェックする

2007年03月22日

bake.php使ってみる(2)

appディレクトリが存在していて、app/config/database.phpが存在しない状態でbake.phpを実行し質問されることに答えていくとdatabase.phpを生成してくれる。

以下のような感じで聞かれる。

What database driver would you like to use? (mysql/mysqli/mssql/sqlite/postgres/
odbc)
[mysql] >


使用するDBドライバ選択。mysqlの場合そのままエンター。[]がデフォルトになる。

What is the hostname for the database server?
[localhost] >


DBサーバのホスト名。リモートDBを使用する以外ほとんどlocalhostのままでOKでしょう。

What is the database username?
[root] >


DBのユーザ名。とりあえずローカル環境なのでrootのまま。

What is the database password?
>


DBユーザのパスワード。とりあえず設定してないのでそのままエンター。

The password you supplied was empty. Use an empty password? (y/n)
[n] >


パスワードを空のままにすると、空のままでいいか再確認される。
yと入力。

What is the name of the database you will be using?
[cake] >


データベース名。

Enter a table prefix?
[n] >


プレフィックス。とりあえずエンター。

---------------------------------------------------------------
The following database configuration will be created:
---------------------------------------------------------------
Driver: mysql
Connection: mysql_connect
Host: localhost
User: root
Pass:
Database: cake
Table prefix:
---------------------------------------------------------------

Look okay? (y/n)
[y] >

上記の設定でOKならばそのままエンター

これで、app/config配下にdatabase.phpが作成される。

これまで、database.php.defaultから作成していた場合と比べて異なる点は、$defaultしか作成されないことぐらい。

xampp等ローカル環境で使用する場合、空パスワードでOKか聞かれるときにyと入力する以外、すべてエンターでいいので楽だ。

bake.phpはこの後もModel, Controller, Viewの作成へと進むが、とりあえず終わり方が分からないので、CTRL+Cで強制終了。
(qとかで抜けれるといいのに・・・)



ラベル:cakephp PHP framework
posted by asaton at 23:17| Comment(0) | TrackBack(2) | CakePHP | このブログの読者になる | 更新情報をチェックする

2007年03月16日

bake.phpを使ってみる。

ruby on railsのscript/generateみたいに、cakephpにもプロジェクトの自動生成機能としてbake.phpというものがある。

モデル、ビュー、コントローラだけではなく、appフォルダも生成してくれるみたいだ。

cakephpを展開したフォルダのappディレクトリを削除して、cake/scripts/bake.phpを起動、質問されることにすべてEnterで答えるとappディレクトリが生成された。

もともとあったappフォルダ内と比較してみると、
appフォルダ直下にapp_controller.phpとapp_model.phpがappフォルダ内に生成されている。
コントローラはAppControllerクラスからモデルはAppModelクラスから派生するので共通事項はこれらのファイルに記述すればいいみたいだ。

できれば、ruby on railsみたいにapp直下よりも、controllers、modelsフォルダに生成してくれればいいのだが・・・
posted by asaton at 18:00| Comment(0) | TrackBack(0) | CakePHP | このブログの読者になる | 更新情報をチェックする

2007年01月27日

CakePHPの$this->log()、php4.4.4でエラー

2007/04/16追記
cake_1.1.14.4797で下記内容は修正されているようです。


CakePHPでログを残す方法で、$this->log()を知ったが
xampp 1.5.5、php4.4.4で使用してみると下記エラーが出力される。
Parse error: parse error, unexpected '(', expecting '}' in CakePHPのパス\cake\libs\file.php on line 196

file.phpの196行目は、
print ("[File] Could not create {$this->getName()}!");

文字列の中に{$this->getName()}メソッドを含んでいるのが問題みたいだ。
ためしに、{$this->name}にしてみるとOKみたいだ。({$this->getName()}はメソッドのなかで$this->nameをリターンしている)
php4では、文字列の中にメソッドを含めることはできないのかなぁ・・・

cake内のファイルは書き換えたくないから、どうしようか・・・
とりあえず、php5.2.0ではエラーは出ないのでしばらく5.2.0で動かすことにしよう。

ちなみに、202行目の
print ("[File] Could not create {$this->getName()}!");

もエラーを起こします。
posted by asaton at 21:14| Comment(0) | TrackBack(0) | CakePHP | このブログの読者になる | 更新情報をチェックする

2007年01月23日

CakePHPが実行したSQLを表示するには?

CakePHPを使用していると、どんなSQLが実行されているか知りたくなるときがある。

そんなときは、/app/config/core.phpの52行目あたりの
define('DEBUG', 1);


define('DEBUG', 2);

に変更すれば、開発中のWebアプリを実行中にブラウザ上で知ることができる。
ちなみに
define('DEBUG', 3);

にすれば、print_rみたいな表示をすることができる。

できればログに記録しておきたいのだが、無いみたいだ・・・
posted by asaton at 11:00| Comment(2) | TrackBack(0) | CakePHP | このブログの読者になる | 更新情報をチェックする

2007年01月12日

CakePHPでmod_rewriteを使わない場合の設定

CakePHPでmod_rewiteを使わない場合下記のようにすればOKみたい。

/app/config/core.php 40行目の
// define ('BASE_URL', env('SCRIPT_NAME'));

のコメントアウトをはずす
define ('BASE_URL', env('SCRIPT_NAME'));


/,/app,/webrootの.htaccessを削除

アクセス方法は、index.phpを追加し下記のようになる。
http://cakeのパス/index.php/コントローラ/メソッド/パラメータ


CodeZineの「CakePHP内の処理を理解する」(2ページ目真ん中下ぐらい)の「注:mod_rewriteのない環境では?」では画像ファイルやcssファイルを移動しないといけないと書かれているが上記の方法で移動しなくてもアクセスできる。

なお、CakePHPをドキュメントルートに配置していなくても問題なく動作する。
(mod_rewriteを使用する場合RewriteBaseを設定しなければならないが・・・)

参考サイト
CakePHPまとめ@Wiki
http://www12.atwiki.jp/nezox/pages/4.html
posted by asaton at 11:55| Comment(1) | TrackBack(0) | CakePHP | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

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