【PHP】フレームワーク CakePHP 8ホール目【1.3】
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2010/03/18(木) 10:00:59ID:6+kHM8kHCakePHPから派生したLithium(li3)も専スレできるまではここでどうぞ
質問するときはCakePHPのバージョンを書きましょう
※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
0228nobodyさん
2010/04/23(金) 16:25:09ID:???各項目を操作していく感じになります。
パターン1 = テキスト + ドロップダウンリスト
パターン2 = テキスト + ラジオボタン
など
DataModel(extends AppModel)などを作り、TextDataModel(extends DataModel)などを作ればよいのかな、
(その他、DataModelの組み合わせを扱うモデルクラスなど)
と思いつつ、CakePHPではかえって複雑になってしまう気がして悩んでます。
0229nobodyさん
2010/04/23(金) 16:28:36ID:???うーん。イメージがいまいち掴めない
最終的に保存する例を教えてくれ
あと、セッションに保存したデータはどうするの?そのあと
0230nobodyさん
2010/04/23(金) 16:29:11ID:???0231nobodyさん
2010/04/23(金) 16:41:57ID:???フォームに入力したデータそのものは保存しないです。
入力されたデータを計算し、最終的に結果を画面に表示(またファイルにしてダウンロードしてもらう)だけですので。
後々データを保存する場合も、セッションをハッシュ化してそのまま保存しようと考えてます。
計算を行う際(と後々データからフォームを復元する際)に、フォームの種類を「走査」する部分をどうするか、が悩んでいる部分です。
極端な話、モデルを一つだけ作って、その中で
switch($form_type) {
case 'text':
...
case 'checkbox':
...
}
などとし、バリデーションなどだけ動的に切り替えてもいいのですが、
やはり、柔軟性を高めるためにもデータの種類ごとにクラス化したいと思ってます。
似たようなアプリがあれば説明しやすいのですが、なかなか見つからないもので、、、すみません・・・
0232nobodyさん
2010/04/23(金) 16:46:50ID:???ttp://onlineform.jp/gen/form?template=inquiry&type=1&color=black
0233nobodyさん
2010/04/23(金) 16:51:23ID:???外してるかもしれんが自分なら
モデルはひとつ
データに応じてバリデーションを切り替える
種類の識別は、種類を格納したデータを持っておいても良いし、フィールド名(擬似的なフィールド名)で識別しても良い
って感じ。
柔軟性を高めるというのが何を意味しているのかはちょっと分かんなかった
0234nobodyさん
2010/04/23(金) 17:01:52ID:???なるほど。
データの種類ごとにクラス化すれば、処理を委譲できるのでそちらのほうが楽かな、と思ったのですが、
やはり、CakePHPを使う場合はベタな書き方のほうがいいのかな。
もうちょっと色々調べてみます m__m
0235nobodyさん
2010/04/23(金) 17:19:44ID:???クラスにしてもモデルにしてもいいんだけど、
結局データの種類に応じて読み込むんだろうから、一緒かと
あと、バリデーションだけなら、外出しするほどではないんじゃないかと想像
0236nobodyさん
2010/04/23(金) 17:22:17ID:???ttp://bakery.cakephp.org/articles/view/inheritable-behavior-missing-link-of-cake-model
ただ、やはりCakePHPで想定されている使い方ではないようですね…
モデル自体を自力で実装という手もありますが、少し凝ったことをしようとすると難易度が極端にあがる、
ということだけはわかりました…。
0237nobodyさん
2010/04/23(金) 17:42:54ID:???0238nobodyさん
2010/04/23(金) 18:27:26ID:aAazCR87どこが間違っているのでしょうか?
if( !$list = Cache::read('user_list') ) {
$list = $this->Index->getUserList();
Cache::set(array('duration'=> '+5 minutes'));
Cache::write('user_list',$list);
}
キャッシュ時間は
Cache::setで設定しろといろいろなサイトには書いてあるのですが、ここを記載しているとまったくキャッシュされていません。(正確にはキャッシュはされているが、Cache::readがfalseを返す)
ここをコメントアウトするとキャッシュされています。
ご教示お願いいたします。
0239nobodyさん
2010/04/24(土) 10:57:06ID:???sageてね
Cache::readの前にもCache::setが必要だと思う
が、解決するかは分からない
0240nobodyさん
2010/04/24(土) 11:13:01ID:???OOPを活かした書き方をしているものは皆無ですね
Javaちっくな書き方をするには、
やはり、フレームワークの縛りが強すぎるのだろうか
もし、なにかよいサンプルがあれば教えてください
0241nobodyさん
2010/04/24(土) 12:04:17ID:???CakePHPはphp4対応だから無理がある
0242nobodyさん
2010/04/24(土) 12:43:41ID:???継承しすぎて無意味に複雑になってしまうこともあるし。
自分1人でやってるならいいんだけど、多人数でやるなら分かりやすさを優先すべし。
0243nobodyさん
2010/04/24(土) 13:31:06ID:???まぁもうしばらく使ってみます
それとは別に、
へぇ、これもCakePHP製なの?というものがあったら紹介してもらえるとうれしいかも
製作例はいろいろ探してみたけど、全て同じようなものばかりですね…
0244nobodyさん
2010/04/24(土) 15:22:02ID:???でも>>243くんが何を持ってCakePHPっぽいと思っているか知らんから何とも言えないけど
0245nobodyさん
2010/04/24(土) 15:54:11ID:???それはどこでしょう?
色々参考になるかと思ってソース見てるんだけど、どれも似たような感じなので…
フレームワークなんで、当然といえば当然かもしれないけど、ちょっとおもしろみがないなと
0246nobodyさん
2010/04/24(土) 17:20:13ID:???俺ならそういうときはJAVAかrubyでやる
PHPのOOPはいろいろアレすぎて面倒
0247nobodyさん
2010/04/24(土) 18:08:57ID:???みんな最初っから cache 使ってプログラム組んでる?
サーバーに負荷がかかりまくってやべーなと思ったら cache を使うって方が効率がいいと思うけど。
0248nobodyさん
2010/04/24(土) 19:52:17ID:???0249nobodyさん
2010/04/25(日) 05:28:46ID:???ユーザー入力に応じて柔軟に機能を切り替えたいから。拡張も楽だし。
LimuSurveyというのがCakePHPが使われてるらしいと思って見たけど、
中身はCakePHPではなかった。
ttp://www.limesurvey.org/en/demo
デモを見たら、これがCakePHPならすげえや、と思ったけど、
やはりこういうのは難しいんだろうね。というか、ソースがごちゃごちゃになりそう。
0250nobodyさん
2010/04/25(日) 09:49:57ID:???難しいこともないしソースがごちゃごちゃになることもないが、きみがCakePHPをdisってるつもりがないなら、比較スレにいった方が良い
symfonyやRuby on Rails やDjangoなど、他にも優秀なFWはいっぱいあるから
あったものを選べば良いんじゃないかな
0251nobodyさん
2010/04/25(日) 15:27:11ID:???ガイドブック(1.1)にはMyISAMで作られてたし、SQL文見ても外部キーのことは書いてなかったし・・・
激しく即出な気が・・・
0252nobodyさん
2010/04/25(日) 15:35:18ID:???http://bakery.cakephp.org/articles/view/announcing-cakephp-1-3-0-stable
すたぶるキタ━━━━━━(゚∀゚)━━━━━━ !!
0253nobodyさん
2010/04/25(日) 15:38:43ID:???わかりやすく表形式とかで。
0254nobodyさん
2010/04/25(日) 16:22:54ID:???0256nobodyさん
2010/04/25(日) 18:26:09ID:???0258nobodyさん
2010/04/26(月) 03:52:40ID:???0259nobodyさん
2010/04/26(月) 04:34:23ID:???AOP的なのの使い所や命名なんかにルールを持たせとけば
ゆるくても品質はそんな下がったりせんけどな。
むしろPHPは言語サポートが少なすぎて厳密にやろうとすると疲れる。
0260nobodyさん
2010/04/26(月) 04:42:12ID:???0262nobodyさん
2010/04/26(月) 12:20:51ID:???1 $writedata
2 $write_data
3 $WriteData
4 $writeData
どれがcakephp流の規約でしょうか。
0263nobodyさん
2010/04/26(月) 12:27:17ID:???変数名が使われるケースはFormHelper::input()くらいかもだけど
$write_data
だね
もっと一般的な例で言うと
$admin_users
0265nobodyさん
2010/04/27(火) 09:35:18ID:???--
993 nobodyさん sage 2010/03/18(木) 08:05:51
1.3になってlibsってフォルダが増えたけど、
ここには何をいれるの?
vendorsとの違いは何??
--
ttp://mark-story.com/posts/view/using-custom-route-classes-in-cakephp
で、CakeRoute クラスを上書きする記事が出てるけど、そのなかに
App::import('Lib', 'routes/SlugRoute');
ってあったから、こんな感じの使い方じゃないかな?
(vendorsはCakePHP関係ないファイルを入れるところ)
0266Beginner
2010/04/27(火) 23:53:24ID:M6fZ8Sga以下の場合、逆ルーティングが出来ません。
処理の流れとしては、一覧画面→編集画面→確認画面→(登録完了)→一覧画面
という画面遷移になります。
routes.php
Router::connect(
'/systemFaqCategories/:faq_category_id/edit/*',
array(
'controller' => 'faq_categories',
'action' => 'systemFaqCategoryEdit'
),
array(
'faq_category_id' => '[0-9]+'
)
);
0267Beginner
2010/04/27(火) 23:54:09ID:M6fZ8Sga//編集画面
function systemFaqCategoryEdit(){
debug('Called systemFaqCategoryEdit');
pr($this->params);
$this->editFaqCategory('systemFaqCategoryEdit',
array(
'class_information_id' => FAQ_CATEGORY_TYPE_SYSTEM,
'faq_category_id' => $this->params['faq_category_id']
)
);
}
0268Beginner
2010/04/27(火) 23:55:19ID:M6fZ8Sgaprivate function editFaqCategory($actionName, $condition) {
if ($condition['class_information_id'] == FAQ_CATEGORY_TYPE_SYSTEM) {
// 編集画面 確認ボタン
if (!empty($_POST['confirmation']) && $_POST['confirmation']) {
$this->editConfirmation();
return;
}
// 確認画面 戻るボタン
if (!empty($_POST['return']) && $_POST['return']) {
$this->editReturn();
return;
}
// 確認画面 登録ボタン
if (!empty($_POST['save']) && $_POST['save']) {
$this->editSave();
return;
}
if($sId <> '') {
$getFields = array('id', 'class_information_id', 'category_title', 'regist_id', 'update_id', 'created' ,'modified');
$this->data = $this->FaqCategory->read($getFields, $sId);
$this->render('edit');
}
}
}
0269Beginner
2010/04/27(火) 23:57:37ID:M6fZ8Sga<?php
$confirmButton = array(
'controller' => 'faq_categories',
'action' => 'systemFaqCategoryEdit',
'faq_category_id' => $this->params['faq_category_id']
);
e($form->create('FaqCategory',
array('url'=>$confirmButton)));
e($form->submit('確認', array('name' => 'confirmation', 'div' => false, 'tabindex'=>1)));
?>
以下
入力inputのHTML
確認画面へ遷移した時に、ルーティングがきいていない。
URLがコントローラ名+アクション名になってしまう。
解決策をお持ちの方は教えてください。
長い文章になってしまったのはご了承ください。
0270nobodyさん
2010/04/28(水) 06:20:11ID:???あとバージョンを書いて
んでRouter::URL()でリバースルーティングできるかを教えて
0271nobodyさん
2010/04/28(水) 16:53:38ID:???モデルのsaveでNULLを入れたいときはどうしたらよいでしょうか?
OrderというモデルのpriceをNULLにしたかったので
$this->data['Order']['price'] = null;
とか
$this->data['Order']['price'] = '';
してから
$this->Order->save($this->data);
したのですが、DBには0という値が入ってしまいます。
もちろん、DB側ではNULL化というテーブル定義にしています。
0272nobodyさん
2010/04/28(水) 17:02:58ID:???今、適当な練習用サンプルを作っています。
利用するデータの編集をscaffoldを利用して作成しました。(Viewのみ多少修正)
しかし、削除のパスもリンクで表現されているので、(/hoge/delete/1 のように)
クローラーが巡回してきたらすべてのデータが消える気がします。
このデータは特に秘密にしたいようなものではなく、むしろ利用者で好き勝手に編集して問題がないので、セッション管理は行っていません。
セッション管理などしてない場所でscaffoldを利用するというのは想定外なのでしょうか。
現在はセッションを利用して対策する方向で修正していこうと考えていますが、
「何らかの対応方法がcakephpに用意されている」もしくは「もっと単純な対応策がある」
といった情報がありましたらぜひ教えてください。
0273272
2010/04/28(水) 17:04:13ID:???1.3を利用していますが、他のバージョンに変更も可能です。
0274nobodyさん
2010/04/28(水) 17:57:45ID:???普通に保存できると思う。少なくとも自分はできてる。
DB側のデフォルト値をNULLにしとけば間違いないはず。
CakePHPはNULL使わないほうがよいみたい。
バリデーションもnullの扱いがおかしすぎる。
0275nobodyさん
2010/04/28(水) 18:00:09ID:???0276nobodyさん
2010/04/28(水) 18:19:37ID:???返答ありがとうございます。
既存のレコードに大して実行すると、
ななんと「0000-00-00 00:00:00」という値が入ってしまいます。
これってバグ?なんですかねー。
明示的にNULLにUPDATEするためにはSQL書かないとだめなのかなぁ。
0277Beginner
2010/04/28(水) 21:54:40ID:???返事遅くなりまして申し訳ないです。
バージョンは、1.2.6です。
Router::URL()で逆ルーティングできました。
$url = Router::url(array(
'controller' => 'faq_categories',
'action' => 'systemFaqCategoryEdit',
'faq_category_id' => $this->params['faq_category_id']
)
)
e($form->create('FaqCategory',
array('url'=>$url)));
にすると、
<form id="FaqCategoryEditForm" method="post" action="/xxxx/xxxx/xxxx/xxxxx/systemFaqCategories/1/edit/">
変なURLが生成(先頭の/xxxx/xxxx/が余計)されてしまう。
0278nobodyさん
2010/04/29(木) 03:12:33ID:???nullはバリデーションのrequiredではじかれるが、allowEmptyではすり抜ける。
>>276
一部だけ更新したい場合は、事前に関係ないフィールドをunsetなどしておいたほうが安心。
特にループ中で保存する場合は思わぬデータが更新される場合がある。
コントローラーからなら、$dataに更新データが入っているとしたら、
$this->Model->create(null);
$this->Model->set($data);
if ($this->validate()) {
}
0279nobodyさん
2010/04/29(木) 03:17:58ID:???$dataに更新用のデータが入っているとしたら、下のようにするくせをつけておいたほうが安心。
// 更新する場合はキーを指定
// $data[$this->Model->alias][$this->Model->primaryKey] = 更新するレコードのID;
// $dataにフォームから受け取ったデータなどを設定。
$this->Model->create(null); // モデルのデータを初期化。 nullにしないとDBのデフォルト値が入る。
$this->Model->set($data); // モデルにデータをセット。create()しておかないと、前回のデータとマージされる。
if ($this->validate()) {
$this->Model->save($this->data, false);
}
0280nobodyさん
2010/04/29(木) 03:24:05ID:???f ($this->Model->validate()) {
だった。上記のようにしたらnullもいけないかな?
だめならDB側のデフォルト値をnullにしておいて、
unset($data[$this->Model->alias]['created']);
$this->create($data); // データがないフィールドはデフォルト値を使うようにする。
$this->set($data);
...以下同じ...
とかしてみたらどうだろう?
0281nobodyさん
2010/04/29(木) 03:27:26ID:???$this->Model->create($data); // データがないフィールドはデフォルト値を使うようにする。
$this->Model->set($data);
だ。
create()の中でset()と同じことされるからset()はいらないかもしれない。
0282nobodyさん
2010/04/29(木) 04:17:14ID:???create()は主キーもリセットされてしまいます
ですから、この場合のset()は必須です
NULLを使わない設計ができるのであれば、それに越したことはないです
0283nobodyさん
2010/04/29(木) 09:41:42ID:???解決方法は↓いずれか
1. Router::url($url ,true) をformのurlに指定する(第2引数でフルURL)
2. (アクセスしたURLと同じ場合)$this->here
3. $form->createに渡すURL配列に 'id' => "" を含める
3.は前スレだかに書いてあったやつだが試してない。ぜひ試してもらって結果教えて欲しい
0284nobodyさん
2010/04/29(木) 09:45:53ID:???NULLはbeforeSaveでセットする
↓を参考に工夫すると良い
http://bakery.cakephp.org/articles/view/null-behavior
ttp://d.hatena.ne.jp/kusakari/20070730/1185765186
0285nobodyさん
2010/04/29(木) 10:55:21ID:???どうしてもNULLを使いたいなら、ここまでに出た方法のどれかで凌ぐしかない
0286nobodyさん
2010/04/29(木) 11:12:30ID:???0287nobodyさん
2010/04/29(木) 18:11:37ID:???ランダムに1件レコードを取り出そうとして
$this->hoge->find('first', array(order'=> 'rand()')); はうまくいったのですが、
$this->hoge->find('first', array(order'=> 'rand(100)')); のようなシードを指定しての取り出しができません。
発行されているクエリは
SELECT …… ORDER BY rand(`100`) ASC LIMIT 1
のようになっており、エスケープされてしまっているようです。
エスケープさせない方法、または、シードを固定してのランダム取り出しの方法はないでしょうか?
0288287
2010/04/29(木) 22:54:24ID:???$this->hoge->find('first', array(order'=> 'rand((100))'));
としてrandにカッコを二つ続けて入れることで、置換対象から外しました。
queryのプレースホルダ的な感じでやりたいので、正当なやり方があったらぜひお教え願います。
0289nobodyさん
2010/04/30(金) 06:43:52ID:???$this->hoge->fing('first', array(
'order by rand(?)' => 100
));
でできない?
conditionsではプレースホルダ使えるけど、orderはできないかな?
試してないのでわからんが
0290nobodyさん
2010/04/30(金) 09:04:17ID:???以前議論あったがscaffoldはそういうものっていう結論に落ち着いてた
bakeして、それを書き換えてあげるしかない
0291nobodyさん
2010/04/30(金) 12:13:53ID:???ありがとうございます。
scaffoldはそういうものということで納得します。
bakeして書き換えも試してみようと思います。
0292nobodyさん
2010/04/30(金) 15:27:09ID:???0293nobodyさん
2010/04/30(金) 15:39:48ID:???0294nobodyさん
2010/04/30(金) 16:13:16ID:???0295nobodyさん
2010/04/30(金) 16:19:20ID:???cakebookのHABTMを保存の項がリンクおかしくなってるし。
0297nobodyさん
2010/04/30(金) 17:47:47ID:???viewの書き方はあるでしょうか?
validateでalphanumericをすると、事後的にチェックはできるのですが、
そもそも入力した時点で半角しか入力できないようにしたいのです。
formのtypeをpasswordにしたらそのような設定になるようですが、
textで見えている状態で強制的に半角入力にする方法を探しています。
0298nobodyさん
2010/04/30(金) 18:22:22ID:???ってことはアプリ側のロジックでなくて、ブラウザ側の話になるんでは?
スレ違いだけど、CSSのime-modeとかある、
0300nobodyさん
2010/04/30(金) 19:23:09ID:???ありがとうございます!
ブラウザ側から処理するcakeの機能がないかなと調べていました。
ぐぐって調べてみます!
0301nobodyさん
2010/05/01(土) 00:30:06ID:???Media プラグインはなんか扱いにくそうだし。
画像のURLとアクション呼び出すURLの仕組みの違いもわからんし…
0302nobodyさん
2010/05/01(土) 03:01:43ID:???横レスだが、俺は今更ながら本家RoRに浮気してみてるところ。
Cakeに対して理解をもってから望んだら、おもしろいくらいRoRがさっくり理解出来そうだったので。
で、CakeにあったDRYじゃない感やなんかがRoR(というかRuby)で解消されるならあっちに旅立つ予定。
やっぱCakeがいいやってなったらしれっと戻って来るw
0303nobodyさん
2010/05/01(土) 10:00:05ID:???興味深いからその後どうなったか教えてほしい
俺はRoRを使えるような場に恵まれないため今のとこ利用しないが。
0304nobodyさん
2010/05/01(土) 12:19:40ID:???0305nobodyさん
2010/05/01(土) 12:23:27ID:???0306nobodyさん
2010/05/01(土) 12:32:45ID:???0307nobodyさん
2010/05/01(土) 12:33:01ID:???0308nobodyさん
2010/05/01(土) 17:27:41ID:???layoutのdefault.ctpとか、1.2だと
$session->flash
になってるんだけど、1.3だと
$this->Session->flash
になってる。レイアウトを移行する時は要注意。
0309nobodyさん
2010/05/01(土) 17:43:56ID:???0310nobodyさん
2010/05/01(土) 18:05:55ID:???違う、$this-> は推奨だけど無しでも動く
echoが必要になった
echo $this->Session->flush();
0312nobodyさん
2010/05/01(土) 18:13:00ID:???本当だ。移行ガイドにも書いてあった。ありがとう。
移行ガイド、斜め読み程度で良いと思ってたけど、しっかり読もう。。。
0313nobodyさん
2010/05/02(日) 20:40:40ID:???CakePHPっていうのが人気なんでしょうか。
NetBeansのプラグインにSymphonyっていうのとZendっていうのしかないんですけど
それでもCakePHPがいいですかねぇ?
0314nobodyさん
2010/05/02(日) 20:45:19ID:???0315nobodyさん
2010/05/03(月) 01:09:54ID:???プラグイン?なんだそれ、喰えるのか?
俺はPHPエディタの延長のつもりでNetBeansでCake焼いてるよ。
0316nobodyさん
2010/05/03(月) 01:28:15ID:???0318nobodyさん
2010/05/03(月) 13:05:07ID:???0319nobodyさん
2010/05/03(月) 13:17:52ID:???0320nobodyさん
2010/05/03(月) 13:43:59ID:???CakeOnVimを使ってるけれど、そこまで重要なファクターではないなあ
0321nobodyさん
2010/05/03(月) 13:53:06ID:???自動補完とか文法チェックもできるんだね
でも見た目がアレだから、慣れないとストレスたまりそう…
0322nobodyさん
2010/05/03(月) 14:15:21ID:???Railsのスクリーンキャストでよく見かけるTextMate的な補完や操作が出来る。
昔はEclipseとかZDEとか使ってたけど、PHPに限って言えばIDE不要。
手になじむエディタ(それが人によってemacsかvimか秀丸かEmEditorかTextMateかBBEditか変わるが)
があればむしろ小回りが効いて良い。動的言語で手練れになるなら絶対コッチ。
0323nobodyさん
2010/05/03(月) 22:42:04ID:???FTPやらバージョン管理やらしようと思えばIDEのほうが断然便利だな
関数の定義元も一瞬で表示されるし
0324nobodyさん
2010/05/03(月) 22:58:23ID:???0325nobodyさん
2010/05/03(月) 23:16:54ID:???0326nobodyさん
2010/05/04(火) 01:18:42ID:???0327nobodyさん
2010/05/04(火) 01:30:32ID:???一発で整形が出来るのが便利。
エディタでも出来るかもしれんがw
Xdebugとか要求してきてメンドイが
■ このスレッドは過去ログ倉庫に格納されています