トップページ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
0320nobodyさん2011/03/08(火) 23:23:55.87ID:???
>>319
俺ならモデルから税率データを取ってきてsetに入れて
ビューで計算して表示する。
0321nobodyさん2011/03/08(火) 23:27:37.73ID:???
#Controller
$this->set('TaxConfig', $this->TaxConfig->find('first') );

#View
価格:<?php echo number_format( $data['Item']['price'] * $TaxConfig['num']); ?>

こんな感じで。
0322nobodyさん2011/03/08(火) 23:42:55.57ID:PsYppCp1
>>320-321
お〜。とりあえずそれで行ってみようかな?
0323nobodyさん2011/03/09(水) 12:25:58.46ID:???
jsヘルパーで質問です。

jQueryを使用して、下記のようにjsヘルパーでサブミットボタンを2個並べてます。
action「jstest」は、10秒待ってレスポンスを返すだけのメソッドです。
保存1、保存2と間をおかず連続してボタンを押した際、end2のalertが表示されるのが
保存1を押してから約20秒後となります。
期待してるのは約10秒後にend1、2のalertが連続表示されることなのですが、
なにかおかしい点はありますでしょうか?

<?php e($js->submit('保存1',array(
'url'=>array('action'=>'jstest'),
'buffer'=>false,
'complete'=>'alert("end1");'
)
)); ?>
<?php e($js->submit('保存2',array(
'url'=>array('action'=>'jstest'),
'buffer'=>false,
'complete'=>'alert("end2");'
)
)); ?>
0324nobodyさん2011/03/09(水) 12:44:59.72ID:???
コントローラーを太らせたくなくてロジックを全部コンポーネントで書いてたら
コンポーネントが100個ぐらいになった
0325nobodyさん2011/03/09(水) 17:15:23.38ID:4pX38QJO
ビューやコントローラで共通で使える関数ってどこで定義したらいいですか?
0326nobodyさん2011/03/09(水) 19:03:25.55ID:???
>>325
本当にModelやComponentにも属さないなら app/vendors/ 以下だね。
0327nobodyさん2011/03/09(水) 21:23:05.27ID:???
Cake1.2です

何箇所か画像をアップロードする機能をもたせていて現状下のようになっています。

1.画像を保存する処理を書いたファイル
2.渡された変数を適切なフォーマットにして1.を呼び出すファイル
3.ユーザーが画像をアップロードする際に使うファイル

3.でフォームから画像を指定してsubmit
2.が受け取って色々いじった後1.にデータを投げて画像を保存

1.2.では文字を表示する必要は一切無いため画像を保存したら
3.にリダイレクトをかけたいのですがどのようにすればいいかわからず悩んでいます。

よろしくお願いします。
0328nobodyさん2011/03/09(水) 22:26:17.55ID:???
こちらこそよろしく!
0329nobodyさん2011/03/10(木) 02:46:04.73ID:???
よろしくよろしく!
0330nobodyさん2011/03/10(木) 13:00:58.69ID:???
夜露死苦
0331nobodyさん2011/03/10(木) 13:20:34.19ID:???
>>327
マジレスすると、何いってんのかよくわからん。
何だよファイルって。
コントローラー、ビュー、モデル、コンポーネント、ヘルパー、ビヘイビア、アクション
を使って説明を書き直してくれ。
0332nobodyさん2011/03/10(木) 13:57:01.02ID:???
すいませんがそれは教えられません
0333nobodyさん2011/03/10(木) 14:46:49.27ID:???
それでは、お引き取りください
0334nobodyさん2011/03/10(木) 22:40:30.49ID:???
>>327
1と2を3のファイルにぶっこんどけ
0335nobodyさん2011/03/11(金) 04:04:16.21ID:???
>>334
そのようにします。ありがとうございました。
0336nobodyさん2011/03/11(金) 10:09:36.88ID:???
とりあえずテーブルをつくり、
scaffoldで値を入れてみようと思ったのですが、
外部キーをうまく認識してくれません。

テーブルは、次の二つを作成しました。

products
 id, created, updated, name, product_type_id

product_types
 id, created, updated, name

両コントロールは、以下のように作成しました。

//class ProductsController extends AppController
class ProductTypesController extends AppController
{
//public $name = 'Products';
public $name = 'ProductTypes';
public $scaffold;
}

product_types/addで任意のデータを追加した後
products/addでさらにデータ追加しようと思ったのですが、
product_type_idのセレクトボックスに選択できる値が入っておらず、
データを追加できませんでした。

products/add時にproduct_typesテーブルの内容を選択肢として表示するには
どのようにすればよろしいのでしょうか。
よろしくお願いします。
0337nobodyさん2011/03/11(金) 10:15:46.74ID:???
>>336
外部キーをつける対象が逆。
0338nobodyさん2011/03/11(金) 10:16:22.95ID:???
ごめん、嘘。
0339nobodyさん2011/03/11(金) 10:17:13.31ID:???
アソシエーションの設定教えてくれ
0340nobodyさん2011/03/11(金) 11:21:00.08ID:???
>339
ありがとうございます。

モデル・ビューともに作成していませんでした。
scaffoldでは、必要ないみたいなことを読んだのですが、
違ったということでしょうか。

後で、アソシエーションを設定するモデルファイルを作成してみます。
0341nobodyさん2011/03/11(金) 12:31:08.42ID:???
ビューはいらないけどモデルはいるよ。アクションもいらない
(最近scaffold使ってないから記憶薄いけど)
0342nobodyさん2011/03/11(金) 13:01:08.61ID:???
原因不明だけど、scaffoldでセレクトボックスにだけ値が入らないことはよくある。
気まぐれに入っていたりもする。
でもそのまま使うことはないからみんな放置してるんじゃないかな。
0343nobodyさん2011/03/11(金) 13:12:04.29ID:???
scaffoldって使ったことないなぁ。
使い道がよく分からん。
0344nobodyさん2011/03/11(金) 13:17:13.19ID:???
コントローラーやモデルって使った事無いなあ
使い方がよくわからん
0345nobodyさん2011/03/11(金) 13:20:52.41ID:???
scaffoldで日本語表示出来ればいいのに
0346nobodyさん2011/03/11(金) 13:55:53.93ID:???
俺はWebrootにhtml置いて使ってる
コントローラとかモデルは小規模サイトだし必要ない
0347nobodyさん2011/03/11(金) 23:09:11.08ID:34T7XTKb
http://d.hatena.ne.jp/bennylee/20090402/1238665508
↑この問題が自分の環境でも起こっているんですが、
解決法などありますか?

Cookieコンポーネントを使って配列を書きこむと、一番最後の配列以外がArrayとなってデータが消えてしまいます。
Array
(
  [0] => Array
  [1] => Array
  [2] => Array
    (
      [id] => 1
      [ab] => 2
      [cd] => 1
      [ef] => 3
    )

)
↑このように、同じデータを追加しているはずなのですが、末尾のデータしか残っていません。
0348nobodyさん2011/03/11(金) 23:11:03.03ID:34T7XTKb
http://www.materializing.net/archives/2011/02/03130231.php
この記事でも同じようなこといっていますね。

「cakephp cookie 配列」などで検索すると出てきます。
0349nobodyさん2011/03/12(土) 10:57:04.39ID:???
最近以下のように対応したんだが
Cookie::readの最後で
return $this->__values[$key][$names[1]];
//return Set::extract($this->__values[$key], $names[1]);

いいのかな。。
0350nobodyさん2011/03/13(日) 23:51:06.58ID:JC24c2uV
コントローラでの$this->Model->validates()の使い方がわからん。
事前に何をsetしようがcreateしようが必ずtrueが帰ってくる。2日悩んだがお手上げ状態
たしけて
0351nobodyさん2011/03/14(月) 03:21:55.17ID:???
>>350
setしたか?Modelにsetしないと値は渡らないぞ
0352nobodyさん2011/03/14(月) 03:25:24.81ID:???
すまん、setしたって書いてるな・・。俺は↓のようにやってるよ。

$this->Model->set($this->data);
if ($this->Model->validates()) {
 $this->Model->save($this->data);
}
0353nobodyさん2011/03/14(月) 10:38:15.65ID:3Afc8bli
>>352
そのとおりやってるんだけど、どんな値を渡してもtrueが帰ってくる。
0354nobodyさん2011/03/14(月) 17:45:24.61ID:???
>>353
じゃ、文字コード疑ってみろ。モデルの。
たまにそこがShift_JISになっていて、エラーにならない時がある。
0355nobodyさん2011/03/15(火) 11:45:26.02ID:pIi0VVUh
>>354
UTF-8だったわ。
<?php
class Stock extends AppModel {
  var $belongsTo = array('Item', 'Size', 'Color');
  var $validate = array(
      'name' => array(
        'rule' => array('notEmpty'),
      ),
      'item_id' => array(
        'rule' => array('notEmpty'),
      ),
      'size_id' => array(
        'rule' => array('notEmpty'),
      ),
      'color_id' => array(
        'rule' => array('notEmpty'),
      ),
      'quantity' => array(
        'rule' => array('numeric'),
        'message' => '半角数字で入力してください'
      ),
  );
}
?>
なんだ?バリデーションのかき方間違ってるわけじゃないよな
ファイル壊れてんのかね?
0356nobodyさん2011/03/15(火) 11:54:53.37ID:???
ちょwwwお前バリデーションの書き方間違ってるじゃんw
なんでnotEmptyを配列にしてるんだw

'name' => array(
 array(
  'rule' => 'notEmpty'
 )
)

こうだろ。もう少し勉強しろよ
0357nobodyさん2011/03/15(火) 12:03:25.03ID:???
あ、すまん。俺は1つのフィールドに複数ルール書くから↑してるけど、
'name' => array(
  'rule' => 'notEmpty'
)

これでも動くよ。(むしろこっちが一般的かも知れない)
0358nobodyさん2011/03/15(火) 15:15:08.89ID:???
書き方間違ってないなら、
もう本体のソースにdebug()入れて目デバッグするしかないんじゃないの?
こんなところで聞くよりずっとはやいぜ。
0359nobodyさん2011/03/15(火) 17:30:17.19ID:pIi0VVUh
>>356
サンクス。
いろいろ試したが、
そのコードに、'required' => true,つけたらfalse帰ってきたわ。

'name' => array(
 array(
  'rule' => 'notEmpty'
 )
)

'name' => array(
 array(
  'rule' => 'notEmpty'
  'required' => true,
 )
)
0360nobodyさん2011/03/15(火) 18:34:32.58ID:???
お前、根本から間違ってるよ。
冗談抜きでcookbookの例見ながらやれよ
0361nobodyさん2011/03/15(火) 21:33:40.21ID:pIi0VVUh
>>360
いや、ブックもAPIも毎日見てるよ。
何が間違ってる教えてくれ
>>369のやりかたで今のとこうまくいってるんだが
0362nobodyさん2011/03/15(火) 22:54:50.70ID:???
見てたら何で>>355なコード書いてんだよ。後出しで言い訳するなって。
0363nobodyさん2011/03/16(水) 00:11:30.27ID:H/WJFHht
そもそもルールで、「空はダメ」って指定してるのに
requiredが必要な設計が悪いんだよ。
0364nobodyさん2011/03/16(水) 00:45:40.08ID:???
何故bakeしたものを書き直さないのか・・・
だからそういう凡ミスするんだよ。開発プロセスを見直せ
0365nobodyさん2011/03/16(水) 12:36:45.89ID:???
まぁrequiredだのallowEmptyだのnotEmptyだの、ややこしいといけばややこしい
0366nobodyさん2011/03/16(水) 14:38:25.17ID:???
CakePHPの売上を被災地に寄付しよう!
0367nobodyさん2011/03/16(水) 17:08:05.35ID:???
>>366
それは運営が決めることで外部から善意という名の圧力かけるような卑劣な方法は止めてくれ
0368nobodyさん2011/03/16(水) 17:41:11.35ID:OBkWdnDA
実際の開発でbakeって使ってますか?
0369nobodyさん2011/03/16(水) 19:10:01.24ID:aP3af6LX
cakephp 1.3.7
ダウンロードできないんだが・・・。

さばおち?
0370nobodyさん2011/03/17(木) 00:05:23.96ID:???
cake使って作ったサイトの利益の一部を寄付するわ
cakeへのdonationはもうちょっと待ってくれw
0371nobodyさん2011/03/17(木) 15:25:53.81ID:V4uSlNhx
>>368
bakeって便利なの?なんかめんどくさくて全然使ってない

>>370
いくら儲けてるの?
0372nobodyさん2011/03/17(木) 16:24:52.18ID:???
CakeDCのsearch pluginでSQLエラーが出るなあと思っていたら、
$actsAsを$actAsって書いてた orz
0373nobodyさん2011/03/17(木) 16:30:00.71ID:???
>>370
どのくらいの規模のサイトなの?
03743702011/03/17(木) 18:09:13.88ID:???
小規模、普段は酒代に消える程度の額
0375nobodyさん2011/03/17(木) 20:41:47.41ID:???
小規模って、コントーローラー数でいうとどのくらい?
03763702011/03/18(金) 00:21:26.72ID:???
システム的な規模かよw
いくつかサイトあるけど、どれもコントローラーは10個もないな
3〜8くらいか
0377nobodyさん2011/03/18(金) 00:31:55.32ID:???
そりゃかなり小規模だなw
俺が作ってるポータルサイトでも、30〜40はあるぞ。
0378nobodyさん2011/03/18(金) 14:25:43.64ID:???
じゃ僕は50個
0379nobodyさん2011/03/18(金) 16:51:57.19ID:???
じゃってなんだよじゃってw
0380nobodyさん2011/03/18(金) 16:57:37.01ID:???
controller30〜40個ってどんだけゴミクズプログラムだよw
0381nobodyさん2011/03/18(金) 17:00:53.59ID:???
コントローラーの多さを誇るとかwww
0382nobodyさん2011/03/18(金) 22:20:06.93ID:???
30〜40で多いとか・・・
0383nobodyさん2011/03/19(土) 13:51:57.61ID:???
管理画面とかアクセスが多くないページをCakeで作って
それ以外を素のPHP(か独自クラスか)で作っている人いる?
0384nobodyさん2011/03/19(土) 14:33:16.51ID:???
>>383
nanapiがそんな感じだったような
0385nobodyさん2011/03/19(土) 14:40:09.94ID:???
>>384
なるほど。他のサイトでもそういうの見たんだよ。
だから割と普通なのかな?って思ってさ。
0386nobodyさん2011/03/19(土) 16:07:57.11ID:LrB5RKVB
ユーザ登録ページを作成しています。
validation後、問題がなかったらpasswordを指定の暗号化(authsome)してからinsertしたいのですが、どうすればいいでしょうか?
一般的な方法をご教示いただければと思います。

0387nobodyさん2011/03/19(土) 16:08:51.78ID:???
キャッシュやPHPアクセラレータの導入しても何ともなりそうにない場合の最終手段という感じがする
そこまで多くのアクセスをさばくサイトを作ったことがないからわからんが
0388nobodyさん2011/03/19(土) 16:33:34.19ID:???
個人的な運用事例ですが、今のところ、1日100万PVだけど問題は起きてない。
というかそれ以上でもDB部分の設計次第、データ次第という感じがする。

別サイトでは月1億PVでもcakePHPが原因で ということはおきてないです。
結局それくらいのPVになったらWEB複数台にしたり、DB分けたりして対処できてます。
0389nobodyさん2011/03/19(土) 17:44:12.06ID:???
>>388
俺がパフォーマンス出来になるのは、Ajaxの処理なんだけど、
そう言う点での遅いとか重いとか言うのは感じない?

例えば、ボタン押す→Ajax通信で指定データを取得→
閲覧しているWebページに結果を返す
って処理が、体感的に数秒かかる。
0390nobodyさん2011/03/19(土) 17:48:31.30ID:???
>>388
その規模をCakeで運用しているって凄いな。SNSか何かか?
0391nobodyさん2011/03/19(土) 18:30:44.32ID:???
≫389
私の事例とは違うのでちょっとわからないです。
でも遅いのってだいたいDB周りですよ。

>>390
携帯向けサービスです。

ただ$this->Model->findとかは使ってないのでフルでcakePHPを使っているとは言えないです。
$this->Mode->queryでSQL文を書いて常に把握できるようにしてます。
0392nobodyさん2011/03/19(土) 20:05:46.26ID:???
>>391
うん?どういうこと?
find使わないでSQL文書いて、query実行してビューに出力しているの?
0393nobodyさん2011/03/19(土) 20:07:43.27ID:???
あ、ごめん書き方が悪かった。
findとかsaveとか使わないとなれば、Cake使う意味あるのかな?
って疑問に感じたんでさ。
0394nobodyさん2011/03/19(土) 22:01:27.00ID:???
>>393
もともとcakePHPを使う理由が、コードを読みやすくする(開発者以外が手を加える可能性があるため)
ことだったのであるとは思います。

cakeでなければ駄目だったかと言われると他のでも良かったですが。
ただfind部分の処理は結構重そうだったので、クエリキャッシュとかしてないのであればボトルネックになるのかもしれません。
0395nobodyさん2011/03/20(日) 20:27:13.00ID:???
Model->queryってコントローラに書いてるの?
0396nobodyさん2011/03/20(日) 22:14:15.49ID:GCcZIJSQ
query()使うのとfind()使うのって変わらないんだが
0397nobodyさん2011/03/20(日) 23:51:38.23ID:???
そんなこと無いよ
0398nobodyさん2011/03/21(月) 00:16:04.61ID:???
SQL文に組み直すだけで、そこまで負荷がかかるとも思えないな
0399nobodyさん2011/03/21(月) 00:43:56.18ID:XkLv7npg
app/models/foo.phpと
app/controllers/foos_controller.php
用意して、example.com/fooへアクセスして動いたのですが
example.com/にアクセスして
fooってテーブル使うようにするにはどのファイルをいじればいいのでしょうか?
app/controllers/pages_controller.phpでしょうか
04003992011/03/21(月) 02:09:09.74ID:XkLv7npg
解決しました。すいません
0401nobodyさん2011/03/21(月) 20:54:35.99ID:???
mysql> select id,email,flag from users;
+----+------------------+------+
| id | email | flag |
+----+------------------+------+
| 1 | user1@example.jp | 0 |
| 2 | user2@example.jp | 1 |
+----+------------------+------+
ガタついてると思いますが上記のようなテーブルがあってflagは
0=仮会員
1=本会員
でメール認証で仮会員から本会員にとなります。

会員登録の際にemailにバリデートをかけたいのですが
DBを参照してフラグが0ならupdate、1ならisUniqueで弾くにはどうしたらよいのでしょうか?
cakephpのバージョンは1.3です
0402nobodyさん2011/03/21(月) 22:43:32.95ID:fIwUydDA
>>401
ユーザーがメールを送る

メアドを見て、
0403nobodyさん2011/03/21(月) 22:50:03.53ID:???
変な書き込みになってしまった、すまん。
どこでバリデーションが必要になるのかわからんけど、メール認証後の登録の際のセッションIDでユーザー特定するのがセオリーなんじゃない?
本登録の際にemail情報は必要ないと思うが、どのタイミングでバリデーションするの?
0404nobodyさん2011/03/21(月) 23:22:35.97ID:???
説明が不足していてすいません。
バリデートをかけたいのは仮登録の際のemailフォームです

'email' => array(
"rule1" => array(
"rule" => 'isUnique_flag1',
"message" => "このメールアドレスは既に本登録されています",
),
"rule2" => array(
"rule" => 'email',
"message" => "メールアドレスを正しく入力してください",
),
"rule3" => array(
"rule" => 'notEmpty',
"message" => "メールアドレスを入力してください",
),
),

rule1のisUnique_flag1が欲しいのです
さらにいえばflag0のemailの登録があった場合はupdateをかけたいと思っております

分かりづらくてすいません
0405nobodyさん2011/03/22(火) 00:59:49.73ID:???
>>404
仮登録は普通空メから始めないか?
フォームから始めると登録する方も運営者側も面倒なことになりそう

フォームでメアドを入力させるとなると、複数のフィールドを見なきゃいけないので、isUniqueをそのままは使えないし
この辺を参考にして複数フィールドのチェックしてみたら?
http://dxd8.com/archives/212/
0406nobodyさん2011/03/22(火) 16:50:27.43ID:???
>仮登録は普通空メから始めないか?
それ、携帯サイトだけだろ。
0407nobodyさん2011/03/22(火) 19:29:39.17ID:???
完全にケータイサイト前提で考えてた
スマンコ
PCの場合は>>405でやるのがいいとおもう
0408nobodyさん2011/03/23(水) 02:19:41.25ID:???
EC CUBEでは用途によってテーブル名の接頭辞を分けているのですが、
Cakeのdatabase.phpで接頭辞を指定した時、
モデルによって別の接頭辞を参照させる事って出来るのでしょうか?
0409nobodyさん2011/03/23(水) 02:34:35.94ID:???
やったことはないが、
$model->tablePrefix で接頭辞は設定できるよ
0410nobodyさん2011/03/23(水) 04:31:57.56ID:???
ありがとうございます。それを使います。
0411nobodyさん2011/03/23(水) 17:03:31.26ID:???
コントローラー間でリダイレクトの際そのままformで受け取っていた値を受け渡したいと思ってます。

どのようにすればよいでしょうか?
0412nobodyさん2011/03/23(水) 21:52:21.71ID:???
リダイレクト前に値をセッションに入れたら?
0413nobodyさん2011/03/24(木) 07:42:58.90ID:???
>>412
ありがとうございます、そうします
0414nobodyさん2011/03/24(木) 22:31:38.58ID:???
cakePHPって糞だよな
0415nobodyさん2011/03/25(金) 00:11:11.21ID:???
糞しかないPHPフレームワークの中では、なかなか美味しくいただける糞だよ
0416nobodyさん2011/03/25(金) 01:26:19.03ID:???
もう少しファイル数が少なくて、動作が速ければ言うこと無いんだけどね。
CodeIgniter並とは言わないが
0417nobodyさん2011/03/25(金) 01:54:30.06ID:???
コンポーネントに書いたコードをやっぱりappコントローラーに書こうとか、
appコントローラーに書いたコードをやっぱりコンポーネントに書こうとか。。
と考え出すとリファクタリングの沼に入る。
小さいアプリならOK。大規模アプリならOK
しかし中途半端な規模のアプリだと途端に境界性が曖昧になる。
0418nobodyさん2011/03/26(土) 11:46:01.37ID:???
海外サーバーを経由してネットする方法を詳細にしるした書籍もしくはサイトを教えてください
悪いことをするつもりはありませんがw wikileaksのハッカーに興味をもっております
彼らは、どうやってするのでしょうか?非常に興味があります。よろしくお願いします。すいません。マルチします。
0419nobodyさん2011/03/26(土) 11:57:35.71ID:???
ハハッ ワロス
■ このスレッドは過去ログ倉庫に格納されています