【PHP】フレームワーク CakePHP 12ホール目【笑】
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2011/07/01(金) 16:33:46.28ID:???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
前スレ
【PHP】フレームワーク CakePHP 11ホール目【v1.3】
http://hibari.2ch.net/test/read.cgi/php/1297860755/
0671nobodyさん
2011/10/12(水) 14:29:40.83ID:???$data = $this->paginate();
$this->set('data',$data);
}
0672nobodyさん
2011/10/12(水) 16:09:12.63ID:???function index(){
$this->paginate = $this->ModelName->methodName();
$this->set('data', $this->paginate());
}
0673nobodyさん
2011/10/12(水) 16:39:49.89ID:???それは普通にコントローラーでpaginateしてるだけですよね?
そうではなくて、findの箇所はモデル内で作成しています。
それを取得してpaginateのfind箇所を置き換えられないかと思い質問しました。
#test_controller
$list = $this->Test->getFind($options);
$this->set('test_list', $this->paginate($list));
こういうイメージです。(もちろんこれでは動きませんが...)
0674nobodyさん
2011/10/12(水) 17:02:09.88ID:???モデルの中で自己流でfindをオーバーライドしてるなら
_findAll,_findCount,_findFirstあたりもきちっとつくらねばならん。
この辺はPagenateがどういう動きをしてるか、Modelクラスのソース追って下さい。
0675nobodyさん
2011/10/12(水) 17:29:23.61ID:???ずーっとJavaやってたからJavaベースで思い浮かぶのがそもそもの敗因
0676nobodyさん
2011/10/12(水) 18:01:53.84ID:???1つのファイルにif入れたり、コントローラーからsetするのも限界があるし。
(ソースが汚くなって見づらいから、ファイルを分けた方が視認性が良くなる
0677nobodyさん
2011/10/12(水) 19:33:00.65ID:???findしたデータをpaginateするんじゃなくて、paginateにSQLを渡すイメージ
じゃないと、findで余計なデータをメモリに持っちゃうじゃん
http://book.cakephp.org/ja/view/1237/カスタムしたクエリによるページ付
0678nobodyさん
2011/10/12(水) 19:34:28.35ID:???http://book.cakephp.org/ja/view/1237/%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%81%97%E3%81%9F%E3%82%AF%E3%82%A8%E3%83%AA%E3%81%AB%E3%82%88%E3%82%8B%E3%83%9A%E3%83%BC%E3%82%B8%E4%BB%98%E3%81
0680nobodyさん
2011/10/12(水) 23:14:24.71ID:???672を書いたものですけど、勘違いされてるようなのでもう少し詳しく書くと
モデル :
function methodName($user_id)
{
return array(
'fields' => array('...'),
'conditions' => array('ModelName.user_id' => $user_id),
'order' => array('Hoge.id DESC'),
);
}
コントローラ :
function index(){
$this->paginate = $this->ModelName->methodName($this->Auth->user('id'));
$this->set('data', $this->paginate());
}
みたいな感じです
あなたがいうモデルでfind組み立てて、コントローラでpaginateに代入し、ビューに渡すという流れです
0681nobodyさん
2011/10/13(木) 15:33:11.40ID:???せっかく説明していただいたのに申し訳ないのですが、希望は違います。
findだけで済む箇所とpaginateまで生成したい箇所があるので、
コントローラーでそれを操作したいと思い、>>670のように質問しました。
680さんのは基本的なオプション指定だけをモデルに書いて
それをpaginateに渡すイメージですが、そうではありません。
0682nobodyさん
2011/10/13(木) 18:19:08.28ID:???以下が妥当かと。
モデル:
public function getFind($paginate=true)
{
$criteria = array(
'fields' => array(...),
'order' => 'Word.id DESC',
);
if ($paginate)
return $criteria;
else
return $this->find('all', $criteria);
}
コントローラ:
public function ページネーションするアクション()
{
$this->paginate = $this->ModelName->getFind();
$this->set('models', $this->paginate());
}
public function ページネーションしないアクション()
{
$models = $this->ModelName->getFind(false);
$this->set(compact('models'));
}
0684nobodyさん
2011/10/13(木) 19:35:17.24ID:???今はhelperに書いてcontrollerからも読み込むようにしてるけど普通?
0685nobodyさん
2011/10/13(木) 19:56:53.48ID:???興味なのだが、viewとcontroller共通の処理って何?
その2つで共通なら、逆にmodelに書くべきと思うが。
0686nobodyさん
2011/10/13(木) 21:26:35.92ID:???コントローラクラス内で各メソッドがデータを共有操作できるメンバー変数のようなものはもてないでしょうか?
例えば、indexが呼ばれるたびに1加算されて表示されるようなことがしたいです。以下の方法はダメでした
public $ii = 0;
fanction index() {
echo $ii;
$ii++;
}
$iiのデータが共有されるのは全ユーザではなく、ユーザ単位である必要があります。
0687nobodyさん
2011/10/13(木) 21:31:40.05ID:???modelも違うかな…そもそも設計間違ってるのか
0689nobodyさん
2011/10/13(木) 23:05:30.03ID:???質問元と違うが、controllerの方でパンくずリストを登録して、viewの方で表示する場合など
0690nobodyさん
2011/10/13(木) 23:58:06.07ID:???・投稿されていたらその画像を表示。そうでなければno_image.gifを表示
という2つの処理をするだけでもviewに書いていくと汚くなるんだよな・・・
だからヘルパー作るかコントローラーでfind後に再処理する方が良いと思う
0691nobodyさん
2011/10/14(金) 08:54:54.73ID:???これらは違いがあるのでしょうか?
0692nobodyさん
2011/10/14(金) 11:14:03.92ID:???リクエストがGET → $this->params
0693nobodyさん
2011/10/14(金) 12:01:41.71ID:???間違いなの?
0694nobodyさん
2011/10/14(金) 12:05:51.56ID:???ifとか
0695nobodyさん
2011/10/14(金) 13:09:12.64ID:???コントローラー名/アクション名/引数
の引数の部分にファイル名を渡したら、.jpgなどの部分だけ削除されてコントローラーが受け取ってしまう
どうすれば拡張子の部分も受け取れますか?URLエンコードしても同じだった
0698nobodyさん
2011/10/14(金) 18:09:04.28ID:???bakeしてみたコントローラ見てみるとif ($this->data) などという風に使われている。「出来るから間違いじゃない」という意味では間違いじゃないんだろうが、CakePHPの規約としてはdata使うようになってるみたいだね。
(cookbookだかチュートリアルのどこかにフォームのデータを一元化する為にdataを使うのが正しい、というような事が書いてあった希ガス)
0699nobodyさん
2011/10/14(金) 18:45:42.02ID:???696じゃないけど、viewに渡すデータ自体の画像の部分をno_image.gifに置き換えちゃうってことじゃないの?
そうすればデータには必ず画像が入ってるからviewはすっきりする。
ただ、MVCの役割を考えるとそこでやるべきかどうかは考えた方がいいかもね。
0700nobodyさん
2011/10/15(土) 00:20:40.03ID:???>>665で言われてる結合する、というのがよくわからないんです。
find の第2引数で 'joins' というのがありますが、
これだと 'conditions' でそれぞれのテーブルの対応するフィールドの値を入れてやって関連づけを行わないといけないですよね?
SQL はほとんどわからないので、的外れなことを言ってるかもしれませんが、
2つのテーブルを関連性などなしで単純に全て混ぜてしまって作成日で降順をかける、なんてことは可能でしょうか?
詳しく解説などされているサイトなど教えてもらえると助かります。
0701nobodyさん
2011/10/15(土) 00:23:22.40ID:???0703nobodyさん
2011/10/15(土) 00:42:16.57ID:???まあどのバージョンでも同じ話ではあるけど。
0705nobodyさん
2011/10/15(土) 01:44:09.51ID:???なるほど。そう言う意味か。
俺はafterFind使わずに全てviewでやってるな。
日付のフォーマット変更する時もヘルパー作って。
でも、ヘルパーで対応するのは限界があるし、ifが増えて困ってたんだ。
afterFindを使いこなしてviewの内容を簡素にするのも有りだな
0706700
2011/10/15(土) 02:13:04.18ID:???もう少し詳しく教えてもらえますか?
DB 側で View を定義っていうのは具体的にはどういうことでしょうか?
0708nobodyさん
2011/10/15(土) 16:01:05.22ID:???ビューの作り方はデータベース名 view とかビューとかで調べればすぐ分かるよ。
(データベースによって細かいとこ違った気がするから、自分で調べた方がいい)
要件に合ってるか分からんけどな。
0709nobodyさん
2011/10/15(土) 17:06:30.92ID:???0710700
2011/10/15(土) 18:45:56.65ID:???まさにそうでした。
MySQL に View という機能があるということなのですね。
今調べ始めましたが、MySQL文はちんぷんかんぷんなので苦戦中です。
View を作ってそこからデータを取ればいいということは理解しました。
みなさんありがとうございました。
0711nobodyさん
2011/10/16(日) 10:45:57.40ID:85Bgp1nuとありますが、それはすなわち、Ruby開発者
まつもとゆきひろ がいなかったら
Cake phpは生まれなかった? ということですか。
0712nobodyさん
2011/10/16(日) 10:47:33.20ID:???というよりむしろ、Rubyがここまで広まったのはRailsがあったから、って事だったんじゃないかなぁ。
0714nobodyさん
2011/10/16(日) 11:09:56.42ID:85Bgp1nuかかわっていですけど、CakePHPが影響をうけた
Ruby on Rails は まつもとゆきひろがいなかったら
生まれてなかったわけですよね。
0715nobodyさん
2011/10/16(日) 11:11:11.55ID:???PHPの部分は好きな言語に変えろや
0716nobodyさん
2011/10/16(日) 13:25:11.56ID:???RouterがURLを解釈してくれるからですよ。
$this->paramsを覗いてみればいいよ。
もしくは http://example.com/controller?arg=eroero.jpg みたいに普通のGetで渡すか。
行き詰まったらとりあえずdebug($hoge);で状態を把握すべきすよ。
0717nobodyさん
2011/10/16(日) 15:03:58.44ID:???確か拡張子が $this->params->url['ext'] とか、そんなとこに入ってたかと。
たとえば hoge/test.jpg で $this->params->url を debug したら、
Array(
'ext' => 'jpg'
url'' => hoge/test
)
こんな感じになってる。
だからコントローラーで拡張子の有無を調べてやるといいと思う。
0718nobodyさん
2011/10/16(日) 15:38:22.27ID:???0719nobodyさん
2011/10/16(日) 16:36:56.47ID:???どうしてRuby on railsのスレは冷たい人間が多いの?
選択するFWでこんなにも平均的な人間性に優劣がつくもんなの?
0720nobodyさん
2011/10/16(日) 17:08:46.25ID:???だから悪い奴のレスが目立つのであって、いい人もいるだろ。
ただし、悪いレスが多いスレにいい人が書き込むかは疑問だが。
0721nobodyさん
2011/10/16(日) 17:46:52.93ID:???一所懸命マニュアル書いた奴がいるんだから一所懸命マニュアル読め。ってのは間違ってない。
0722nobodyさん
2011/10/16(日) 18:01:49.02ID:???おみゃーさんだってたとえば、三角関数の授業してる時に乗算の話が分かりません!なんて奴居たら追い出したくなるだろ?
まぁ問題は、大抵、質問してる奴は、自分がレベル低すぎってーのを分からないし認めたくないってー所にあるんだよな。
0723nobodyさん
2011/10/16(日) 18:12:58.04ID:???$data = $this->User->findById($id);
if (!empty($data)) {
$this->set('data', );
} else {
$this->redirect('/user/error');
}
}
function delete($id){
// detailと同じ内容
if ($this->data) {
// 削除用のソース
}
}
こんな感じのuser_controller.phpがあるとします。
削除(delete)する際に登録されているデータを表示して
「このデータを削除しても良いですか?」という画面を表示したいのですが、
deleteアクションにdetailと同じソースを書いてるので違和感があります。
何か良い書き方は無いでしょうか?
0724nobodyさん
2011/10/16(日) 21:04:13.48ID:???標準で出てなかったっけ?
Javascriptでダイアログが出ると思ってたんだけど。
それじゃなくて、わざわざ削除してもいいですか画面だしたいのなら、削除してもいいですかアクションを作るか、状態を記録して、フラッシュで表示してやるとかなんとかだろうなぁ。
0725nobodyさん
2011/10/16(日) 21:15:43.58ID:85Bgp1nusmarty式ですか?
php直書き式ですか?
0726nobodyさん
2011/10/16(日) 21:55:26.93ID:???javascriptをオフにしてるユーザーが多いでしたけど
現在はどうなんでしょ?
そこらへんも考えて開発すべき?
0727nobodyさん
2011/10/16(日) 22:53:07.52ID:???ajaxと付くものは総じてjavascript有りきの機能です。
よほどのひねくれ者以外、javascriptをOFFにしていたら、Googleすら不便に感じる時代です。
ONにしていると考えてよいです。
クロスブラウザ設計を考えて、jqueryなどのjavascript用FWを導入するのを強くおすすめします。
0728723
2011/10/16(日) 23:38:10.16ID:???いや、そう言う質問じゃなくて、>>723のようなソースを書くと、
「詳細画面」以外にも同じようなコードを書く必要があるので、
どうにか簡略化できないものか?と思っての質問です。
あと、javascriptではなくて、確認画面を出したいのです。
0730723
2011/10/17(月) 01:01:02.78ID:???↓こうするという事ですか?
function delete($id){
$this->detail($id);
if ($this->data) {
$this->User->deleteAll(array('User.id' => $id));
}
}
これでも問題ないと思うのですが、、後々困らないか心配・・・
0731nobodyさん
2011/10/17(月) 01:11:58.70ID:???729はこういうことを言いたかったんだと思う。
function detail($id){
$this->_common($id);
}
function delete($id){
$this->_common($id);
if ($this->data) {
// 削除用のソース
}
}
function _commonl($id){
$data = $this->User->findById($id);
if (!empty($data)) {
$this->set('data', );
} else {
$this->redirect('/user/error');
}
}
0732nobodyさん
2011/10/17(月) 01:44:47.56ID:???プログラムやってなくていきなりCakeから入っちゃう人が多いの?
0733nobodyさん
2011/10/17(月) 09:27:29.40ID:???0734nobodyさん
2011/10/17(月) 10:37:11.07ID:???http://bakery.cakephp.org/articles/lorenzo/2011/10/16/cakephp_2_0_released
0735nobodyさん
2011/10/17(月) 11:52:25.10ID:???0736nobodyさん
2011/10/17(月) 13:02:10.50ID:???なんなんだよこれ・・・
0737nobodyさん
2011/10/17(月) 13:05:01.05ID:???タイムゾーンがどうのって注意はされたけど普通に焼けたよ。
でも既存サイトを移行すんのは結構手間っぽいな。
0738nobodyさん
2011/10/17(月) 13:29:20.58ID:???あれ?
Notice: Undefined index: text みたいのが出まくるんだが・・・
ディレクトリ構成とか、だいぶ変わってるねぇ
0739nobodyさん
2011/10/17(月) 13:59:43.23ID:???0740nobodyさん
2011/10/17(月) 20:03:21.73ID:???2ページ目になぜか10件表示されるんですが、これを5件にする方法ありますか?
0741nobodyさん
2011/10/17(月) 21:09:15.91ID:???0742nobodyさん
2011/10/18(火) 02:25:37.24ID:???みじんも思ってないとこが怖い
0743nobodyさん
2011/10/18(火) 11:21:54.03ID:???特別な処理をした時にセッションが切れてしまうのですが、わかる人がいれば教えていただけないでしょうか?
やっているのは、Flashで簡単なバイナリデータ(画像)を作成し、それをpostしてファイルとしてサーバ側で保存しています。
サーバ側はAuthコンポーネントでログイン管理を行っています。
さらに不思議で、PC起動後1回目に上記の現象が発生するのですが、もう一度ログインするとセッションは切れません。
0744nobodyさん
2011/10/18(火) 13:07:51.49ID:???0745743
2011/10/18(火) 14:33:00.58ID:???ローカル、ネット共に発生します。
Flash側のpost先はフルパス(http://www.・・・・)で指定しています
0746nobodyさん
2011/10/18(火) 15:18:12.43ID:???ログインしているURLが異なる事はありませんか?
0747743
2011/10/18(火) 15:58:06.45ID:???おおおおお、ありがとうございましたm(_ _)m
初めはURL手入力で、
http://hoge.jp でアクセスしていましたが、Flashのpost先はhttp://www.hoge.jpになっていました。
2回目以降は、 http://www.hoge.jpを使い回しているので常時接続していました。
ローカル環境はネットのURLに飛ばしてたんで切れて当たり前でしたw
これで、セッション切れるもんなんですね。
0748nobodyさん
2011/10/18(火) 16:27:56.44ID:???後学の為に、クッキーモンスターについて知っておくと良いかも
たぶん、cookie http クッキーモンスターで検索すると詳細見つかるよ
0749nobodyさん
2011/10/18(火) 17:23:33.92ID:???0750nobodyさん
2011/10/20(木) 12:36:03.93ID:???0751nobodyさん
2011/10/20(木) 12:44:39.29ID:???むしろやっとという感
0752nobodyさん
2011/10/20(木) 13:16:38.39ID:???0753nobodyさん
2011/10/20(木) 18:45:09.14ID:???レンサバだってほどんど5対応してるし。
0754nobodyさん
2011/10/20(木) 19:53:02.70ID:???0755nobodyさん
2011/10/20(木) 20:24:44.11ID:???0756nobodyさん
2011/10/20(木) 22:47:59.02ID:???今やWordPressだって5.2以降だ
0757nobodyさん
2011/10/21(金) 00:12:41.15ID:???1テーブルへの保存は素直にモデル使う方のが楽だけど
0759nobodyさん
2011/10/21(金) 09:56:11.01ID:???直書きするしかないだろうか
0760nobodyさん
2011/10/21(金) 10:11:15.02ID:???みたいにするとき、SQL直書きしちゃうな。
0761nobodyさん
2011/10/21(金) 12:54:50.68ID:???0762nobodyさん
2011/10/21(金) 16:24:09.04ID:???簡単に実装できそうな気がするんだけどな
なんでできないんだろ
0763nobodyさん
2011/10/21(金) 17:40:19.31ID:???0764nobodyさん
2011/10/21(金) 18:24:38.42ID:???どうしたら良いんでしょうか?username, emailのみ残したいんですが。
0765nobodyさん
2011/10/21(金) 18:31:44.77ID:???$model['User']['email'] = $this->Auth->user('email');
これだとちょっと無駄な気がしまして。。
0766nobodyさん
2011/10/21(金) 18:39:25.50ID:???一度、自分で作ってみりゃ分かるよ。
まぁ、作る気もないのなら
http://gihyo.jp/dev/serial/01/cakephp/0015
^ここらへん見てみれ。
cookbookだかCakePHPの公式の文書あたりでもページネーションの難しさを論議してた所があった気がするが、文句言うくらいなら少しは自分で考えてみるべし。
0767nobodyさん
2011/10/21(金) 19:31:44.18ID:???ArraySource使えば一瞬だろうに
>>764
array_intersect_key($user, array_flip(array('hoge', 'fuga', ...)))
>>766
的外れだと思う。
というかずっとカスタムページネーションをモデルで実装することがなんで今までほとんど
話題に挙がってないか不思議すぎる。
0768nobodyさん
2011/10/21(金) 19:39:21.27ID:???的外れだと思う。
>というかずっとカスタムページネーションをモデルで実装することがなんで今までほとんど 話題に挙がってないか不思議すぎる。
何言っているのか分からない。
モデルを作ると半ば自動的にページネーションを使えるようになっているわけだが、「モデルで実装することがなんで今までほとんど話題に挙がってないか」の意味は、どういう意図なのでしょうか?
かなり昔にいじっていたsymfonyのページネーションだと、全体件数のsqlやら、ソートしなおす場合のsqlのテンプレートやら、カスタムsqlだとかなり色々いじる必要があったが、そこらへん理解できますか?
0769nobodyさん
2011/10/21(金) 21:13:36.76ID:???モデルとRDBを結び付けてたみたいだけど、モデルってRDB以外にもデータソース割り振れるんよ。RDBばっか使ってるから忘れてる事多いけど。
探せばRDB以外でもページネーションしてるの見つかると思うからそれ参考にすりゃ、作れると思うよ。
っつか、そもそもSQLでかたつくもんなら、そんな面倒な事考えないでRDB側でビュー作っちまうのが手っ取り早いな。
0770nobodyさん
2011/10/21(金) 22:00:39.54ID:???どうdataを形成したらうまく保存できるか分からないのですが、
教えていただけませんか?
■ このスレッドは過去ログ倉庫に格納されています