【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
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とか要求してきてメンドイが
0328nobodyさん
2010/05/04(火) 18:50:23ID:???1.3使っているのですが、
Shellから
静的HTML吐きだしたいのです。
ctpとViewのrender使ってレンダリング結果を保存しようとしたのですが、
ViewTaskも使えず、
Controllerをnewしてrenderしてもエラーがでてしまいます。
どなたか対処法ご存じないでしょうか?
上記方法はぐぐってでてきたので試したのですがダメでした……。
0329nobodyさん
2010/05/04(火) 19:31:04ID:???html_cacheというafterRenderでhtmlファイルを生成するplugin を使ったほうが早いかも
shellじゃないとだめなの?その場合は必要なファイルをimportしてnewしてって面倒くさいと思うが、今どう書いているのか教えれ
0330nobodyさん
2010/05/04(火) 19:46:53ID:???おお、そんなプラグインが……。
調べてみます。ありがとうございます。
shellでやりたいのは定期実行で、
古い記事を静的ファイルに落とす処理なのです。
URL叩くのでも良いのですが、その他の処理はTaskになっているので出来れば一度にやりたいと……。
以下、全てShell内部でやってます。
1. 既存コントローラ new
// DebugKit がどうとかでてエラー
App::import('Controller', array('Posts'));
...
$controller = new PostsController();
$controller->components = array('Auth');
$controller->constructClasses();
$posts = $controller->__createStaticHtml();
2. 只のコントローラ new
// エラー
App::import('Core', 'Controller');
...
$this->controller = new Controller();
$content = $this->controller->render('archive' , '' , $filepath );
3. ViewTask
// エラーorz...
var $tasks = array('View');
...
$this->View->getContent('archive', $params);
0331nobodyさん
2010/05/05(水) 22:23:38ID:???せめてGET方式に簡単に切り替えられないもんかね?
paginatorヘルパーのオプションでクエリを指定すればそれっぽくはなるんだが、
ソート(order)指定していると、ページリンクでコロン付きのリンクが生成さえれてしまう…
0332nobodyさん
2010/05/05(水) 22:49:52ID:???ほんと、モデル名がURLに出る仕様はどうかと思うわ
自前でクエリのパラメータ名とModel::paginate()のオプションを相互変換する処理書いたが、
もうちょいうまいやり方はないものなのかねえ
0333nobodyさん
2010/05/06(木) 12:38:02ID:???0334nobodyさん
2010/05/06(木) 21:56:38ID:???ルータ使っても名前付きのパラメータついちゃうねえ
page:2 とか
ルータで細かく指定すれば逆ルーティングしてくれるの?
0335nobodyさん
2010/05/06(木) 22:07:24ID:???/sort:Table.created/direction:desc
とかなってる。
ルーティングだけで
/date/desc
みたいにできるもんなの?
できなくて自前で書いちゃったんだけど、細かく指定してできるんならそっち使うわ
0336nobodyさん
2010/05/06(木) 22:37:56ID:???Router::connect('/search/:page',
array('controller' => 'Product', 'action' => 'search')
);
とか書いたらいけたわ…
ソートのほうは、表示名変えるには一個づつ全部かかないと駄目そうだけど
(逆)ルーティングもだいぶ賢くなったんだなあ
0337nobodyさん
2010/05/06(木) 22:51:27ID:???Router::connect('/product/search/date/:direction/:page',
array('controller' => 'Product', 'action' => 'search', 'sort' => 'Product.created')
);
ソートキー分だけ全部書かないとだめそうだが、いけた
第3引数で数字のチェックとかすれば、これでいけそう
あなどってたわ・・・w
0338nobodyさん
2010/05/06(木) 23:20:16ID:???Router::connect('/product/search/price/:direction/:page',
array('controller' => 'Products', 'action' => 'search', 'sort' => 'Product.price')
);
こんな感じのルーティングで、Product.price がvirtualFieldsの場合、
ソートの方は $paginator->sort(...) で逆ルーティングしてくれるが、
$paginator->next(...) なんかは逆ルーティングできない
Router::connect('/product/search/price/:direction/:page',
array('controller' => 'Products', 'action' => 'search', 'sort' => 'price')
);
とか書いたら $paginator->next(...) のほうはうまくいったが、今度はソートのほうが逆ルーティングできない
両方書いてみたらぱっと見はうまくいくけど、ソートの昇降が切り替えられなくなった
バグだよね
0339nobodyさん
2010/05/06(木) 23:25:18ID:???virtualFieldsのsort()自体にバグがあるみたい
昇降切り替えができない
0340Beginner
2010/05/07(金) 00:00:52ID:???レス遅くなりました。
1,2の方法ではうまく行きました。
3の方法ではうまく動かなかったです。
絶対URLになってしまったのですが、問題ないのでしょうか?
<form id="FaqCategoryEditForm" method="post" action="http://xxxxx/systemFaqCategories/1/edit/">
今までは、相対URLでしたけど・・・
0341nobodyさん
2010/05/07(金) 02:13:33ID:???virtualFieldsだと、Controller::paginates()で$paging['options']['order']のモデル名が消えてしまう模様
そのせいかわからないがPaginator::sort()が切り替えられない(逆ルーティングはできる)
Paginator::prev()で逆ルーティングできないのもそのせいかもしれない
原因探してもよくわからないから、paginatorヘルパーのオプション['url']['sort']を明示的に指定するようにしたよ…
0342nobodyさん
2010/05/08(土) 01:28:35ID:???$this->A->B->create($this->data);
if ($this->A->B->validates()) {....
って感じでバリデーションを調べようとしていて
hasMany関連だから$this->date['B'][0]['field']の形式なんだけど
$this->date['B']{'field']っていうフォーマットってじゃなきゃ、バリデートしてくれないみたい
英語、日本語でググってみたけど、なかなか解決できない…
誰か知ってたら教えてくだせえ
0343nobodyさん
2010/05/08(土) 14:35:38ID:???下記のように書いてみましたが、Session->writeでエラーが出てしまいました。
コントローラに書いた場合、 authByHashは上手く機能するのですが。。
class User extends AppModel {
public $components = array("Session");
function authByHash($id = null){
$conditions = array("hash" => $id);
$user = $this->find($conditions);
$this->Session->write('Auth',$user);
if(!empty($user) ){
return true;
} else {
return false;
}
}
0344nobodyさん
2010/05/08(土) 18:06:51ID:???0347nobodyさん
2010/05/08(土) 20:13:26ID:???0349nobodyさん
2010/05/09(日) 03:09:31ID:???オススメの方法はあるでしょうか?
コンポーネントとか使わずに、クッキー処理が正解なのかな。
0350nobodyさん
2010/05/09(日) 11:14:42ID:???0351nobodyさん
2010/05/09(日) 11:16:11ID:???0352nobodyさん
2010/05/09(日) 12:38:20ID:???公式のフォーラムにもあったはず
0353nobodyさん
2010/05/09(日) 20:37:17ID:???Class 'Model' not found in /path/to/app_model.php on line 39
ってなって動かないんだけどこれってバグ?しかも、毎回なるってわけでもなく、たまには動くんだよな。謎。
0354347
2010/05/10(月) 02:18:33ID:???サンクス。そっかー、1.2じゃ使えないのか。。。
面白そうな機能なので、1.3に上げたら使ってみます。
http://d.hatena.ne.jp/hiromi2424/20100204/1265274976
0355nobodyさん
2010/05/10(月) 11:32:48ID:???AttributeBehavior
http://bakery.cakephp.org/articles/view/attributebehavior-dry-and-powerful
っつうのもある
0356nobodyさん
2010/05/10(月) 13:03:35ID:???無知の俺でもデータベース使いまくリングw
0357nobodyさん
2010/05/10(月) 17:40:26ID:???いけた!ありがとう!たすかったw
てかsaveメソッドなのにsaveしないならvalidatesに引数渡して判断さしたほうが
わかりやすいような気がするぜこれw
0358nobodyさん
2010/05/11(火) 15:29:46ID:7YcJ1BHKcakephp1.3使ってます。
sanitizeについてなんですけど、
mysqlにtext,textareaでデータを格納するとき、
■Sanitize::clean($this->data)か
Sanitize::html($this->data['User']['・・・'];
どっちつかってますか?
■sanitizeしたデータを取り出すとき、(例えばaddしたデータをeditするときなど)
おおおおおお\n<a href=ageorgja>あぞあおb</a>\n<?pjfeowjfo>fewjfoewjoewjfoewdj<?>\n<?php fjaeof
こんな風になってしまうんですけど、いい回避方法教えて下さい。
0360nobodyさん
2010/05/12(水) 00:13:03ID:???みなさんに質問なんですが、編集、削除時の楽観排他はどうやって実現されてますか?
1.データ取得時に、更新日時を持っておく。
2.編集(削除)実行前に、対象データを検索して、更新日時を取得
3. 1と2の更新日時を比較
4. 同じなら編集(削除)実行、違ったら何もしない。
こんな感じでしょうか?
CakePHPでSELECT FOR UPDATEってどうやって実現するのでしょうか?
普通にSQL文を投げる?なんとなくCakeぽっくないですが・・・
0361nobodyさん
2010/05/12(水) 09:59:39ID:???http://cakephp.jp/modules/newbb/viewtopic.php?topic_id=1500&forum=6&post_id=3400
やったことないけど、公式フォーラムにあったよ
見てないけどbehavior作った人もいるみたい
0362358
2010/05/12(水) 13:42:37ID:ISVrEn/nsanitizeしないと危険ですよね?
皆さんどーしてはるんですか?
0364nobodyさん
2010/05/12(水) 14:41:27ID:???サニタイズは必要だよ。
359の方法は試したのか?CakePHPのソースあるんだから、人に頼る前に自分でコード追ったり、
どんなSQL文が発行しているのか、確認した方がいいんじゃないか?
ここ、質問スレ?
0365nobodyさん
2010/05/12(水) 14:46:52ID:???○SQL文を
0366nobodyさん
2010/05/12(水) 15:42:41ID:???0367nobodyさん
2010/05/12(水) 15:47:50ID:???あしたまたあるってのは運営GJだと思う
0368sage
2010/05/13(木) 22:02:44ID:DXEWzNfV>>363
ありがとうございます。
2ちゃん素人なもんでsageは初めて知りました。
>>364
ありがとうございます。
あと、最初にスレ違いかもって断ったし、近くに質問する人いないんで、
勘弁してくださいよ。
0369nobodyさん
2010/05/13(木) 22:05:53ID:???1時間で半分も埋まってない
0370nobodyさん
2010/05/13(木) 22:10:10ID:???http://kmaebashi.com/zakki/zakki0042.html
読んでないけど。
つかここCakeのスレだったね
■ このスレッドは過去ログ倉庫に格納されています