【PHP】フレームワーク CakePHP 11ホール目【v1.3】
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2011/02/16(水) 21:52:35ID:zCTGjUMqCakePHPから派生したLithium(li3)も専スレできるまではここでどうぞ
質問するときはCakePHPのバージョンを書きましょう
※sage推奨
※質問時もsageること
※他フレームワークとの比較等はスレ違いです
テンプレは>>1-5くらい
■本家
http://www.cakephp.org/
APIドキュメント
http://api.cakephp.org/
the Bakery
http://bakery.cakephp.org/
CakeQs
http://cakeqs.org/
CheatSheet (PDF)
http://cakephp.org/files/Resources/CakePHP-1.2-Cheatsheet.pdf
github - cakephp
http://github.com/cakephp
■日本語公式
http://cakephp.jp/
フォーラム
http://cakephp.jp/modules/newbb/
cookbook(マニュアル)
http://book.cakephp.org/ja
0562nobodyさん
2011/04/09(土) 14:26:08.69ID:???/model配下には各テーブルに対応したvalidationなどを作成すると思うのですが、
実装者が存在しないテーブルのmodel名でmodel.phpを作りました。
要件的に「動けばOK」なので特に問題は無いのですが、Cakeの規約に反しているように感じています。
テーブル:
files(web上にアップロードしたファイルのパスやファイル名を保持する。ここでDL可としたファイルのみ、ダウンロードなどが可能)
実装:
files.phpにはvalidation。upload機能の場合のみ、upload.phpを使用。
個人的にはfiles.phpにすべて記述すべきと思ったのですが、どうでしょうか。
0563nobodyさん
2011/04/09(土) 14:53:58.71ID:???vendorsは廃止になってないよ。
以前は、vendors/cssやvendors/img、vendors/js にファイルを置くと
webdir配下に置いてあるのと同じように使えてたけど、それが廃止になっただけ。
0565nobodyさん
2011/04/09(土) 15:00:10.04ID:???0566nobodyさん
2011/04/09(土) 15:02:11.37ID:???その実装者の実装みてないから、良い実装かどうかはなにもいえないけど、
モデルを作ったことに関しては問題ないと思うよ。
この辺を読むとなにか分かるかもね。
http://www.1x1.jp/blog/2008/04/cakephp_model_6misinformation.html
http://d.hatena.ne.jp/hiromi2424/20101122/1290379655
0567nobodyさん
2011/04/09(土) 16:44:49.74ID:???>2. DBを使わないといけない(DB操作が無いと使えない)
なるほど。
テーブルに直結していなくてもいいのですね。controllerの肥大化は確かにまずいですね。
0568nobodyさん
2011/04/09(土) 20:07:55.18ID:???コントローラのメソッドの引数が バリデーションに引っかかると消えてしまうので悩んでいます。
http://localhost/lists/additem/7
↓ バリデーションに引っかかると
http://localhost/lists/additem
cake bake で作られた edit メソッドではバリデーションに引っかかってもちゃんと引数を引き継いでいるんですが、イマイチ仕組みがわかりません。
どの辺りを調べれば良いかなど、アドバイスをお願いします。
0569nobodyさん
2011/04/09(土) 20:13:14.37ID:???よくわからんけど、URLが変化してるってなら、リダイレクトしてんじゃないの?
遷移・リダイレクトなしにURLが変化する事は流石にないし。
というかCakeがどうこうできる部分でもない。
0570nobodyさん
2011/04/09(土) 23:04:19.28ID:???なに、IDってauto_incrementじゃないとUPDATEできないの?
それ問題だろ。マジで。
0571nobodyさん
2011/04/10(日) 00:14:09.48ID:???Tag hasMany Postの関係のモデルがあるのですが、
Tagのうち、Postと結びついているもののみを取得したい場合どのように検索するのが一番よいのでしょうか?
0572nobodyさん
2011/04/10(日) 00:18:50.03ID:???form->createのarrayに'url'を追加してみたらどうでしょう。
同じ問題を見たことがある
0573nobodyさん
2011/04/10(日) 01:30:39.63ID:???Tag hasMany Postって変わった構造だな。
まぁそれは置いといて、Tag側のテーブルにカラム追加しないと使えないけど、
belongsToアソシエーションのcounterCache使えば?
Postモデルの$belongsTo = array('counterCache' => true) して、
tagsテーブルにpost_countフィールド作れば良かったはず。
詳しくはぐぐれ。
0574nobodyさん
2011/04/10(日) 02:04:25.16ID:???TagとPostの名前を例に使ったのはちょっと不適切でしたね。
counterCasheの存在を知らなかったので、調べてみます。
ありがとうございました。
0575nobodyさん
2011/04/10(日) 18:52:08.74ID:???また一人で開発しようとする場合は何人日かかります?(デザイン抜きで)
そもそも、その規模のものはcakephpでは運用無理ですか?RoRとかのほうがいいのかな?
0580nobodyさん
2011/04/10(日) 21:04:02.20ID:???規模なら結構作れると思うよ。俺も似たようなSNS作ってるし。
アクセス増加はキャッシュでどうにかなると思う。
Cakeのじゃなくてmemchachedを使うとか。
0581nobodyさん
2011/04/10(日) 21:44:52.07ID:???CakeってDBのレプリケーションに本体レベルで対応してなよね?
Cakeは中・小規模向けだと思うから、mixi規模は無理じゃないかな。
機能だけそろえるってなら話は別だけど、
シンプルなSNSから発展していろんな機能がついてるから、
作るのはかなり時間かかると思うぞ。
開発者の能力にもよるだろうけど、普通に3桁人月じゃないかな。
0582nobodyさん
2011/04/10(日) 23:46:27.64ID:???0583nobodyさん
2011/04/11(月) 02:22:00.62ID:???コンテンツの事まで言うと、
アバターなんかも3Dで作った物をgifに変換して・・・みたいにしてるみたいだし
cakeなんかで作る部分とは違う技術が必要だよね。
0584nobodyさん
2011/04/11(月) 03:36:02.16ID:???てか、Cakeで生成するファイルでDB分けられるんだから、
そういう負荷対策出来ると思うんだけど。
0585nobodyさん
2011/04/11(月) 10:36:06.39ID:???List, SubList にそれぞれ no という項目あって、それぞれを no 順で取得したいのですが、
List から find('all') で取得した場合 List は no 順になっても SubList が id 順になってしまいます。
以下のように取得して View に渡しているんですが、いいやり方ありますでしょうか?
$this->set('lists', $this->List->find('all', array('order' => array('List.no, List.id DESC'))));
0586nobodyさん
2011/04/11(月) 11:13:07.76ID:???0587nobodyさん
2011/04/11(月) 16:45:08.99ID:???http://log.ryti.ch/items/view/3773
0588nobodyさん
2011/04/11(月) 18:51:32.41ID:???結局SQL書いてるわ....
0589nobodyさん
2011/04/11(月) 18:52:42.64ID:???それはやってみたんですが、
$this->List->find('all', array('order' => array('ListSub.no, ListSub.id DESC')
とすると ListSub なんてないと怒られてしまいます。
0590nobodyさん
2011/04/11(月) 19:03:42.57ID:???array('order' => 'List.no DESC, ListSub.id DESC')
か
array('order' => array('List.no' => 'DESC', 'SubList.id' => 'DESC'))
のどっちかにしろって話じゃないの?
0591nobodyさん
2011/04/11(月) 19:29:41.23ID:???何度もごめんなさい。
書き方変えてみたけどダメでした。
List から id はとってこれるけど、
$this->List->find('all', array('order' => array('List.id' => 'DESC')
こうすると ListSub.id なんてカラムはないよと言われるんです。
this->List->find('all', array('order' => array('ListSub.id' => 'DESC')
SQL Error: 1054: Unknown column 'ListSub.id' in 'order clause'
List は ListSub を hasMeny、ListSub は List を belongsTo でそれぞれ関連づけています。
まだモデルの仕組みなどわかってない部分が多いので、ここを調べろなどのアドバイスでもお願いします。
0592nobodyさん
2011/04/11(月) 20:45:04.42ID:???悩むくらいならそれもありだと思う。
ナンバリングのために、あるテーブルにsaveした場合の処理は、
sqlでUPDATE文書いた。
0593nobodyさん
2011/04/11(月) 21:19:28.81ID:???たぶんやりたいことは
this->ListSub->find('all', array('order' => array('ListSub.id' => 'DESC')
なんじゃないか
0594nobodyさん
2011/04/11(月) 21:41:28.44ID:???コントポーネントの数がすごいことになった。
0596nobodyさん
2011/04/11(月) 23:27:03.36ID:???0597513
2011/04/11(月) 23:27:39.13ID:???親切なレスありがとうございます。
パーミッションは問題無くて、単に拡張子が大文字になってただけだった。
すぐにお礼レスしたかったけど、規制かかって書き込めず、忘れてしまってた。
0598nobodyさん
2011/04/12(火) 00:32:09.98ID:???数えたら50〜60ぐらい。たいしたことなかった。
コントローラも同じくらい。
ゲームはロジックが複雑だから、コントローラにごちゃごちゃ書きたくなくてコンポーネントに書いた。
0599nobodyさん
2011/04/12(火) 01:03:22.27ID:???Cakeだと重くね?
0601nobodyさん
2011/04/12(火) 02:05:11.25ID:???0602nobodyさん
2011/04/12(火) 02:31:07.71ID:???0603nobodyさん
2011/04/12(火) 10:52:30.89ID:???フレームワークを変えても重いのはあまり変わらない事が多い気がする。
で、対処の方法もキャッシュ効かせたりとかで、やることも変わらない。
0604nobodyさん
2011/04/12(火) 11:41:59.99ID:???それでcakeが悪いとか…頭ごなしに批判する奴は大抵こういうふうに理解が浅いよな。
0605nobodyさん
2011/04/12(火) 12:01:58.45ID:???それにFW使ったら重くなるのは当然だろ。
0607nobodyさん
2011/04/12(火) 12:52:39.39ID:???だいたい1コントローラあたり数個使ってる
0608nobodyさん
2011/04/12(火) 17:08:21.81ID:???fixtureの$recordsに配列でデータを記載しておくと、テストごとにこの$recordsの値で
テーブルが初期化されます。
この$recordsをテストごとに切り替えたいのですが、どのようにすればよいでしょうか?
たとえばtestAは$records、testBは$records2を使う、といった具合です。
0609nobodyさん
2011/04/13(水) 05:21:58.13ID:???自分でつくったのは、 var $components で読み込まないと使えない。
bakeで自動作成されたコードはどこでSession読み込んでるんだろう??
0610nobodyさん
2011/04/13(水) 11:38:58.52ID:89duiIHJerror404をオーバーライドすると、HTTP/1.1 200 OKが帰ってくるようになる。
app/app_error.php
<?php
class AppError extends ErrorHandler {
function error404($params) {
extract($params, EXTR_OVERWRITE);
$this->error(array(
'code' => '404',
'name' => 'Not found',
'message' => sprintf(__("The requested address %s was not found on this server.", true), $url, $message)
));
$this->_stop(1);
}
}
?>
このオーバーライドしたerror404を消したり、
parent:error404($params);
とかにすると、404 Not found が帰ってくるようになる。
バグかな?
関数の中身は、
cake/console/error.php の error404 をまるまるコピーしてます。
0611nobodyさん
2011/04/13(水) 11:51:22.60ID:89duiIHJ<p class="error">
<strong><?php __('Error'); ?>: </strong>
<?php printf(__('The requested address %s was not found on this server.', true), "<strong>'{$message}'</strong>"); ?>
</p>
こうなってたから
$this->cakeError('error404' array('message' => '削除されてるよ'));
みたいにやってた。
HTMLのmessageはurlのことで、
PHP側のmessageはステータスメッセージのことなのな。
ややこしすぎワロタ
0612nobodyさん
2011/04/13(水) 23:16:26.44ID:???UPDATE時に、同一テーブルの現在の値を取得する必要ができました。
model.php内で this->$date とやってももちろんダメでした。
sqlを書いてクエリーとして得た結果をarrayに代入することで要件は満たせたのですが、
何かもっと良いスマートな方法は無いでしょうか?
0613nobodyさん
2011/04/13(水) 23:28:39.98ID:JM0N9TIZ複数のバリデーションをかける場合、
バリデートする順番を指定したいのですが、
できますでしょうか?
例えばログインIDに対して半角英数チェック・文字数チェック
・独自バリデーションの3つをする場合で、
独自バリデーションではDBに値を見にいって実際に存在するかを
チェックするとします。
その際に半角英数チェックと文字数チェックの前に
独自バリデーションが走ってDBにアクセスしに行っちゃうと
SQLエラーになってしまいますよね。
その他にもバリデーションに優先順位を付けたいと思う場面って
多々あると思うんですが、そのような方法があれば教えて下さい。
0614nobodyさん
2011/04/13(水) 23:56:57.25ID:???出来ます。
validationのarrayに実行したい順番で代入すれば、上から順に処理します。
例題や公式ページに1項目に対しての複数のvalidation実装例は載っているはずです。
0616nobodyさん
2011/04/16(土) 00:30:56.91ID:IZGr1QKIModel::save()でINSERTやUPDATEできますか?
0617nobodyさん
2011/04/16(土) 00:37:26.03ID:???あまり想定はされてなさそうな事だから、こんなとこで聞くよりも確実だぞ。
そういえば確か、ユニークIDを生成して、それを主キーの値に使う方法があった気がするな。
ユニークIDは確かStringだったと思うぞ。
0618nobodyさん
2011/04/16(土) 16:57:45.01ID:???どんな方法で実装すればいいのでしょうか?
adminページを作ってアクセス制限するか、投稿フォームなどと同じようにトークンを使うか
という方法を考えましたが他に一般的な方法やライブラリなどあれば教えてください
0619Perl忍者lvl4 ◆M5ZWRnXOj6
2011/04/16(土) 17:00:51.46ID:uU0OblS5生 同 .じ . /´ | (ゝ___) い
.し 士 .レ .__/'r-┴<ゝi,,ノ ro、 は、
.な で .ベ ∠ゝ (ゝ.//` ./`| }⌒j
.い し .ル } ⌒ /`ヽ、_∠l,ノ ・ヽ´
.! ! か の / ´..:.} >、、___, .r、 ソ、`\
/ ..:.:.} / |∨ ` ̄
/ ..:.:./ | 丶
/ _、 ..:.:.:.{ .{.:.:. \
{ ..:Y .ゝ、 {.:.:.:.:. ヽ
|、 ..:/ 丿 .:〉 >.- ⌒ . ヽ
/ {. ..:./ ソ ..:./ .( ..:.:.:` ..:}
./..:.:}.:.:./ ヘ、 ..:./ .\ ..:.:r_,ノ、.:.:}
./..:.:/|.:/ {.:./ X.:.:}.} X X
/..:.:/ .}.:| }:/ .Y丶ヽ Y.:Y
. __/.:/ { } 《.〈、 _,,__>.:》丶 Y.:\
/.:.:.:.:.::/ !.:.:ゝ ゝ.:. ̄ヾ ´:.:.:.:.:.:.:.:.:ヾゝ \.: ̄>
0621nobodyさん
2011/04/18(月) 22:09:29.52ID:???みたいな書き方ってCakePHPではどうすればいいのでしょうか?
0622nobodyさん
2011/04/18(月) 22:47:14.55ID:???0623nobodyさん
2011/04/18(月) 23:24:01.55ID:???0624nobodyさん
2011/04/18(月) 23:33:50.50ID:???$cond = array('Model.id' => intval($id));
$this->Model->updateAll($field,$cond);
こんな感じ?
0625nobodyさん
2011/04/19(火) 00:03:43.86ID:???もちろんpointは数値列だよね。
0626nobodyさん
2011/04/19(火) 01:32:17.04ID:???AppControllerのbeforeFillterでConfigure::write()を使って書きこんで、
コントローラとビューでConfigure::read()で読み込むのって
使い方合ってますかね?
0627nobodyさん
2011/04/19(火) 10:29:11.63ID:???0628nobodyさん
2011/04/19(火) 18:32:47.47ID:???setだとキー追加じゃなくて完全に代入されるイメージ
app_controllerに作るか
0629nobodyさん
2011/04/19(火) 22:51:20.45ID:???どこかに書いといて欲しい
0630nobodyさん
2011/04/19(火) 22:53:32.33ID:???0631nobodyさん
2011/04/19(火) 23:14:41.15ID:???0632nobodyさん
2011/04/20(水) 00:31:33.15ID:NKIgYW4jForm::input()を使ってる記事が多いんですが、
これって1.3でも使って良いメソッドなんでしょうか?
あと、1.3で<input type="image">を出力したいんですが、
Formヘルパーのどのメソッド使えばいいですかね?
0633nobodyさん
2011/04/20(水) 01:01:40.71ID:???0634nobodyさん
2011/04/20(水) 01:11:12.04ID:???ありがとうございます。
Formヘルパーではないのですね。
Form::inputあたりをつかうのかと予想していたのですが、
1.3のCookbookにもメソッドが載ってないんですよね。
かなり謎です。
0635nobodyさん
2011/04/20(水) 09:42:08.04ID:???ググルのもいいけど、cookbook見てみたら。
http://book.cakephp.org/ja/view/1383/%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0
input使うと、テーブル定義をみて自動でinputかtextareaとか分けてくれる。
0636nobodyさん
2011/04/20(水) 10:15:29.58ID:???マニュアルは英語版から読むようにしよう。
form->submitに画像のURLを入れれば自動でできる。
echo $this->Form->submit('ok.png');
↓
<div class="submit"><input type="image" src="/img/ok.png"></div>
0637nobodyさん
2011/04/20(水) 14:51:42.93ID:???ビヘイビアの方を呼びたい場合はどう書けば良いのでしょうか
0638nobodyさん
2011/04/20(水) 23:32:04.82ID:???具体的には<link rev="made" href="mailto:foo@bar.jp" />ってのを書きたいんですけど
html->linkとやるとa要素になってリンクが張られてしまいます
0639nobodyさん
2011/04/21(木) 00:46:29.17ID:fExhpbbEバリデーションエラーでその画面に戻った時にその値に戻っちゃうんですが
これってどうしたらいいですかね?
0640nobodyさん
2011/04/21(木) 01:42:12.03ID:???英語版cookbookにそれこそ載ってるよ。
もしくはGoogle検索「CakePHP a href」とかやればいくらでも実例が出てくる
0641nobodyさん
2011/04/21(木) 01:43:38.32ID:???本来のHTMLで書きたい要素を
arrayに
'name' => 'value'
で書いてブラウザーで開いてソース見れば、解釈されているかどうか分かって楽だった
0642nobodyさん
2011/04/21(木) 13:32:49.30ID:???0643nobodyさん
2011/04/21(木) 22:02:14.62ID:???array(
"key" => "value"
)
0645nobodyさん
2011/04/22(金) 00:04:27.08ID:???これを
http://cakephp/foo/posts/edit
http://cakephp/bar/posts/edit
とカテゴリで分けたい。
こういう場合はやっぱり FooController と BarContoroller してルーティング設定で命名規則無視するしかないですか?
できれば PostController のみで終わらせたいんだけど、
admin_edit で admin/edit になるみたいに foo_edit で foo_edit にする方法ってあります?
ちなみに admin ルーティングも残しておいてさらに追加したいんです。
0646nobodyさん
2011/04/22(金) 00:19:11.61ID:???foo/posts/edit とbar/posts/edit はやることが違うの?同じ事をやるの?
fooとかbarは種類が決まってるの?
0648nobodyさん
2011/04/22(金) 00:43:08.35ID:???やることはほとんど一緒です。
ただ読みに行くデータが違います。
テーブルごと分けるか、種類を分けるフィールド追加して区別するかはわかりませんが、
とりあえずカテゴリごとの動作ということにしたいんです。
0650nobodyさん
2011/04/22(金) 10:38:38.24ID:???すんません、HTMLヘルパーに自分で書く必要がありますね。
cake/libs/view/helpers/html.php
の
function link
を参考にして、
自分で a が付かない<link rev=〜を出力するように頑張ってください。
0651nobodyさん
2011/04/22(金) 12:48:06.33ID:???モード7の時はSJISで送信され、モード8の時はUTF-8で送信されます。
Cakeでは、ビューをUTF-8で作り、出力時の文字コードは
<?php echo $html->charset('SJIS'); ?>
と言う感じでShift_JISにしています。
ただ、$form->createのencodign(accept-charset)はutf8のままなので、
UTF-8としてデータが送信されてくると思うのですが・・・原因が分かりません。
古い端末だと文字コード変換が上手く行かないとかあるのでしょうか?
直接Cakeの質問と違うかも知れませんが、分かる方いたら教えて下さい
0652nobodyさん
2011/04/23(土) 00:32:58.36ID:???普通のINSERT文をModel::execute()で実行しようとするとシンタックスエラーに
なってしまいます。
でもちゃんと正しいINSERT文なんです。
ちなみにModel::query()で実行すると正しく実行されます。
Model::execute()って何か問題があるのでしょうか?
0653nobodyさん
2011/04/23(土) 01:09:09.71ID:???追いかけてみたらいい
0654nobodyさん
2011/04/23(土) 01:43:52.45ID:???0655nobodyさん
2011/04/23(土) 05:42:00.71ID:???ビヘイビアの方を呼びたい場合はどう書けば良いのでしょうか
0656nobodyさん
2011/04/23(土) 06:34:39.22ID:???0657nobodyさん
2011/04/23(土) 06:50:55.20ID:???そういうことをちゃんとマニュアルに書いておいてくれればいいのにと思います
0658nobodyさん
2011/04/23(土) 10:16:16.61ID:???マニュアルにない使い方するときは、ソースコード追ったほうがいいよ。
0659nobodyさん
2011/04/23(土) 11:25:02.93ID:???下の例では Data に Category を belongsTo して、
Category は Auther を belongsTo、Data を hasMany してます。
$this->Data->find('first', array(
'conditions' => array('Data.id' => $data_id),
'recursive' => 2
));
Array(
[Data] => Array(
[fields] => 'value',
[Category] => Array(
[fields] => 'value',
[Auther] => Array(
[fields] => 'value'
)
[Data] => Array(
[fields] => 'value'
)
)
)
)
これで find すると data['Data']['Category'] 以下にもう一度 Data を取得してしまいます。
data['Data']['Category']['Auther'] は欲しいので、アソシエーションを利用してData を読まずに Auther だけ取ってくる方法はありますか?
0660nobodyさん
2011/04/23(土) 11:26:52.00ID:???読みにくくなってしまったので・・・。
$this->Data->find('first', array(
'conditions' => array('Data.id' => $data_id),
'recursive' => 2
));
Array(
[Data] => Array(
[fields] => 'value',
[Category] => Array(
[fields] => 'value',
[Auther] => Array(
[fields] => 'value'
)
[Data] => Array(
[fields] => 'value'
)
)
)
)
よろしくお願いします。
■ このスレッドは過去ログ倉庫に格納されています