【PHP】フレームワーク CakePHP 14ホール目【v2.1】
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2012/05/01(火) 16:58:44.53ID:fVBzm1/ACakePHPから派生したLithium(li3)も専スレできるまではここでどうぞ
質問するときはCakePHPのバージョンを書きましょう
※他フレームワークとの比較等はスレ違いです
テンプレは>>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
前スレ
【PHP】フレームワーク CakePHP 13ホール目【v2.0】
http://kohada.2ch.net/test/read.cgi/php/1320768310/
0657nobodyさん
2012/10/02(火) 15:09:48.22ID:???0658nobodyさん
2012/10/02(火) 18:17:45.17ID:???0659nobodyさん
2012/10/02(火) 18:23:04.39ID:???0661nobodyさん
2012/10/07(日) 03:32:25.58ID:vSsbr+AJエラーメッセージをまとめて一箇所に表示する方法ってある?
0663nobodyさん
2012/10/07(日) 15:15:02.59ID:???ログ見るべし
0664nobodyさん
2012/10/12(金) 18:03:03.50ID:zHaiJKat僕が思いつくのは、
app_controller.phpのbeforeFilter()に、
アカウントテーブルのlastloginに現在の時間をupdateする方法です
ログインのアクションに記述すると、
クッキーで自動ログインしている際などはそのアクションを通らないので不適切でした
なにか他に良い方法ありますでしょうか??
0665nobodyさん
2012/10/12(金) 23:39:10.35ID:???0666nobodyさん
2012/10/16(火) 15:59:26.74ID:???「外注が作ったCakeのコードが糞だから書き直した」的なブログ記事。
「お前のコードも糞じゃねぇか」って叩かれてワロタw
てか、俺の書き方が意外と駄目じゃないと知っただけでも収穫あったぜ
0667nobodyさん
2012/10/17(水) 20:17:29.91ID:???0668nobodyさん
2012/10/17(水) 20:54:19.04ID:???これかな
0669nobodyさん
2012/10/18(木) 00:28:24.24ID:???「プロになるためのPHPプログラミング入門」という本が良さそうと思ったんですが、
ver1.3基準で書かれているようです。
cakePHP2を勉強するうえで、1.3基準の本は有用でしょうか?
0670nobodyさん
2012/10/18(木) 01:17:25.05ID:???もうcake2の本はあるんだからそっち選びなさい。
CakePHP2 実践入門 は評判良いぞ。
0671nobodyさん
2012/10/18(木) 23:55:26.47ID:???670に同じく今さら1.3の本を読むのは時間のむだ。
公式のチュートリアルを何回も繰り返して手順を身体に覚えこませてから
>>670 の本を読むといいと思うよ。
0672669
2012/10/22(月) 14:14:23.93ID:???0673nobodyさん
2012/10/24(水) 12:14:02.26ID:???Authコンポーネントのログインで、認証条件を付ける時、
以下のようにすればOKとあったのですが、条件が適用されません。
書き方が違うのでしょうか?
$this->Auth->userScope = array( 'User.status'=>1 );
0674nobodyさん
2012/10/24(水) 14:29:36.53ID:???同コントローラの別アクションへredirect処理が行なわれなくなりました。
$this->redirect(コントローラ名:アクション名)を試してみても
$this->redirect(相対パスor絶対パス)の形でも
どちらの形式でも正しくリダイレクトが行なわれていないようです(真っ白なページが表示される)
何か間違っているのでしょうか
0675674
2012/10/24(水) 15:50:39.87ID:???お騒がせしました
0676nobodyさん
2012/10/24(水) 16:28:04.62ID:???それ、1.3の書き方なんじゃないの?
よく分からんけど公式ドキュメントにそんなプロパティ載ってないよ
1.3ならあったみたいだけど
>>674
真っ白=debugモードが0でいいのかな?
だとしたらキャッシュクリアしてみた?
0678673
2012/10/25(木) 09:13:43.26ID:???ありがとうございます。
自分もソースを見直したら、以下のようにしたら実行できました。
$this->Auth->authenticate = array(
'Form' => array(
'scope' => array('User.status' => 1)
)
);
0679nobodyさん
2012/10/26(金) 15:07:41.06ID:???これってモデル(ビヘイビア)の処理ですかね?
コントローラ側でエラーチェックとかアップロード先のパスとか書いていくと
長くなるのでどうすれば納まりが良く、使い回しが利くかと悩んでいます。
0680nobodyさん
2012/10/26(金) 15:44:39.23ID:???効率化よりも今まで書いていた方法で行きます。
0681nobodyさん
2012/10/26(金) 17:58:57.48ID:???あとプラグインもいいのあるけど、何で使わないの?
0682nobodyさん
2012/10/26(金) 19:01:29.27ID:???自分の使い方だと、コントローラの方が良いと思いまして。
例えば、一度アップロードしたファイルはセッションに入れて、
フォームのその他の項目にエラーがある時は、
そのセッションを表示して再アップロードさせない。
みたいな処理を入れる時、セッションコンポーネントを使うので、
モデル内で解決するより、コントローラの方が簡単だと思いまして。
あと、プラグインも小回りが利かないんです。
ファイル名をいくつかのパターンで生成したい時とか、
最初は仮フォルダにアップして、save前に公開画面のフォルダに移動するとか
そういう細かい仕様に対応するには自作の方が便利なんです。
ファイルアップロードの仕組みを自作する事自体は簡単ですし。
0683nobodyさん
2012/10/26(金) 19:24:22.60ID:???テーブル無しのUploadFileモデルとか作った方が小回り効くような気がする・・・
0684nobodyさん
2012/10/28(日) 17:11:17.13ID:???コントローラーからビューにメンバ変数の連想配列を渡したいのですが、躓いています。
下記の Controller にて、
class UserController extends AppController {
var $hoge = array();
public function beforeFilter() {
$this->$hoge['foo'] = 1;
$this->set(compact('hoge'));
}
}
として View 側で$hoge['foo']を呼び出そうとして、
Undefined variable: hoge
のエラーが返ります。
compactを使用しない場合でも同様でした。
http://book.cakephp.org/2.0/ja/controllers.html#Controller::set
を参考に考えてみたのですが、何か思い違いをしていますでしょうか?
0686nobodyさん
2012/10/28(日) 17:25:23.15ID:???すんなり解決しました。ありがとうございます。
提示内容を見て、どう思い違いをしていたのか理解しました。
これに半日かけてドキュメントを漁っていましたが、もう少し基本を勉強したいと思います。
0687nobodyさん
2012/10/29(月) 12:31:19.66ID:???一度だけ使えるクーポンを定義しようとしていて
'Model.coupon' => 'hoge'
で保存しておいて
checkルーチンで
'Model.coupon' => 'hoge'でfindし、見つからなければfalse
見つかったら'Model.coupon'=>'' でからにしてsave後 trueを返す。
というのを作ったのですが、 saveするとfalseが返ってきます。
saveをしなければ trueのまま返るのですがなぜなのでしょうか?
0689687
2012/10/29(月) 13:21:50.79ID:???SQLのダンプを表示させたところ
findのSQLは どちらも同じなのですが、Num.rowsが saveした方では0になります。
save後にfindが走っているってことでしょうか
0690nobodyさん
2012/10/29(月) 13:44:36.50ID:h036kd/wこの中で定義したメソッドに引数を渡す事ってできないの?
CUIから内部で定義したメソッドをキックすると
Warning Error: Missing argument 1 for HogeShell::Test()
っていうエラーが出ちゃうんだけど。
0691nobodyさん
2012/10/29(月) 13:55:16.32ID:???0692nobodyさん
2012/10/29(月) 15:09:32.64ID:???以下のようなモデルがあるとして
A hasMany B
B belongsTo C
A.id = 1のCのリストを取得
$this->A->find('all', 'conditions'=>array('A.id'=>1))として
取得した中のBの中に含まれるCをとってくるしかないのでしょうか
SQL文としては以下のようなものを想定しています。
SELECT C.* FROM A, B, C WHERE A.id=1 AND A.id = B.a_id AND C.id = B.c_id
0693692
2012/10/29(月) 15:56:52.28ID:???お騒がせしました
0694687
2012/10/29(月) 16:35:42.03ID:???SQLダンプと結果の出力
exit;
save();
だと、SQLダンプと結果はNumrows = 1 (データ更新されていないので何度呼び出しても、、)ですが
find();
SQLダンプと結果の出力
save();
だと SQLダンプは同じで、Numrows=0になります。
後ろで行った saveが 前に書かれたfindに影響を与えるというのがどうしてなのかがわかりません。
0695nobodyさん
2012/10/29(月) 16:45:00.54ID:???0696687
2012/10/29(月) 16:49:40.01ID:???1. SELECT 文 Num.rows = 0
2. SELECT COUNT文
3. UPDATE 文 Num.rows = 1
となっていました。
3の結果が1へ影響しているみたいです。
0697nobodyさん
2012/10/29(月) 19:04:11.24ID:h036kd/wマニュアルのどこにかいてんのさ。
0698nobodyさん
2012/10/29(月) 19:18:29.22ID:???0699687
2012/10/29(月) 19:20:25.68ID:???へんな機能拡張がページを2回呼んでたみたい
0701nobodyさん
2012/10/30(火) 16:38:01.14ID:sDbMhdsyサンキュー。
あと
$contents = @file($reading_file_name );
の @ ってなに?
0702nobodyさん
2012/10/30(火) 16:42:13.00ID:???https://www.google.co.jp/search?q=php+%E3%82%A2%E3%83%83%E3%83%88%E3%83%9E%E3%83%BC%E3%82%AF&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&hl=ja&client=firefox-a
0704nobodyさん
2012/10/31(水) 01:06:58.14ID:???0706nobodyさん
2012/10/31(水) 15:08:44.33ID:???formヘルパから作られるgetをrest的なpassedArgs形式で渡したいッス。
example.com/controller/action/arg1:val1/arg2:val2/?arg3=val3
ってなってるヤツを
example.com/controller/action/arg1:val1/arg2:val2/arg3:val3
としたいッス。
js使えば行けるし受け側でgetの処理をすればいけるんだけど、こうすれば楽じゃね?的なご指摘あればうれしいです。
>>671
現状はactionでgetとごちゃまぜにしたり、場合によってはappControllerでget優先で$this->passedArgsを書き換えてる感じッス。
0707nobodyさん
2012/10/31(水) 15:10:54.24ID:???0708nobodyさん
2012/10/31(水) 19:38:39.19ID:???バージョン書けって
2系ならある程度分かってるから教えられるけど、
passedArgsってパラメータは1.3系なのかよ?
0710nobodyさん
2012/10/31(水) 22:21:21.64ID:???http://api.cakephp.org/class/form-helper#method-FormHelpercreate
FormHelper::create($mode, $options) の、第2パラメータ $options に、
'url'をキーとしたパラメータをセット。
'url' の値は string | array で、そういうパラメータを渡したい場合は
連想配列で構造を渡す。
CakePHPのルータがこの連想配列のURLパラメータと現実のURLを相互変換するのは理解OK?
で、通常のURLパラメータに該当しないキーで値をセットすると、
・・・つまり
array('arg1'=>'val1', 'arg2'=>'val2')
のようにやると、やりたいことができる。
0711nobodyさん
2012/10/31(水) 22:50:43.25ID:???formにゅうりょくちをコロンセパレートにしたいんだろ
formってそういう仕様だから、自分で言ってるとおりjsでがんばる。それかばかだけどリダイレクトしちゃえ
0712nobodyさん
2012/10/31(水) 23:58:50.04ID:???0713706
2012/11/01(木) 11:41:29.98ID:???結局ちまちまやるっきゃないぽいっすね〜。
みんなそうしてるんかね〜。マンドクサ
0714nobodyさん
2012/11/01(木) 13:50:06.03ID:???長時間、あれやこれやと試すことがあるけど、
目的は「動く」事だから、効率化や綺麗なソースよりも
まずは動くことを目指してやると良いよ。こだわりすぎはいかんぞ。
0715nobodyさん
2012/11/01(木) 15:07:46.14ID:???ビューからrequestActionでカテゴリを取得しようとしているのですが、
$this->requestAction('/widget/category');
widgetコントローラにcategoryアクションが無い場合は
どうすればいいのでしょうか?
単なる構文ミスでエラーになるのですが、
存在確認みたいなコードがあれば教えてください。
0716nobodyさん
2012/11/01(木) 16:54:03.16ID:???納品してポイなら良いんだけどね〜。
何年か自分たちでメンテしていくことになるときには気分の良いコードの方が精神衛生上いいなぁと。
まぁそうは言ってもね、一年前のコード見てすごく気分悪くなるんですけどねw
0717nobodyさん
2012/11/03(土) 21:12:09.24ID:nZj97DWzid じゃなくて login_id にしたいんですけど、この列名って固定なんでしょうか?
0718nobodyさん
2012/11/03(土) 21:18:17.79ID:X1g36ZBW0719nobodyさん
2012/11/03(土) 21:43:28.47ID:???primaryKey を login_id に設定した上で
下記コードを記述しました。
<td><?php echo $this->Form->input('login_id',
Array('label' => false,'style' => 'width:150px;')); ?></td>
するとなぜか、コンボボックスが表示されてしまうんですけどなんでしょうか?
0720nobodyさん
2012/11/03(土) 22:58:33.57ID:???0721nobodyさん
2012/11/03(土) 23:04:10.03ID:???0722nobodyさん
2012/11/03(土) 23:10:32.22ID:???FormHelper::input は、オプションの自動補完機能があるんですよ〜
で、***_id っていうフィールド名の場合、フォームのデータ型を指定しないとselect扱いになるというわけ。
それを回避するには、オプションで明示的に'type'を'text'とかに指定する。
0724nobodyさん
2012/11/04(日) 00:44:08.63ID:???public
$uses = Array('User'),
$components = Array(
'Session',
'Auth' => Array(
'loginRedirect' => Array('controller' => 'admins', 'action' => 'index'), // ログイン後のリダイレクト先
'logoutRedirect' => Array('controller' => 'admins', 'action' => 'login'), // ログアウト後のリダイレクト先
'loginAction' => Array('controller' => 'admins', 'action' => 'top'), // ログインしていない場合のリダイレクト先
'authenticate' => Array('Form' => Array('fields' => Array('username' => 'email')))
)
);
そしてブラウザより
/admins/add にアクセスすると問題無く /admins/addのコントローラが実行され
/Views/Admins/add.ctp が表示されるのですが
/admins/addcustomer にアクセスすると、/admins/top に飛ばされてしまいます。
なぜ、/admins/add がリダイレクトされないのに /admins/addcustomer だと
リダイレクトされてしまうのでしょうか?
※add() { //略 } をコピーして作成したコントローラ内のファンクションが addcustomer () { //略 }となります。
0725nobodyさん
2012/11/04(日) 11:00:47.88ID:???0726nobodyさん
2012/11/04(日) 12:56:08.07ID:???ニュースリリース見ると2006年で登録止まってるし、管理者からは放置されてるのかな?
フォーラム自体の投稿はぼちぼちあるから古参だけの閉じた環境になってる?
0727nobodyさん
2012/11/04(日) 13:01:18.74ID:???知らんけど
0728nobodyさん
2012/11/04(日) 13:16:21.36ID:???0729nobodyさん
2012/11/04(日) 19:10:28.20ID:???0730nobodyさん
2012/11/04(日) 21:38:37.79ID:eiB+7ElRそのうち、1)と2)で入力された値の組み合わせのチェックを
独自バリデーション内で行いたいのですが
どうすれば、独自バリデーションファンクション内でサブIDの値を
捕捉する事が出来ますか?
1)基本ID ( basic_id )
2)サブID ( sub_id )
public $validate = Array(
'basic_id' => Array(
'dokuzi' => array(
'rule' => array('isCorrectId', 'ダミーの引数'),
'message' => '独自バリデーションの結果エラーが出ました。。'
)
function isCorrectId($data, $dummy_args)
{
$basic_id = $data["basic_id"];
$sub_id = {サブID}; ← どうやって取得したらいいか分かりません。
return true;
//return false;
}
0731730
2012/11/04(日) 21:56:02.04ID:eiB+7ElRはまりまくってます。
0732nobodyさん
2012/11/04(日) 22:07:20.84ID:???バージョン不明なので2と仮定して、
定石的に Model に定義しているのを前提に。
Post されたデータなら
$this->data['Model']['basic_id']
$this->data['Model']['sub_id']
で参照出来ると思うけど、何でわざわざ関数に引数渡すの?
あと”ダミーの引数”って書き方だけだと配列で渡しているか不明なんだけど、
配列で渡してないから参照出来ないんじゃないのか?
0733nobodyさん
2012/11/04(日) 22:10:34.23ID:???数レス進んでいる中でスルーされているんならわかるが、
無レスで催促求めるんなら2ch向いてない、ヤフー知恵袋あたりに帰れ
0734730
2012/11/04(日) 23:39:10.86ID:eiB+7ElRありがとうございます。
次の様に項目毎に独自バリデーション関数を指定したところ
ファンクション内で var_dump($data); をしたら
画面上の入力項目(基本ID、サブID)の値も取得出来る様になりました。
public $validate = Array(
'basic_id' => Array(
'dokuzi' => array(
'rule' => array('isCorrectSequenceNumber'),
'message' => '独自バリデーションです。'
)
),
'sub_id' => Array(
'dokuzi' => array(
'rule' => array('isCorrectSequenceNumber'),
'message' => '独自バリデーションです。'
)
),
0735730
2012/11/04(日) 23:46:59.54ID:eiB+7ElRで、いけると思ったんですけど
結局バリデーションファンクションに値が入って来るのは
1項目毎なのですね。。。
基本ID と サブID の値を同時に絡めて独自判定処理を入れたいのですが
1つのファンクションじゃできないみたいです。
ちょっと回りくどいけど、外部ファイルにパラメータを保存して
よみとってやるしかないんでしょうか?
※cakePHP2 を使用しています。
0736730
2012/11/05(月) 00:05:07.80ID:Ag4y5/HLコントローラの中でモデルの中で定義した独自バリデーション
ファンクションを呼べばいいんですね。
すると data の中には画面上で入力された値全てを
取得する事が出来ました。
0737nobodyさん
2012/11/05(月) 00:43:14.75ID:???したらそもそもCakePHP使わずに他の Framework 使えば良いのに。
あと>>732で書いていることを全く理解してないのな。
isCorrectSequenceNumberの中身も書いてないし、そんなんで
アドバイス出来るのはエスパーだけだから知恵袋帰れ。
なんか>>713に通じる者がある。
0738nobodyさん
2012/11/05(月) 04:25:36.32ID:???0739nobodyさん
2012/11/05(月) 11:46:36.35ID:eArr6OfY↑
これはどーいう効果があるのさ^^?
0740nobodyさん
2012/11/05(月) 18:02:18.24ID:???0741nobodyさん
2012/11/05(月) 18:33:53.33ID:eArr6OfY臭いレスをありがとう
0742nobodyさん
2012/11/07(水) 11:03:27.13ID:???今まではifやswitchで分けて1つのコントローラ内で納めてたんだけど、
よく考えたら、コピーしてアクション分けした方が見やすいと思うようになった。
ただ、コントローラのソースが増えるからと言って
分けすぎるとスパゲティコード化するし、本末転倒な気がする。
みんなはどういう理念の元、開発してる?
0743nobodyさん
2012/11/07(水) 11:32:44.89ID:DVy9uKriCakeでテーブルのカラムのコメントを取得・更新する方法を教えてください
0744nobodyさん
2012/11/07(水) 13:21:38.42ID:???0745nobodyさん
2012/11/07(水) 13:40:48.60ID:???0746nobodyさん
2012/11/07(水) 14:08:49.06ID:???依存なんですか?
0747nobodyさん
2012/11/07(水) 17:42:47.92ID:???CakePHPベストプラクティスとかfatモデルとかでぐぐれ
まさに解決策が載ってる
ポイントは
ややこしい処理は全部モデルへ移せ
パラメータだけコントローラにおいて置けばいい
って感じ
0748nobodyさん
2012/11/07(水) 20:09:38.47ID:???0749nobodyさん
2012/11/07(水) 21:01:57.66ID:???モデルを小分けしてアクションの数だけ作ったらいいという話も聞いたが、
Modelディレクトリの直下に並列保存は正直きついな。
もう少しオートローダが強力だと独自に階層作れそうなんだけど。
0750nobodyさん
2012/11/07(水) 22:01:19.49ID:???階層たどって何がどう連携しているかわかりづらくなると思うよ
0751nobodyさん
2012/11/07(水) 23:02:38.91ID:???0752nobodyさん
2012/11/07(水) 23:11:41.84ID:???規模毎にみんなでコードレビューをしたい
0753nobodyさん
2012/11/07(水) 23:39:08.77ID:???どこで何してるか把握するのに時間がかかる
0754nobodyさん
2012/11/08(木) 02:24:42.59ID:???0755nobodyさん
2012/11/08(木) 16:45:25.90ID:???結果的には、modelキャッシュが利いていたのが原因だった。
本番サーバだから、debugレベルも0にしていたので気づくのが遅れたんだけど、
今後の運用に対して良い方法無いかな?
やっぱり、何かDBを操作したら手動でキャッシュ削除するしかないのだろうか
0756nobodyさん
2012/11/08(木) 20:03:29.72ID:???普通にModelのSave系やDeleteのメソッド使えば自動でキャッシュクリアしてくれるはず
そうでないなら自分で消すことになるよ
Modelのソース見てみると何やってるかわかるはず
http://api20.cakephp.org/view_source/model
■ このスレッドは過去ログ倉庫に格納されています