【PHP】フレームワーク CakePHP 9ホール目【v1.3】
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2010/07/23(金) 09:13:26ID:v3m09M9uCakePHPから派生した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
0616nobodyさん
2010/09/16(木) 22:07:43ID:???0617nobodyさん
2010/09/16(木) 23:18:48ID:???0618nobodyさん
2010/09/17(金) 00:51:47ID:???むしろ、バーチャルホストでどう実装するのか聞きたい。
>>616
本の通りに書いていれば、ドメイン分けずにすむだろ。
0619nobodyさん
2010/09/17(金) 10:08:15ID:???0620nobodyさん
2010/09/17(金) 12:39:29ID:???0621nobodyさん
2010/09/17(金) 19:08:58ID:???http://www.exgear.jp/blog/2010/09/geo_simple_plugin/
便利そうなんだが、ライブラリ依存しないCakePHPのプラグインがライブラリ依存してるというのも皮肉な話だな
0622nobodyさん
2010/09/17(金) 19:23:15ID:???○利用
0623nobodyさん
2010/09/17(金) 21:12:29ID:???0624nobodyさん
2010/09/20(月) 01:01:46ID:???エラーメッセージを出そうと、Cookbookの
http://book.cakephp.org/ja/view/1252/Displaying-Auth-Error-Messages
を見て同じようにビューにecho $session->flash();と記述したのですが、
Undefined variable: sessionのエラーが出ます。
これはどうしてでしょう?$this->set('session', $session)みたいにして
ビューに渡す必要はないですよね?
0625nobodyさん
2010/09/20(月) 01:23:29ID:???ログイン情報を記述しているapp_controllerにヘルパーを指定してるのですが、
そこにSessionを指定しないとエラーが出るみたいです。
0626nobodyさん
2010/09/20(月) 05:35:42ID:???自分で言っているとおり、Sessionヘルパーを使うことを
宣言する必要があると思いますよ。
class AppController extends Controller{
var $helpers = array('Session');
}
Sessionコンポーネントは宣言してなくても使えるけど、
Sessionヘルパーは宣言する必要があったはずです。
0627nobodyさん
2010/09/22(水) 08:56:04ID:R9kqnTJBとまってしまってます。
データベースを作成する過程がないので、どのデータベースにテーブルを
作成するのかがわかりません。
0628nobodyさん
2010/09/22(水) 08:58:32ID:???チュートリアルの次のページを見れば分かる。
0629nobodyさん
2010/09/22(水) 09:54:00ID:R9kqnTJBありがとうございます。
これで先に進めます。
0630nobodyさん
2010/09/22(水) 14:23:14ID:???0631nobodyさん
2010/09/22(水) 18:54:44ID:???モデル名 → テーブル名
と考えるとわかりやすいよ。
ただし、モデルの命名規則とテーブルの規則は違うから注意。
例)モデルでUserならテーブルはusersを作成する
0633nobodyさん
2010/09/22(水) 20:19:43ID:???0634nobodyさん
2010/09/22(水) 23:10:29ID:???0636nobodyさん
2010/09/23(木) 08:16:19ID:???0637nobodyさん
2010/09/23(木) 13:13:13ID:???0638nobodyさん
2010/09/23(木) 14:23:16ID:???0639nobodyさん
2010/09/23(木) 14:43:20ID:???公式のサンプルやり始めた俺には参考になるよ。
命名規則で結構引っかかってたところ。
サンプルだとpostっていうモデル作ったら
DBはpostsにしろって言われてなんでsつけるのか意味不明だった。
コントローラーにもよくわからない形(posts_controller.php)
とか名前つけてるから?が多かった。
自動解釈してくれるからこういう形式にしろよって意味だろうけど
書籍なしでいきなり始めるとわけわかめ。
0640nobodyさん
2010/09/23(木) 15:01:57ID:???0641nobodyさん
2010/09/23(木) 15:15:12ID:???0644nobodyさん
2010/09/23(木) 15:32:43ID:???テーブル→posts
レコードがたくさん集まってテーブルになるんだ。
これはphpやMVCとは関係ないDBの基本だからな、覚えとけよ。
0645nobodyさん
2010/09/23(木) 15:56:34ID:???ありがとう、早速動画見つけたので見てるが
すごいわかりやすくて助かる。
Cから入った人間だから、C++のときもそうだったけど
オブジェクト指向とか、MVCモデルについては
なかなかとっつきにくかったけど、これはありがたい。
0646nobodyさん
2010/09/23(木) 16:05:37ID:???0647nobodyさん
2010/09/23(木) 17:39:58ID:???単数形と複数形が同じなので注意!
0648nobodyさん
2010/09/23(木) 20:19:39ID:???0649nobodyさん
2010/09/24(金) 02:17:58ID:???0650nobodyさん
2010/09/24(金) 03:14:33ID:???新規の開発にしか使えないFWってどんなメリットがあるのよ?
既存の改修とかに使えないんだろ?
チンカスレベルの屑FWとしか言えんだろ?
0651nobodyさん
2010/09/24(金) 03:55:59ID:???0652nobodyさん
2010/09/24(金) 08:33:43ID:???むしろ命名規則にのっとたり、書き方も厳密にしなきゃいけないし、
よけない手間が増える。
だが、優柔不断な俺にはそれが良い。
0653nobodyさん
2010/09/24(金) 08:42:53ID:???PHPみたいに甘い言語だと、プログラマーによって
かなりオレオレ仕様だったり、ソースがわかりずらかったりするから
フレームワーク使うと、統一化されて跡から保守しやすいっていうメリットが生まれる。
また、ページごとにやってたようなエラー処理だとか
フォームの入力チェックみたいな処理も自動化出来てわかりやすい。
どちらかというと3人程度〜の新規開発向けだと思うよ。
個人でやってぱぱっと作るならFW使わなくても別に困らないしw
0654nobodyさん
2010/09/24(金) 09:42:52ID:???多少の生産性は犠牲にしつつも保守性を上げるための仕組み、
という面は確実にある気がする。
慣れてくればそのオーバーヘッドもだんだん減ってくる(はず)だし、
そもそもFWって元来そういうもんだよね。
CakePHPの場合は強制される規約が多すぎて、
たとえばタグライブラリ的な使い方をしようと思ったときに
ちょっと難しい部分があるのも事実だけど。
0655nobodyさん
2010/09/24(金) 09:50:20ID:???でも、それらって中小以上の、制作会社なら
独自の規約やルールが決まっていると思うんだよな。
フォームヘルパーのようなライブラリも作ってるだろ。
SOHOなら別にオレオレでも構わないと思うし、規模もたかが知れてる。
かといって、規模が大きめの案件ならFWは速度的なネックがある。
まぁ、俺はオレオレの仕様変更が多くて定まらないから、
Cake使ってるんだけどな。規模が小さい案件ばかりだし。。
0656nobodyさん
2010/09/24(金) 10:26:20ID:???CakePHP辞典 Pocket詳解 [単行本]
0657nobodyさん
2010/09/24(金) 11:22:13ID:9bxZAnFYpaginatorのようにページ送りしたいんだけど、
いい方法ってありますか??
0658nobodyさん
2010/09/24(金) 11:22:15ID:???普通にfindしてからsaveしないと駄目?
saveByIdとか簡単な関数ないの?
0659nobodyさん
2010/09/24(金) 11:33:35ID:???$dataにidがあればupdateになるから
array(
'id'=>1,
'field1'=>'hoge',
);
これをsaveすればid1のfield1のみアップデートされる
0660nobodyさん
2010/09/24(金) 11:34:10ID:???良くわからない事言ってるが、
保存されている情報を取得するならfind(select)は必須だろ?
saveAllにしてパラメータ指定するのはダメなのか?
0661nobodyさん
2010/09/24(金) 11:35:49ID:???0662nobodyさん
2010/09/24(金) 11:37:22ID:KWM9yVDw<?php echo $html -> css('hoge', null, array('inline' => false)); ?>
のようにして、レイアウトの $scripts_for_layout にCSSの記述を追加できますが
タイトルは、コントローラから
$this -> set('title_for_layout', 'ほげほげ');
とするしか手がないんでしょうか。
タイトルもctpファイルからレイアウトの $title_for_layout に設定できたらいいんですが
できないものなんでしょうか。
0663nobodyさん
2010/09/24(金) 12:09:19ID:???Webサービスとかなんらかの読み込み元のデータはあるんでしょ。
find、_findCount、_findAll あたりをオーバーライドしたモデルを作るか、
データソースドライバを作ればPaginator関係はそのまま使えるので便利。
0664nobodyさん
2010/09/24(金) 12:16:54ID:???すみません質問間違ってました、id以外をキーにしてそれできませんかね。
できないなら、やはりfindしてidを取ってこないといけないですよね。
0665nobodyさん
2010/09/24(金) 12:39:38ID:???Controllerクラスだけでなく、Viewクラスにも pageTitle というプロパティがあるので、
ctpファイルのどこかで
<?php $this->pageTitle = "ほげほげ"; ?>
とすればOKだと思う。
0668662
2010/09/24(金) 15:21:06ID:???このあたり、1.3で仕様が変更になっているんですよね。
'inline' => false の指定方法とか。
<?php $title_for_layout = 'ほげほげ'; ?>
のようにctpファイル内で変数をしてみましたが、レイアウトには適用されませんでした。
もう少し調査してみます。
0669nobodyさん
2010/09/24(金) 16:20:29ID:???ありがとうございます。やり方がわかりました!
シリアライズされた元のデータがあるので、
それを扱う例があれば嬉しいですけど、ネットで探しても見つからない
って時は作るしかないですよね。。わがままですよね
0670nobodyさん
2010/09/24(金) 16:33:01ID:???てか、いきなりCakePHP(フレームワーク)からはじめたの?
普通は、素のPHPのプログラミングを勉強していって
君の言う改ページ処理やファイルに書き込む処理など
基本的なコードを書いて勉強していくと思うんだけど。
0671665
2010/09/24(金) 16:55:01ID:???最近使っていなかったから1.2の感覚で書いてしまいました・・・。
前に作ったの移行してみようかな。
>>668
すみませんでした。
http://book.cakephp.org/ja/view/1566/View-and-Helpers
このページを見る限りでは、
<?php $this->set('title_for_layout', "ほげほげ"); ?>
だと思います。
0672662
2010/09/24(金) 17:18:44ID:???コントローラから
<?php $this->set('title_for_layout', "ほげほげ"); ?>
は当然効くんですが、Viewからは効いていないですね。
コアのコードを追ってみるか・・・。
0673nobodyさん
2010/09/24(金) 17:25:48ID:???Modelでpaginate()とpaginateCount()を実装する。
他はsave()やfind()を透過的につかうかによって変わるけど、
内部データへのアクセス自体を独自にしてしまったほうが単純に楽だと思う。
0674665
2010/09/24(金) 17:44:00ID:???あれ?さっき1.3ダウンロードしてきて適当にコアファイル差し替えて試したら
うまくいったっぽいので大丈夫かと思いましたが、だめでしたか。
"title_for_layout タイトル" でぐぐって、一番上にくるので試してみても
うまくいったので、そっちの方法がよさそうですね。
0675nobodyさん
2010/09/24(金) 18:49:30ID:???App::importで読み込んでクラスをnewするのでしょうか?
0678nobodyさん
2010/09/25(土) 00:54:21ID:wsz3lHFZ基本的なことが抜けてるのはあってますが(笑)
いきなりでは無いですよ、もっと勉強します
>>673
>Modelでpaginate()とpaginateCount()を実装する。
本当はこれやりたかったんですが、簡単なほうを選んで
自前ページャーで作ってしまいました、次回はこれ使います!
教えて頂きありがとうございました。
0679nobodyさん
2010/09/25(土) 05:06:39ID:???モデル内でそのようにsaveすると
$this->save( array( 'id' => $data, 'name' => $name ) );
以下のエラーが出ます。
SQL Error: 1054: Unknown column 'Array' in 'field list' [CORE/cake/libs/model/datasources/dbo_source.php, line 673]
Query: UPDATE `tablename` SET `id` = Array, `name` = 'xxxx'
1.3.2ですが、何か最近変わったりしたんでしょうか。
0681nobodyさん
2010/09/25(土) 05:10:51ID:???解決するのはそんなに難しくないような気がする
0682nobodyさん
2010/09/25(土) 06:24:18ID:???あるモデルにユニークを保証したい文字列user_idがあり
var $validate = array(
'user_id' => array(
'rule' => 'isUnique',
'message' => 'must be unique'
)
);
と指定。
モデルにレコードの新規作成関数を以下のように用意しました。
// 初期データ
$userInfo = array(
"UserInfo" => array(
"id" => null,
"user_id" => $user_id,
"level" => 1,
...
)
);
$this->create();
if ( $this->save() ){
var_dump('save ok');
return;
}
var_dump('validate ng');
つづく
0683nobodyさん
2010/09/25(土) 06:25:31ID:???何故か既存のデータが上記の初期値で更新されてしまいます。
これは正しい動作なんでしょうか。
また、validateの条件をnumeric等に変えてみるとこの現象は起きません。
わけわからんので誰か謎を解いてください。
0684nobodyさん
2010/09/25(土) 07:18:00ID:???0685nobodyさん
2010/09/25(土) 14:24:39ID:???0686nobodyさん
2010/09/25(土) 16:02:35ID:???CakeのSQLダンプではCOUNTしか発行されてないようですが、
MySQLのログを見ると普通にUPDATEされちゃってます。
つーかSQLダンプってあてにならないのか…。
ちなみに自分でif ( $this->validates($userInfo)
とかやって駄目な時はsaveしないようにしても更新されちゃいます。
0687nobodyさん
2010/09/26(日) 09:19:40ID:???0688nobodyさん
2010/09/26(日) 13:07:37ID:???0689nobodyさん
2010/09/26(日) 19:05:33ID:???0690nobodyさん
2010/09/27(月) 01:59:38ID:???その理屈は結構前の話しだな。
今はフレームワークも便利な機能てんこもりで、
独りで作るのにも利用しないと大幅に差が出る。
0691nobodyさん
2010/09/27(月) 09:51:39ID:???横からだけど
CakePHPのダンプに出てないということは、CakePHPのsave()以外が更新している可能性を否定できないし
validatesで更新されているとなればなおさらかも
>>682 のコードの周辺とか中略されているところとか独自バリデーションがあったらそれとか、$user_idとか$this->idの値とかはどうなってるの?
あと、既存のデータって、どのデータが更新されるの?
0692nobodyさん
2010/09/27(月) 13:08:45ID:???亀レスだけど、IDが固定なら
saveField()
http://book.cakephp.org/ja/view/75/Saving-Your-Data
が使えない?
0693nobodyさん
2010/09/27(月) 13:47:08ID:???Cake以外にDBアクセスしてる心当たりはありません。
独自バリデーションはないです。記述したisUniqueのみです。
$user_idはテーブル内でユニークな文字列(ユニークな数値をmd5したもの)
$this->idはnullです。(書き忘れたけど、自分でnullを代入して試した)
周辺のコードとはどの辺まででしょう。モデルは書いた分しかコードないです。
>>682で省略したのは$userInfoの全フィールドを書いてないことぐらいです。
>あと、既存のデータって、どのデータが更新されるの?
同じuser_idを持つレコードが、上記コードの$userInfoの内容で更新されます。つまり初期化。
あと書き間違いがあって、$this->save()は$this->save( $userInfo ) です。
もう一度問題点をまとめておくと
user_idフィールドにisUniqueを指定して、同じuser_idを持つデータの更新/挿入を阻止したいが、更新の阻止ができない。
ということです。
それがCakeの正しい動作なのかが知りたい。ネットや本によるとどうも違うようなので。
CakeのSQLダンプに出ないのも謎ですがそれはそういう不完全なものなのかな。
0694nobodyさん
2010/09/27(月) 14:18:06ID:???モデル名はUserなの?
カラム名をuser_idじゃなくてkeyとかhashにしたらダメかな?
user_idだとUserモデルのidって解釈されるかも。
0695nobodyさん
2010/09/27(月) 14:28:53ID:???モデル名はUserじゃないです。UserInfoとかそんな感じです。
カラム名も実際はuser_idではなくapplication_user_idです。長いので質問書く時に短くしてました。
でも一応名前変えても試してみます。ありがとう。
というかisUniqueで阻止できるのはやはり新規追加のみで、更新はされちゃうのかな?
と思ったけどやはりidをnullにしてるのに勝手にuser_idをキーに更新されるのは解せない。
0696nobodyさん
2010/09/27(月) 14:31:03ID:???別ページにリダイレクトしてない?
0697nobodyさん
2010/09/27(月) 14:32:46ID:???0698nobodyさん
2010/09/27(月) 14:35:39ID:???0699nobodyさん
2010/09/27(月) 20:04:25ID:???>if ( $this->save() ){
ここでなにをsaveしてるんだ?
0700nobodyさん
2010/09/27(月) 22:30:00ID:???これってHTMLに出力すると起動するんですか?
foreachを再帰する為の関数を作るんでしょうか?
それとも、Cakeに出力する為のヘルパーがあるのでしょうか?
0702nobodyさん
2010/09/28(火) 13:55:58ID:???モデルとして利用する方法をどこかで見たのですが、
ググっても探せません。ご存じないでしょうか?
0703nobodyさん
2010/09/28(火) 14:37:54ID:???どうやってぐぐったのか?
http://www.google.com/search?sourceid=chrome&ie=UTF-8&q=cakephp+%E3%83%A2%E3%83%87%E3%83%AB+CSV
0705nobodyさん
2010/09/28(火) 17:40:51ID:???それはある
詰め込み世代の新人って指示待ちか出来もしない癖に勝手な事やって迷惑掛けてくれる奴かの両極端だった
ここ数年の奴らは、意外と使える
我々にしてもそうだったけど目で盗んで憶えるというか自分の頭で考えて言われなくても的確に動けるのが増えた気がする
日本人らしさが戻って来た感じ
0706nobodyさん
2010/09/28(火) 17:49:54ID:???0708nobodyさん
2010/09/28(火) 18:15:45ID:???0709nobodyさん
2010/09/28(火) 19:08:21ID:???なんで指示待ちしかできないんだろうな?
システム開発で言えば、エラー出てもログ見ないで「出来ません!」
って言ってくる奴大杉。
しかも「調べた」と言いつつ「どこを調べた」のか言わない。
そんなのエスパーじゃないからわかるわけ無いのにな。
自分の頭で考えないから、合理性のない行動しかできないんだよな。
0710nobodyさん
2010/09/28(火) 19:22:36ID:???0714nobodyさん
2010/09/28(火) 20:37:25ID:???0715nobodyさん
2010/09/28(火) 20:49:55ID:???0716nobodyさん
2010/09/28(火) 22:11:51ID:???「Userが購入したOrder回数を調べる」って時に使えるかと思ったのですが、
hasManyで結合させたら、paginateのソートって出来ませんよね。
hasOneやbelongsToの時に使うのかも知れませんが、
使い道があまり思い浮かばないな
■ このスレッドは過去ログ倉庫に格納されています