トップページ⇒php
1001コメント316KB

【PHP】フレームワーク CakePHP 6ホール目【v1.2】

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2009/03/09(月) 10:55:37ID:3PTy4GqZ
CakePHPは、Ruby on Railsの概念の多くを取り入れた、Rails流の高速開発とPHPの機動性を兼ね備えたフレームワークです。

※sage推奨
※日本語マニュアルURLを貼るときは、http://book.cakephp.org/ja/view/1/ のようにしましょう(末尾のエンコードされたタイトル部分は不要)

■本家
http://www.cakephp.org/
APIドキュメント
http://api.cakephp.org/
the Bakery
http://bakery.cakephp.org/
CheatSheet (PDF)
http://cakephp.org/files/Resources/CakePHP-1.2-Cheatsheet.pdf

■日本語公式
http://cakephp.jp/
フォーラム
http://cakephp.jp/modules/newbb/
cookbook(マニュアル)
http://book.cakephp.org/ja
0097nobodyさん2009/03/25(水) 18:00:52ID:???
>>96
はい、指定されています。
controller内でmodel::validationErrorsを出力してみると、
エラーメッセージがセットされていることも確認済みです。

CORE/cake/lib/view/helper/form.php の error()を見ると、
if ($error = $this->tagIsInvalid()) {
とあるのですが、ここが毎回falseになってるようです。
モデル、フィールド名を引数に取るメソッドらしく、
デフォルト引数がnullなので取れてない??
うーん・・・なぞだらけです
0098nobodyさん2009/03/25(水) 18:11:42ID:???
原因がわかりました。
バリデーションで引っかかった場合にredirectしていたため、そこで初期化されてたようです。

ということは、ログインのメソッドをmember_controllerに実装した場合、
ログインフォームのビューはview/members/以下におかないとダメなのでしょうか?
複数ページにログインフォームを置きたいのです。。。
0099nobodyさん2009/03/25(水) 18:33:20ID:???
>>98
つエレメント
0100nobodyさん2009/03/26(木) 10:37:51ID:???
なんでコミュニティの人って気難し屋の変な人ばっかりなの?
0101nobodyさん2009/03/26(木) 10:54:26ID:???
コミュニティってどこの?
0102nobodyさん2009/03/26(木) 15:18:49ID:???
プログラマ特に職業にしてる人なんて、そんなもんだろ。
まぁ、「ばっかり」っていうのは単なる主観だと思うが。
さらに文章だけでドンだけ分かるのかと・・。
0103nobodyさん2009/03/26(木) 22:37:43ID:???
なんかやってるよ?
http://cakephp.jp/modules/newbb/viewtopic.php?topic_id=1820&forum=16&post_id=4394#forumpost4394
0104nobodyさん2009/03/27(金) 12:25:18ID:???
paginateでアソシエーション先のデータもとってくるときの話だけど。

アクションごとに取ってきたい条件や、フィールドが違う場合どうするのが賢いの?

バインドしまくるのもなんか変な気がするし。

モデル作りまくればいいのかね
0105nobodyさん2009/03/27(金) 17:23:07ID:???
>>104
BIND
UNBIND
じゃないの?

モデルでもうちょっとスマートにBINDするとか
0106nobodyさん2009/03/28(土) 11:56:46ID:???
すみませんが、質問です。他スレで質問したのですが、レスがなかったので...。

【Apache】mod_rewriteについて語るスレ
http://pc11.2ch.net/test/read.cgi/php/1023791370/373

あるアプリケーションで、フロントコントローラであるindex.phpを、一般画面
用と管理画面用との2つ用意したいのです。アプリケーションも独立させます。

www(ドキュメントルート)
|
+ index.php(1. 一般画面用)
|
+ admin
     |
     + index.php(2. 管理画面用)

そして、http://ドメイン名/admin/... となったリクエストだけ、2.の管理画
面用index.phpに渡すようにしたいのです。

http://ドメイン名/hoge → index.php?hoge (1.の一般画面用)
http://ドメイン名/hoge/fuga → index.php?hoge/fuga (1. の一般画面用)
http://ドメイン名/admin/hoge → index.php?hoge (2. の管理画面用)
http://ドメイン名/admin/hoge/fuga → index.php?hoge/fuga (2. の管理画面用)

このような設定を、.htaccessなどで指定することはできるでしょうか?

--

要するに、admin routing を使いたくないのです。管理画面と一般画面とで
バリデーションを変えるために、モデルを独立させたいのが主な理由です。
0107nobodyさん2009/03/28(土) 19:21:55ID:???
>>106
rewriteruleじゃ駄目なの?
0108nobodyさん2009/03/29(日) 18:39:50ID:???
同じテーブルへ外部キー2つ張りたい場合のCakeの命名規約ってどうなってるの?
調べても出てこなかった
0109nobodyさん2009/03/29(日) 22:30:44ID:???
外部キーは一つでも二つでも百個でも同じだと思うが
0110nobodyさん2009/03/29(日) 23:11:16ID:???
フィールド名どうするのって話
0111nobodyさん2009/03/30(月) 01:25:18ID:???
>>110
>>109
0112nobodyさん2009/03/30(月) 01:28:40ID:???
フィールド名声源されてるのってidと時間だけだろ
0113nobodyさん2009/03/30(月) 01:55:47ID:???
え、時間も?
意識したことなかったけど、
どういう時に制限されるんですか?
0114nobodyさん2009/03/30(月) 02:46:48ID:???
作成日時はcreated
更新日時はmodified

別に規約無視して自分で手動で突っ込んでもいいけど
0115nobodyさん2009/03/30(月) 06:28:38ID:???
titleとnameもあるよ
0116nobodyさん2009/03/30(月) 11:12:14ID:???
>>112
だからid二つ作りたい時にどうするの?って聞いてるんだけど
user_idを二つ置くわけにはいかないでしょ?
外部キーって普通他テーブルのidにしか張らないよね
0117nobodyさん2009/03/30(月) 11:13:32ID:???
AテーブルにBテーブルのb_idと言うフィールドを2つ置けないでしょ?って話
0118nobodyさん2009/03/30(月) 11:30:06ID:???
だからフィールド名はなんでもいい。って皆さん教えてくれてるじゃん。
0119nobodyさん2009/03/30(月) 12:01:42ID:???
とりあえずRDBMSのリレーションとは何なのかと、そのリレーションのやり方を勉強してから噛みついて欲しい
0120nobodyさん2009/03/30(月) 12:47:34ID:???
>>116

associationを自分で書いて、foreignKeyに好きなfield's nameヲ設定シロ。
∴ foreign keyの命名ruleは、実質存在しない。

命名rule気にするときは、bakeする時
0121nobodyさん2009/03/30(月) 12:50:55ID:???
>>118
例えばrecursive=1で検索したときに、
b_id1とb_id2があったら
2つのBモデルが結果に含まれるのか?って話をしてるんだけど。
0122nobodyさん2009/03/30(月) 12:51:59ID:???
>>120
そういえばそうか
ありがと
0123nobodyさん2009/03/30(月) 12:52:32ID:???
リアルで馬鹿なのか?
0124nobodyさん2009/03/30(月) 12:54:23ID:???
外部キー制約を張るフィールドは規約でこう命名しろ、ってされてるから
同一モデルに複数張る場合は無いのかと思っただけだよ
でも実際フィールド名で規約を守る意味自体が確かにbakeのためくらいしかないね
0125nobodyさん2009/03/30(月) 14:29:00ID:???
んなこたーない
0126nobodyさん2009/03/30(月) 15:45:19ID:???
無いというだけ言わずに例示したら?
0127nobodyさん2009/03/30(月) 15:48:22ID:???
上に書いてあるじゃない
0128nobodyさん2009/03/30(月) 15:51:46ID:???
フィールド命名規約を守る意味は実質無いとは書かれてるね
0129nobodyさん2009/03/30(月) 17:59:51ID:???
cakephp1.1 から 1.2 って全然スピード変わったよね。
cakephp 1.1 はもっさり動作でサイト作った後キャッシュやらんと使い物にならんかったが
cakephp1.2 だとキャッシュしなくても全然イケル。

こりゃいい!
0130nobodyさん2009/04/03(金) 11:08:47ID:???
findでfieldsにcount()とかsum()を使うと、
戻り値が
data[0][0]['count']みたいになっちゃうんだけど、
afterFindとかで整形する方法以外で、
なんとか
data[0]['post']['count']に入れる方法ないかな?

count(*) AS Post.count
とかやってみたけどエラー出ちゃう;
0131nobodyさん2009/04/04(土) 01:15:43ID:???
ごめん、教えてちょ。

アクション内で、動的にテーブルの列の追加をやっているんだけど、
デバッグモードON時(1以上)に、列追加後にfindかけると
キャッシュからスキーマ読まれて、追加した列が取得できない。

ブラウザの更新ボタンを押せば、追加した列を取得して表示してくれる。

デバッグモードOFFであれば大丈夫なんだけど、
ONの時にもちゃんと列を取得してもらうにはどうすればいいのかな?
0132nobodyさん2009/04/04(土) 14:44:04ID:???
>>131
追加した時にキャッシュをクリアすれば良いのでは。
01331312009/04/05(日) 01:20:53ID:???
>132
キャッシュのクリアはやってるつもりなんだけど、
合ってるのかわからん。

これでいいんだよね。
$this->モデル名->cacheQueries = false;


列追加はALTER TABLE ADD をSQL直書きで、queryメソッド。

上のcacheQueriesはどこで設定したらいいか判らないから、
findする前後、列追加の前後、
いろんなところに書いてみたけど、ダメだった。

デバッグモードOFFなら大丈夫って書いたけど、
追加した列はupdateできなかった。


ローカルのテスト環境はWindows
XP、PHP5.2.8、cakePHP1.2.2.8120、MySQL5.0.67

本番テスト環境はさくらサーバ
FreeBSD、PHP5.2.8、cakePHP1.2.2.8120、MySQL4.0.27


誰か教えてちょ〜。
0134nobodyさん2009/04/05(日) 03:31:04ID:???
>>133
Modelのsaveメソッドでは条件が合えば自動でキャッシュをクリアしてる。
自前でテーブル足すとかしたらこれが効いてないんでしょうかね。

Modelクラスのソースのsaveメソッドの最後の方ででてくるから参考にしてみては。
01351312009/04/05(日) 09:18:55ID:???
>>134
サンキュー!
ちょっと見てくる!!

でも解決しなかったら、また教えてちょ。
ありがとうね!
0136nobodyさん2009/04/05(日) 09:47:10ID:???
if(isset($box)){

}
0137nobodyさん2009/04/05(日) 09:49:49ID:???
if(isset($box)){
if($box == 'hako'){
echo '処理1';
}
}

ってやらずに
if($box == 'hako'){
echo '処理1';
}

だけだとnoticeエラーが出る。
なんかスマートな書き方ありませんでしょうか。

if(isset($box) == 'hako'){
echo '処理1';
}

だと$boxがセットされているだけでtrueになっちゃうし。。。
0138nobodyさん2009/04/05(日) 10:14:24ID:???
if( isset($box) && $box == 'hako' ){
echo '処理1';
}
じゃだめ?
1行にしただけだけど。
01391312009/04/05(日) 11:07:23ID:???
>>134
解決しました!!
ありがとう!!

仰ってた通りModelクラスの最後の方の
_clearCache()を見てたら判りました!


似たような事やる方がいらっしゃるかもしれないので、
解決した方法を書いておきます。

私はバカでただのゴミ野郎なので、
判りづらい事書いちゃったらすんません。


cakePHPは現時点最新の1.2.2.8120。
まず、アプリ名\cake\libs\model 内のmodel.phpから
_clearCache() が怪しいと睨む。

同ソース内のsaveメソッド最後の方の
$db->delete($this)
辺りで、
$this->_clearCache();
こんな感じで_clearCache()が引数無しで呼ばれたりしてる。

_clearCache()、やってる事はよく判らんが、
最終的に
clearCache($assoc);
っていうのをやってる。

次に続く・・・
01401312009/04/05(日) 11:09:46ID:???
139の続き

$this付いてねーから、e()とかh()みたいに、
どこでもが使えて、みんなが大好き
アンパンマンみたいな存在の関数なんじゃねーのと思い、
アプリ名\cake\basics.php
を探してみると、
clearCache($assoc);
発見。

clearCache($params = null, $type = 'views', $ext = '.php')
こんな感じになってて、引数指定しないとデフォルトでviews、
アプリ名\app\tmp\cache\views 内を
一掃するようになってるみたい。

ならばfindかける前に
clearCache(null,'models');
すればいんじゃねーのと思い、やってみたがダメ。
もしかしたら、findの全然前に、既にモデルキャッシュ読んでるんじゃねーのと思い、
逆に、列追加(ALTER TABLE ADD)のクエリー発行した直後に書いてやったら
無事成功!!!!

ローカルテスト環境のWindows、本番のさくらサーバ環境、ともに出来てる事を確認。

以上です!
長々と失礼しますた〜。


さー!次は携帯用の表示、振り分け方法を考えないと!!!
0141nobodyさん2009/04/05(日) 14:05:16ID:???
>>138
あ!それでいけそうな予感。
ありがとうございました!
0142nobodyさん2009/04/05(日) 14:41:48ID:???
検索結果のcreatedが同一のものを
一件に纏めてpaginate compornentしたいのですが
これはcakeではどのように書けば良いのでしょう?

ヒントを頂けると有難いです
0143nobodyさん2009/04/07(火) 04:31:48ID:???
マスタをセレクトボックスに出してるんだけど
並び順をモデルのデータから自動的に行う方法ってある?
例えばorderフィールドを作っておけば自動的に参照するとか。
0144nobodyさん2009/04/07(火) 06:31:21ID:???
orderフィールドを作っておいてそれがorderだと指定すれば
0145nobodyさん2009/04/07(火) 06:32:54ID:???
ちなみに指定の仕方はlimitとかと同じ
0146nobodyさん2009/04/07(火) 06:34:05ID:???
order句を指定したくないんだけど
find時またはformヘルパーで自動的に解釈してくれる機能は無いのかなと
0147nobodyさん2009/04/07(火) 12:44:21ID:???
指定されないのに勝手にソートされたら逆にものすごい困ると思うが
0148nobodyさん2009/04/07(火) 13:21:48ID:???
afterFindでSet::sortでもかけるとか。
0149nobodyさん2009/04/07(火) 14:22:06ID:???
こんにちは
デフォルトのデザインダサいので変えたいのですが、どうすればいいのですか?^^;
0150nobodyさん2009/04/07(火) 14:28:55ID:???
>>149
スタイルシート外しちまえ。
結構テンプレあるぞ。
0151nobodyさん2009/04/07(火) 18:36:33ID:???
>>147
orderフィールドを作らなきゃ良いだけでしょ
フレームワークにその手のものは多数あるのに何言ってんの
0152nobodyさん2009/04/07(火) 20:03:52ID:???
>>149
「cakephp テンプレート」でググレカス
0153nobodyさん2009/04/07(火) 20:13:46ID:???
>>152
鬱せーカス
0154nobodyさん2009/04/07(火) 20:21:23ID:???
コントローラーが多い場合どうしてる?
フォルダで階層化してもclass名とか衝突するからうざいよね。
0155nobodyさん2009/04/07(火) 20:36:59ID:???
クラス名の衝突なんて起こったことないわ
そもそもフレームワークの枠組みの中でしかクラス作らないし
0156nobodyさん2009/04/07(火) 21:15:02ID:???
Folderモデルとか作ろうと思ったら、コアのFolderクラスと衝突するね。
コアのクラスにはCake〜とかプレフィックス付けといてくれればいいのに。
0157nobodyさん2009/04/07(火) 23:56:01ID:???
すみません
paginateのcompornentを使ったときに、
group byで纏めたデータが何件あったのか、sqlで書くところの
from *, count(data) as countみたいのをやりたいのですが、
どういう項目に書けばいいのでしょう??
0158nobodyさん2009/04/08(水) 00:20:31ID:???
>>156
こっちが適当に名前かえるしかないね。
フレームワークはそういう規約的な知識は求められても仕方が無い。
0159nobodyさん2009/04/08(水) 03:47:51ID:???
>>154
フォルダで階層化なんて普通するの?
俺そんなことやらないけど。
コントローラー作りすぎなんじゃないの?
0160nobodyさん2009/04/08(水) 03:53:25ID:???
作りすぎたところで名前が被るとかおかしい

名前が同じなら同じコントローラにすればいいし
0161nobodyさん2009/04/08(水) 04:12:52ID:???
コントローラ名というかクラス名がコアで使われてるのとかぶっちゃうんでしょ。
俺も前に添付ファイルを扱おうと思って
「File」モデルとか作ろうと思ったら作れなくてちょっと悩んだことあるw
つってもかぶりそうなクラス名はFile、Folder、Page、Configureぐらいじゃないかな?
0162nobodyさん2009/04/08(水) 04:15:54ID:???
それコントローラの増加と関係ないじゃん
0163nobodyさん2009/04/08(水) 05:47:30ID:???
containで、任意のフィールドで結合するにはどうすれば?
0164nobodyさん2009/04/08(水) 06:25:51ID:???
俺はテーブル名にプレフィックス付けるからモデル名が被ったことなんかないな。
0165nobodyさん2009/04/08(水) 06:56:54ID:???
cakephpは予約語一覧とかでてないんだっけ?
0166nobodyさん2009/04/08(水) 13:00:36ID:???
みんなフリーワード検索とかどう対応してんの?
全文検索したいんだけど。スフィンクスは使いたくないんだよね。

CAKEだけで全文検索をスマートにやるやり方を!!
0167nobodyさん2009/04/08(水) 13:02:29ID:???
>>149

views/layouts/以下に、default.ctpを作って、好きなようにHTMLを書く。
その、default.ctpが優先的に呼ばれるようになる。
0168nobodyさん2009/04/08(水) 13:50:09ID:MhIiLyHN
>>166
LIKE句じゃ駄目ずらか?
0169nobodyさん2009/04/08(水) 14:42:57ID:???
>>166
DBのを使ってます
0170nobodyさん2009/04/08(水) 14:50:25ID:???
>>168
LIKE検索より数十倍高速な全文検索
というフレーズにあこがれてるんです><
0171nobodyさん2009/04/08(水) 16:53:26ID:???
いやだからデータベースにデータが入っている以上
データベースのアクセス速度は越えられないわけで
0172nobodyさん2009/04/08(水) 17:01:13ID:???
>>171
MySQLならLIKE検索とFULLTEXT_INDEXを使った検索では何十倍も速度が違うぞ。

>>166
>>CAKEだけで全文検索をスマートにやるやり方を!!
NamazuなりLuceneなりを使うしかないんじゃない?
0173nobodyさん2009/04/08(水) 17:16:31ID:???
誰もMySQLとは言ってないので
というか汎用的なものじゃないとフレームワーク使う意味ないので
0174nobodyさん2009/04/08(水) 17:16:53ID:???
>>172
ですよねー。
でもレンタルサーバ等でそういったものを
インストール出来ない環境が多いんでなんとかしたいんですよね。

今さくっとNgramで全文検索用作ったけどinodbとmyisamが混じって気持ち悪いし
トランザクション効かないしで><
0175nobodyさん2009/04/08(水) 17:25:03ID:???
>>173
全文検索の無い主要なRDBなんてあるとおもってるの?
LIKE検索なんて比較対象じゃないわ
0176nobodyさん2009/04/08(水) 17:26:12ID:???
ちなみにLIKE検索は、前方一致しかインデックスが使われない。
○○%は速くても
%○○や
%○○%はシーケンシャルアクセスになりオンデマンドサービスで使えるものじゃない
0177nobodyさん2009/04/08(水) 17:27:30ID:???
で、俺はセナっていうMySQL用全文検索エンジン使ってる。
レンタル鯖で入れられないならRDB標準のを使えばそれまでだろ。

標準のはテーブル越しのインデックスが作れなかった気がしたがな
0178nobodyさん2009/04/08(水) 17:36:18ID:???
>>173
>>172
0179nobodyさん2009/04/08(水) 18:11:52ID:???
これでおk

$ret = `find . -type f | xargs grep あああ`;
0180nobodyさん2009/04/08(水) 18:12:55ID:???
>>178
質問者はMySQLなんて一言も言ってないのにMySQLの話をし出したから
誰もMySQLとは言ってないという指摘になったわけで
0181nobodyさん2009/04/08(水) 18:52:51ID:???
>>180
> >>178
> 質問者はMySQLなんて一言も言ってない
からこそ、RDBMSの具体例としてMySQLを挙げたんじゃないか?

君は集合の概念があまりわかってないみたいだね。
0182nobodyさん2009/04/08(水) 19:47:21ID:???
MySQLだろうとなんだろうと全文検索はある
0183nobodyさん2009/04/09(木) 00:24:09ID:GNSodjfY
しかし日本語の全文検索はというと
0184nobodyさん2009/04/09(木) 00:50:39ID:???
あるかどうか知りたいなら調べてきたら?
0185nobodyさん2009/04/09(木) 09:35:38ID:???
>>180
後半のこと
0186nobodyさん2009/04/09(木) 19:23:23ID:???
自分で作ったスクリプトもvendorsに入れて使っていいですよね?
0187nobodyさん2009/04/10(金) 01:41:28ID:TR2k1lyd
そうさ明日からお前が vendor of the ship
0188nobodyさん2009/04/10(金) 09:36:51ID:???
実践本買った
おすすめ
0189nobodyさん2009/04/10(金) 21:57:29ID:???
上のほうで話題になってたけど、
コアのクラスでモデル名と衝突しそうな
File、Folder、Page、Configure、
それぞれ、なにか代わりになるいい名前ないかな?

自作CMSに挑戦しようと思ったら、使えないモデル名ばっかりで
いっきにモチベーションが・・・
MyFile、MyFolderなんてのもカッコ悪いしなあ・・・

ConfigureはConfigurationでもいけるか。
PageはContentかな・・・?
0190nobodyさん2009/04/10(金) 22:15:51ID:???
Myのが正しい
と言うか本家のコアクラスで同じ事ができないのかを考えるべき
継承してAppつけるのも良い
01911892009/04/10(金) 22:27:15ID:???
>>189
いえ、ライブラリじゃなくて、モデル名なんですよ。
フォームに

name="data[MyFile][hoge]"

とか表示されるのは、なんかかっこ悪いので・・・

symfonyはコアのクラスにはsfってついてるのになぁ・・・
01921892009/04/10(金) 22:28:06ID:???
間違えました;
>>190 です。
0193nobodyさん2009/04/10(金) 23:01:54ID:???
>>189
File → Document
Folder → Directory
0194nobodyさん2009/04/10(金) 23:18:39ID:???
そういう言いかえをするくらいならMyの方が良い
意味的にはっきりしてる
0195nobodyさん2009/04/11(土) 02:37:51ID:1ZQJOiPg
Yourでもいいよね
Ourとか
0196nobodyさん2009/04/11(土) 13:10:59ID:???
>>188
この実践本いいよね。
安い中古商品でたら買う予定。出たら教えてチョ
09/4/8発売「CakePHPによる実践Webアプリケーション開発」3,150円
(264ページ。値段の割にチョイページ数少ない。SimpleTestの項、もう少しページ数を
割いてくれてる事を期待してたのにチョイ少ない。残念!)

09/3/14発売の「CakePHPによるWebアプリケーション開発」2,940円も安い中古商品で出た
ら買チャオ  現在2,690円(2,350+340)あり。どうしようかな?買チャオかな?
0197nobodyさん2009/04/11(土) 13:12:35ID:???
いま箱根でやってる合宿もいいよね。
ttp://d.hatena.ne.jp/yandod/
4名のEthna工作員が潜入してんだ。
ttp://d.hatena.ne.jp/sotarok/20090410/1239325405
■ このスレッドは過去ログ倉庫に格納されています