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

【PHP】フレームワーク CakePHP 11ホール目【v1.3】

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2011/02/16(水) 21:52:35ID:zCTGjUMq
CakePHPは、Ruby on Railsの概念の多くを取り入れた、Rails流の高速開発とPHPの機動性を兼ね備えたフレームワークです
CakePHPから派生した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
0639nobodyさん2011/04/21(木) 00:46:29.17ID:fExhpbbE
formヘルパーでラジオボタンとかチェックボックスとかにcheckedの設定をすると
バリデーションエラーでその画面に戻った時にその値に戻っちゃうんですが
これってどうしたらいいですかね?
0640nobodyさん2011/04/21(木) 01:42:12.03ID:???
>>638
英語版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:???
それならもうHTMLで書けよ
0643nobodyさん2011/04/21(木) 22:02:14.62ID:???
書き方は合わせたい。
array(
"key" => "value"
)
0644nobodyさん2011/04/21(木) 23:30:40.48ID:???
>>640
CakePHP a hrefでぐぐったらリンクのことしかでてこないんですが
0645nobodyさん2011/04/22(金) 00:04:27.08ID:???
http://cakephp/posts/edit
これを
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:???
>>645
foo/posts/edit とbar/posts/edit はやることが違うの?同じ事をやるの?
fooとかbarは種類が決まってるの?
0647nobodyさん2011/04/22(金) 00:25:03.43ID:???
>>645
mod_rewriteで何とかしろや。
0648nobodyさん2011/04/22(金) 00:43:08.35ID:???
>>646
やることはほとんど一緒です。
ただ読みに行くデータが違います。
テーブルごと分けるか、種類を分けるフィールド追加して区別するかはわかりませんが、
とりあえずカテゴリごとの動作ということにしたいんです。
0649nobodyさん2011/04/22(金) 01:19:33.66ID:???
>>648
なんとかRouterでPostControllerのedit に誘導するのがいいと思うけどね。
0650nobodyさん2011/04/22(金) 10:38:38.24ID:???
>>644
すんません、HTMLヘルパーに自分で書く必要がありますね。

cake/libs/view/helpers/html.php

function link
を参考にして、
自分で a が付かない<link rev=〜を出力するように頑張ってください。
0651nobodyさん2011/04/22(金) 12:48:06.33ID:???
iモードシミュレータIIで携帯フォームの動作確認をしているのですが、
モード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:???
CakePHPの1.3でDBの更新処理をSQLで直書きしなくてはならなくなったのですが、
普通のINSERT文をModel::execute()で実行しようとするとシンタックスエラーに
なってしまいます。
でもちゃんと正しいINSERT文なんです。
ちなみにModel::query()で実行すると正しく実行されます。
Model::execute()って何か問題があるのでしょうか?
0653nobodyさん2011/04/23(土) 01:09:09.71ID:???
どこのexecute()が実際呼ばれてるか
追いかけてみたらいい
0654nobodyさん2011/04/23(土) 01:43:52.45ID:???
CakePHPのdebug出力してみたら?
0655nobodyさん2011/04/23(土) 05:42:00.71ID:???
モデルとビヘイビアに同じ名前の関数がある場合、$this->関数名で呼ぶとモデルの方が呼ばれるようですが、
ビヘイビアの方を呼びたい場合はどう書けば良いのでしょうか
0656nobodyさん2011/04/23(土) 06:34:39.22ID:???
$this->Behaviors->BehaviorName->method($this, ... );
0657nobodyさん2011/04/23(土) 06:50:55.20ID:???
ありがとう
そういうことをちゃんとマニュアルに書いておいてくれればいいのにと思います
0658nobodyさん2011/04/23(土) 10:16:16.61ID:???
マニュアルに書くレベルのものとそうではないものもあると思うけどね。
マニュアルにない使い方するときは、ソースコード追ったほうがいいよ。
0659nobodyさん2011/04/23(土) 11:25:02.93ID:???
hasMeny や belongsTo で指定のテーブルだけ取得することは可能でしょうか?
下の例では 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:???
>>659です。
読みにくくなってしまったので・・・。

$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'
   )
  )
 )
)

よろしくお願いします。
0661底辺2011/04/23(土) 11:34:30.80ID:???
>>660
containerビヘイビアを使いなさい
0662nobodyさん2011/04/23(土) 12:18:02.93ID:???
>>661
ググっても出てこないんですが、サードパーティですか?
もう少し詳しくおしえてもらっていいですか?
0663nobodyさん2011/04/23(土) 12:23:07.77ID:???
ログイン管理って要はセッション管理なわけだし、
Auth使うよりも自作(か、セションコンポーネント)使う方がいいんじゃね?

なんかAuthの使い勝手が良いんだか悪いんだか分からなくなる時がある。
0664底辺2011/04/23(土) 15:05:11.60ID:???
>>662
containか?
最初からcakeに入ってるよ。

アソシエーションは、時間かけて勉強した方があとあと役に立つから、焦らず、ゆっくり。
0665底辺2011/04/23(土) 15:06:38.87ID:???
>>663
俺もある。
一つ言えるのは、ログイン後に前のページに戻るのが楽。
0666nobodyさん2011/04/23(土) 16:31:56.32ID:???
うちもセッション管理は自前で持ってる。
ユーザー区分が3つあって、見せていい画面が決まっていて、その遷移もphp上で実装した。
0667nobodyさん2011/04/23(土) 16:40:36.63ID:???
Authに限らずセッション周りは色々挙動が謎すぎて、全部自前で作って使ってる
まあタダだしそのくらいはしょーがないよね
0668nobodyさん2011/04/23(土) 21:21:23.23ID:???
やっぱり、みんなセッション管理は自前だったかw
俺はなんとかCaleの機能で出来ないかと悪戦苦闘していたが、
やりづらいこともあるよな。こだわりすぎはよくないな
0669nobodyさん2011/04/23(土) 23:34:00.74ID:???
Cake自体が完成されたFWじゃないからな
しかし使えないほど駄目でもないのが悩み所
0670nobodyさん2011/04/24(日) 00:03:38.71ID:???
いやー、他でMVCを学んだ人には話が通じやすくていいよ。
0671nobodyさん2011/04/24(日) 00:23:08.15ID:???
Cakeはmod_rewriteに依存しすぎてるの駄目なんだよな。
テスト環境で他のアプリと相乗りさせようとしたらハマりまくった。
0672nobodyさん2011/04/24(日) 00:27:18.69ID:???
それはあるな。サイトの規模が大きくなるほど、ファイル構造がややこしくなるし。
0673nobodyさん2011/04/24(日) 00:52:08.70ID:???
mod_rewriteのせいでクエリストリングがurl=xxx付加されて変わるから
OAuthの生成シグネチャが合わなくなってハマった事がある
0674nobodyさん2011/04/24(日) 17:01:45.23ID:YIdiQXQP
htmlしか書けない初心者ですがcakephpでハマってます。
トップページのctpファイルに貼ったswfから
他のページのctpファイルにリンクしたい場合、
どのようなasを書けばリンクできるのでしょうか?
0675nobodyさん2011/04/24(日) 17:55:47.22ID:???
flashVarsに基底URLか完全なURLを渡せばおk
0676nobodyさん2011/04/24(日) 21:59:25.37ID:???
ちょうど上にAuthの話題があるので、質問します。

ログイン→リダイレクト→ログイン後のページ

に移動するのがAuthの機能だと思いますが、
ログイン成功時に、ユーザ情報以外のセッションを付加して
ログイン後のページに推移させるにはどうすればいいのでしょうか?
06776742011/04/24(日) 22:00:11.95ID:YIdiQXQP
>>675
レスありがとうございます。
ヘッダー、フッター、サイドメニューをctpで出力し、
コンテンツ部分をiframe(ファイル名を十進数にして出力)で
表示させてるらしいのです。
ctpでのphpは以下のような記述です。
-------------------------------------------
<?php global $directory;
$url = $this->Html->url(array('controller' => 'common',
'action' => 'ヘッダー、フッター、サイドバー出力.ctp'),
array('escape' => false));
?>
<a href="<?php echo $url;?>/iframeurl:<?php echo bin2hex($directory.'aaaa/bbbb.html');?>">リンク</a>
----------------------------------------------------
上記で出力されるページを、
swf内のボタンでactionscriptでリンクさせたい場合、
以下のように単純な指定でリンクすることはできますか?
疎くてflashVarsすらよくわからず申し訳ございません。。

on (release) {
getURL("http://ドメイン/ctp格納ディレクトリ/ヘッダー、フッター、サイドバー出力.ctp/iframeurl:<十進数で出力されたaaaa/bbbb.html>");
}

0678nobodyさん2011/04/25(月) 11:04:24.75ID:???
>>676
$this->Auth->autoRedirect = false; にして、 login() ルーチン内で

if ($this->Auth->user()) { // ログイン成功時
  $this->Session->write('xxxx', 'yyyy'); // セッション情報追加
  $this->redirect($this->Auth->redirect()); // ログイン成功時のリダイレクト先に飛ばす
}

みたいにすればいいんじゃないかな
0679nobodyさん2011/04/25(月) 22:43:47.68ID:???
>>678
うちもそれで実装してます。
書きたいこと全部Sessionに書いてファイルとして保存。
06806762011/04/25(月) 23:10:01.61ID:???
>>678
ありがとうございます。autoRedirect = falseがキモですね。
この方法でやってみます。
0681nobodyさん2011/04/26(火) 00:35:52.43ID:ITZhMk+T
会員登録画面で

登録画面→確認画面→完了画面

直接完了画面のURLを叩いた場合に
エラー画面に飛ばすみたいなのは
どのように実装するのがスタンダードでしょうか?
0682nobodyさん2011/04/26(火) 00:39:30.76ID:???
普通はセッションじゃないすか?
0683nobodyさん2011/04/26(火) 00:49:03.08ID:???
if (empty($this->data)) {
  $this->Session->setFlash('登録画面からやりなおしてください');
  $this->redirect('/xxxx/error');
}
}
06846812011/04/26(火) 01:17:51.28ID:???
すみません、完了画面でもバリデーションはやってるので
$this->dataの値はチェックしてました。

完了画面ではユニークなキーを発行してmemcachedにフォームの値を入れて
確認メールを送信するのですが、
完了画面でブラウザの更新ボタンを押すともう一度
ユニークなキーでmemcachedにフォームの値を入れて
確認メールを送信してしまうのです。

これどうしたらいいかなーと。
0685nobodyさん2011/04/26(火) 09:35:16.53ID:???
サイトで、
hogehoge.com/controller/action/

hogehoge.com/abc/controller/action/

を同じアクションにして、かつ
リンクはabcのprefixつきにしたいのですが、良い方法ありますでしょうか?

動きとしてはprefixルーティングで abc_indexを呼ぶのではなくindexを呼ぶようにしたいのです。

dispatchを書き換えていまはうまくいっていますが、スマートでないような気がして、、

0686nobodyさん2011/04/26(火) 09:49:38.99ID:???
>>684
俺はPOSTで画面毎に値を渡してチェックしてるよ。

登録
<input type="hidden" name="next" value="confirm" />
確認
<input type="hidden" name="next" value="complete" />

フォームヘルパーじゃなくて普通のHTMLで用意すれば
$this->dataの配列内で差別化できるし。
昔ながらのやり方だけど、これで良いんじゃないかな?
0687nobodyさん2011/04/26(火) 17:24:39.04ID:???
CakePHPで、コントローラにどのビューから飛んできたかを取得するには
$this->referer()しかないでしょうか?
0688nobodyさん2011/04/26(火) 18:29:04.76ID:???
コントローラにアクセスした時、セッションかクッキーで保存すれば?
0689nobodyさん2011/04/26(火) 23:17:20.63ID:???
>>685
URLが異なるならviewもcontrollerも別ファイルにして、
共通のphpを読むようにしたら?
0690nobodyさん2011/04/27(水) 00:01:18.98ID:???
2ch のスレッドとメッセージのような t hasMany m の関係で、
スレッドの一覧を取りたいんですけど、メッセージの投稿日時で
スレッドをソートしたいときは、どう書けば良いのでしょうか?
0691nobodyさん2011/04/27(水) 07:54:41.56ID:???
SQLのORDER BYに date型のcolumn DESC
でいいのでは?
06926902011/04/27(水) 19:33:54.84ID:???
>>691
レスありがとうございます。
説明不足で申し訳ありません。
$this->paginate での条件指定方法が分からないのです。
06936902011/04/27(水) 19:36:38.21ID:???
こんな感じでやってみたのですが、SQL をデバッグで見ると
FROM に message が指定されておらず・・・。

$this->paginate = array(
'contain' => array(
'Message' => array(
'fields' => array('id', 'created')
)
),
06946902011/04/27(水) 19:39:00.83ID:???
'conditions' => array(
'Thread.delete_flag <>' => 1
),
'limit' => 10,
'order' => array(
'Message.created' => 'desc' // ダメなとこ
)
);
0695nobodyさん2011/04/27(水) 22:56:05.83ID:???
test
0696nobodyさん2011/04/27(水) 22:59:12.39ID:???
>>690
$usesにMessageを追加して
$this->paginate = array('Message', array(...
とするとか
0697nobodyさん2011/04/28(木) 10:44:52.76ID:???
その場合は、Messageモデルのhasmanyの定義にorderを書く。

それが嫌な場合はページネートにjoin句を書く。

$this->paginate = array(
Thread=> array(
'conditions' => array(),
'limit' => 24,
'order' => array(),
'joins' => array(
    array(
                        'type' => 'LEFT',
                         'alias' => 'Message
                         'table' => ''messages',
'Message.created' => 'desc'
)

))
);
06986902011/04/28(木) 21:41:37.52ID:???
>>696
すみません。私が理解出来ず、うまく行きませんでした。
SQL 文を見ると "SELECT Thread.Array, ..." と訳の分からん状態に。
でも、ご助言ありがとうございました。
06996902011/04/28(木) 21:50:08.53ID:???
>>697
Thread の一覧では created DESC ですが、Thread の内容、
つまり Message の一覧では、created ASC にしたいので、
hasMany の定義に書くことに抵抗感がありました。
(あまり CakePHP のこと分かっていないのですが・・・)
07006902011/04/28(木) 21:52:25.68ID:???
冷静に SQL でやりたい事を書いていたら、DISTINCT か
GROUP BY を使うことなると今更ながら気づきました。

ただ(MySQL の仕様なのか)意図した形でソートできず、
結局 Thread の modified フィールドを Message の
挿入時に update するのが手っ取り早いのかな・・・と
諦めの段階に入っています。

レス下さった皆様、ありがとうございました。
また、何かあれば宜しくお願いします。
0701底辺2011/04/29(金) 00:48:18.72ID:???
>>700
こちらこそ、よろしくね。
0702nobodyさん2011/04/29(金) 12:03:24.33ID:???
CakePHP で共通の関数ってどこに置くのがセオリーですか?
コンポーネント、ビヘイビア、ヘルパー全部で共通で使いたいってときがあるんですけど、そういう場合どうしてますか?
0703nobodyさん2011/04/29(金) 12:12:37.08ID:???
うちはvendors/
vendors/common_function.php
0704底辺2011/04/29(金) 14:15:06.85ID:???
俺はbasic.php
0705nobodyさん2011/04/29(金) 15:04:24.70ID:???
俺は
/cake
└/common ←ここに入れてる
0706nobodyさん2011/04/29(金) 15:23:45.09ID:???
俺は/ore/←ここに入れてる
0707nobodyさん2011/04/29(金) 17:07:06.27ID:???
Cakeに合わせて/Strawberry
0708nobodyさん2011/04/29(金) 22:41:36.85ID:???
>>706
>>707
おもしろいのでコテつけてください
0709nobodyさん2011/04/29(金) 23:16:13.52ID:???
普通はapp/libsでしょ
07107072011/04/29(金) 23:54:09.93ID:???
>>708
もちろん冗談ですよ。
0711nobodyさん2011/04/30(土) 16:06:00.19ID:???
>>707
俺も頼む。
おもしろすぎるのでコテつけてください。
0712nobodyさん2011/04/30(土) 18:46:27.76ID:???
コテは重要だよね
NGにしにくいし
0713nobodyさん2011/04/30(土) 22:44:34.97ID:???
かけPHP
0714nobodyさん2011/05/02(月) 00:32:14.07ID:???
XP+XAMPPだと何故かレスポンスが悪かったcakephpだけど
Windows7に換えたらその現象がなくなった・・・気がする
0715nobodyさん2011/05/02(月) 00:50:25.96ID:???
>>714
マジ!?俺も悩んでるんだけど、7だとそんな違うのかよ・・・
0716nobodyさん2011/05/02(月) 06:49:05.23ID:???
メモリ増やしたか?
0717nobodyさん2011/05/02(月) 12:00:40.62ID:???
日付を扱ってるテーブルがあり、各曜日で一気に値を入れるにはどうしたらいいでしょうか?
今月の月曜日に全部1を挿入といったようなことをしたいです。
0718 忍法帖【Lv=9,xxxP】 2011/05/02(月) 16:38:23.84ID:???
>>717
それってSQLの話だけど、例えばDATE_FORMAT()をつかって条件指定できる。
Cake的にはupdateAll()をつかうだけ。
0719nobodyさん2011/05/02(月) 21:40:11.28ID:???
最近、ソーシャルアプリをCakePHPで作ってますという案件が増えたね。
CakePHPは大量アクセス前提のアプリも問題なく開発できるってことですね。

分かります。
0720nobodyさん2011/05/02(月) 23:48:36.39ID:???
>>719
俺が思うに、それは管理画面だけの話で、
アプリ側やアクセスが頻繁に発生する部分では、
限りなくピュアPHPで自作してると思うよ。
0721nobodyさん2011/05/03(火) 01:54:20.44ID:???
うちはアプリ側もCakeで作ったよ
0722nobodyさん2011/05/03(火) 13:16:24.74ID:???
Cakeに慣れると、簡単なPHPのプログラム作ろうとしても
いつの間にかCake風のプログラミングしてることあるよな
0723nobodyさん2011/05/03(火) 13:54:27.72ID:???
Cake風のプログラミングってどういうのだ?
0724nobodyさん2011/05/03(火) 14:06:56.07ID:???
RoR風MVCと言いたいのかな?

PHPあんまり知らないJavaはよく知ってる人が、ぱっと見で
「あ、これ分かりやすいね」と言ってた。
0725nobodyさん2011/05/05(木) 03:39:50.22ID:???
MeioUpload Behaviorを使っているんだが
確認画面で画像を確認した後、saveってできるのかな?
やっぱりそこは自作しないといけないのかな
0726nobodyさん2011/05/05(木) 10:09:53.55ID:???
2.0はいつ正式版でんのかな
Symphonyに先行されたくはないよな
0727nobodyさん2011/05/05(木) 13:07:28.09ID:???
>>726
それはあなたが参加チームに入ればいい。
あなたも参加チームに加わって、2.0のバージョンの開発スピードを速くしましょう、ボケ。
0728nobodyさん2011/05/06(金) 00:21:29.94ID:???
ちょっと気づいたんだけど、
app_controller.phpに「var $autoLayout = false」を指定してないと、
エラーページにもレイアウトが使用されるんだな。

会員専用ページとか、レイアウトに「default.ctp」を使用してたら
これが読み込まれるから大変な事になる
0729nobodyさん2011/05/06(金) 20:26:56.51ID:aIuVNDEL
コントローラに変数を書くのは
$this->set('foo', 'bar');
ってやってビューで$fooでbarが出るようにできたんですけど、
このfooを配列にしたいんですけどどう入力したらいいんでしょうか
$this->set('foo', 'bar');
$this->set('foo', 'bar2');
とやったらただ$fooが上書きされただけで配列にはなりませんでした
0730nobodyさん2011/05/06(金) 20:30:43.07ID:???
$this->set('foo', array('bar', 'bar2'));
0731nobodyさん2011/05/06(金) 20:37:08.21ID:???
>>730
あ・・・
なるほどありがとうございます
助かりました
0732nobodyさん2011/05/08(日) 16:57:22.50ID:???
http://bakery.cakephp.org/jpn/articles/category/helpers
>PEARのののの
なんで、尻取りRock'n Rollみたいなタイトルになっとるんかね?
0733nobodyさん2011/05/10(火) 22:38:37.80ID:???
7PHPフレームワーク中ぶっちぎり最下位のCakePHPは終わコン
http://www.devshed.com/c/a/PHP/7-PHP-Frameworks-Tested-For-Speed/
0734nobodyさん2011/05/11(水) 17:51:03.34ID:???
ヒマだったんでローカル鯖にエロ動画データベースみたいなのを作ってみた。
今まで使った事無かった機能とかいろいろ使ってみて勉強になるわ。
やっぱ実益を兼ねると捗るな。
0735nobodyさん2011/05/11(水) 18:08:06.21ID:???
エロサイトは技術レベル高そうだね。
みんなのDMM様とかね。
0736nobodyさん2011/05/11(水) 18:13:22.71ID:???
>>734
どんな感じ?
ぜひ公開してよ。
0737nobodyさん2011/05/12(木) 00:21:57.52ID:RDtqq4sq
CakeでModelのfind・save・delete等のDBアクセスメソッドで
エラーハンドリングするのって

$res = $this->Model->save();
if ($res === false) {
  // エラー処理
}

って感じでいいですかね?
0738nobodyさん2011/05/12(木) 01:54:00.04ID:???
if(!$this->Model->save()){
// エラー処理
}

これじゃ駄目なのか?
■ このスレッドは過去ログ倉庫に格納されています