トップページphp
1001コメント304KB

【PHP】フレームワーク CakePHP 9ホール目【v1.3】

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2010/07/23(金) 09:13:26ID:v3m09M9u
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
0573nobodyさん2010/09/14(火) 17:36:34ID:???
>>572
ビューもUTF8にしてafterFilterで文字コード変換じゃダメなの?
find時に文字コード変換はafterFindでできそうな気がするけど、
DBもUTF-8で作ってるのにビューだけShiftJISにこだわる理由はあるんだろうか
0574nobodyさん2010/09/14(火) 18:12:47ID:sGtN+/un
>>573
携帯用のビューでして、ShiftJISで表示させたいんです。
0575nobodyさん2010/09/14(火) 18:15:45ID:???
>>574
まずsageようじゃないか
そして>>573にあるように、UTF-8でつくろう
方法はキミが分かってる通りだ
05765732010/09/14(火) 18:22:34ID:???
質問時はsage推奨って>>1に書いてますね。すみませんでした。

あと、UTF-8で作る方法は知っていますが、>>574で書いたとおり、
携帯用のビューはShiftJISなのでそうしたいんです。
現代の携帯端末はほとんどUTF-8に対応しているとはいえ、、
今までそれで表示していて問題がなかったので。

でも、それしか方法がないと言うなら、一旦findで配列を取得して
foreachでmb_convert_encodingしてSJISに変換し、ビューに渡す方法にします。
05775722010/09/14(火) 18:23:30ID:???
番号間違えました・・。>>576>>572です。
0578nobodyさん2010/09/14(火) 18:25:53ID:???
またひとりアドバイスに従わない強者がいたか
0579nobodyさん2010/09/14(火) 18:26:27ID:???
>>576
どうしても、ビューはShiftJISにしたいっていうなら、
mb_convert_encodingの処理はafterFind()の中に書けばいいと思うよ。
0580nobodyさん2010/09/14(火) 19:09:36ID:???
viewで変換できないん?
0581nobodyさん2010/09/14(火) 19:30:32ID:???
utf8の方が女にもてる
0582nobodyさん2010/09/14(火) 19:56:50ID:???
携帯サイトってShift_JISで作るんじゃないの?
軽くググったら、そういう解説ばかりだけど。
0583nobodyさん2010/09/14(火) 20:28:55ID:???
どんなにググってもviewだけsjisなんて解説出てきません ><
0584nobodyさん2010/09/14(火) 20:29:18ID:???
utf8で作ってもフォームから送られてくるのはshift_jisだったりするよね?<au
softbankはその逆だっけ?
05855722010/09/14(火) 20:37:37ID:???
やっと指摘されてる意味がわかりました・・。
ViewもUTF-8で作成して、出力時はafterFilterでShift-JISにし、
View内のmetaのContent-TypeをShift_JISにすれば、何も問題ないんですね。

お騒がせしました。
0586nobodyさん2010/09/14(火) 20:40:04ID:???
いや、ctpはUTF8で作って、出力をSJISにすれば良いじゃない。そっちのが、あとあと楽だと思う。
0587nobodyさん2010/09/14(火) 20:51:33ID:???
変換テーブルがアレだから実際UTF-8でやると特定の文字でハマるかも。
絵文字変換のついでに対策すればいいんだけど。
0588nobodyさん2010/09/15(水) 10:54:40ID:???
CakePHPってカスですね
初心者には敷居が高くて難しいんですよ、これ
もちっと簡単にしてほしかったですね
0589nobodyさん2010/09/15(水) 11:02:19ID:???
カスなのは初心者なんだよ。
カスから脱出するために、皆頑張っているのだ。
0590nobodyさん2010/09/15(水) 11:37:03ID:???
きっとPHP自体が初心者なんだろ
PHPが初心者だったらどのフレームワーク使ったって一緒だ
0591nobodyさん2010/09/15(水) 11:46:50ID:???
一応、C,C++,C#,Javaできますが
0592nobodyさん2010/09/15(水) 12:06:13ID:???
>>591
それだけの経験があっても理解ができないのが、ある意味すごい
無 能 だ な !
0593nobodyさん2010/09/15(水) 12:12:37ID:???
hello worldができるってだけだろ
0594nobodyさん2010/09/15(水) 12:31:33ID:???
人をおちょくるのもいい加減にしてください

if,swtich,case,break,do,while使えますよ!
0595nobodyさん2010/09/15(水) 12:32:29ID:???
IDでねーのだるいな。PHPすら理解してない奴は勘弁だ
0596nobodyさん2010/09/15(水) 12:34:15ID:???
匿名掲示板でIDの意味はないと思うが・・・
0597nobodyさん2010/09/15(水) 14:56:01ID:???
>>596
ネットワークを使い分けるとかしない一般人であれば、
少なくとも、俺とお前が別人だって示せる
0598nobodyさん2010/09/15(水) 18:59:43ID:???
routes.phpに
Router::connect('/', array('controller' => 'top', 'action' => 'index', 'home'));
とすれば、初期画面を指定できますが、
同じコントローラーで別のアクションを実行するには
http://hoge.com/top/add
のようにしなくてはいけません。これを
http://hoge.com/add
とする方法は無いのでしょうか?
0599nobodyさん2010/09/15(水) 19:42:02ID:???
Router::connect('/add', array('controller' => 'top', 'action' => 'add'));
06005982010/09/15(水) 19:54:47ID:???
希望通りできました。ありがとうございました。
0601nobodyさん2010/09/15(水) 20:10:25ID:???
'home' つけっぱだし、もっかいドキュメント読み直したほうがいいよ
0602nobodyさん2010/09/16(木) 01:00:40ID:???
携帯でアクセスすると、mobile_がついたメソッドとビューを読み込みたいです。
routes.phpの設定で以下のようにする方法を良く目にするのですが、
Router::connect(‘/m/:controller/:action’, array(‘prefix’ => ‘mobile’));
この方法ではURLを変更する事になります。

同一URLで振り分けたいのですが、
上記以外でメソッドにprefixを付ける方法はないでしょうか?
0603nobodyさん2010/09/16(木) 01:42:28ID:???
>>602
君、>>598でしょ?
質問する前に少しは自分で考えたらどうだい?
0604nobodyさん2010/09/16(木) 01:45:59ID:???
>>602
Webサーバ側でやればいい。
0605nobodyさん2010/09/16(木) 02:54:46ID:???
>>603
同じroutesの質問してますが、違います。
それに半日考えてググってソースも見てどうしようもなく質問しました。

>>604
それだとCakeを使う意味がない気がします。
0606nobodyさん2010/09/16(木) 06:55:26ID:???
>>602
最近CakePHP触ってないからうろ覚えなんだけど、
controller.phpにbeforeFilterを定義して、携帯からのアクセスか
PCからのアクセスかを判別する処理をそこに書く。
その中でコントローラを割り振るようにできるんじゃないかな?
確かコントローラ名が$thisに入ってたよね
0607nobodyさん2010/09/16(木) 07:11:12ID:???
>>605
Ktai Library 使いましょう
0608nobodyさん2010/09/16(木) 09:33:19ID:???
Model内でセッションの受け渡しをするのはまずいのでしょうか?

Controller内で
    $this -> Amazon -> setSession($this -> Session);  

と記述し、

Model内で、
public function setSession($session){
$this -> Session = $session;
}

と記述。この後、モデル内で、

$this->Session->write('page_list',$page_list); 

などとコントローラで書くような記述をしています。

しかし、firefoxでは問題ないけど、IEやChromeでセッションの受け渡しが
上手く行かない問題が出てきて、もしかして、このやり方をしているかが原因なのかなと
思いました。

普通に、モデル内で使いたいなら、$_SESSIONで書いたほうがいいのかなあと。
0609nobodyさん2010/09/16(木) 14:56:55ID:???
>>602
beforFilterあたりでIPかUAを見てprefixつけられなかったっけ
と思ったら>>606が同じようなこと書いていたな

>>603
基本的なroutesもよくわかってなかったやつが一日でprefixの質問するレベルに成長するとは思えないぞw

>>607
作者さん?
機能強化よりシンプルでわかりやすい仕様にしてくれ
0610nobodyさん2010/09/16(木) 16:04:35ID:???
>>607
MASA-Pさん、上の方で本がバカにされてましたよ
0611nobodyさん2010/09/16(木) 17:32:15ID:???
>>607
文字コードの扱いが困る時があります。
もう少し柔軟にして下さい。
0612nobodyさん2010/09/16(木) 19:56:27ID:???
>>605
すべてCakeでやる必要なんてないだろ?
0613nobodyさん2010/09/16(木) 21:04:42ID:???
かといってバーチャルホストにするほどか?
0614nobodyさん2010/09/16(木) 21:18:40ID:???
バーチャルホストとかじゃなくて、/hogeにリクエストが来たらapacheでIP見て、PCなら/hogeのまま
ケータイなら/m/hogeにrewriteすりゃいいって話じゃないの?
0615nobodyさん2010/09/16(木) 21:40:20ID:???
beforeFilter()やらで判別してmobile_アクション() 呼べばいいんじゃない?
0616nobodyさん2010/09/16(木) 22:07:43ID:???
MASA-Pさん、ドメイン分けずに本の内容通り進める方法教えてください
0617nobodyさん2010/09/16(木) 23:18:48ID:???
beforeFilterでmobile_アクション呼ぶ方法を教えて下さい!(><)
0618nobodyさん2010/09/17(金) 00:51:47ID:???
>>613
むしろ、バーチャルホストでどう実装するのか聞きたい。

>>616
本の通りに書いていれば、ドメイン分けずにすむだろ。
0619nobodyさん2010/09/17(金) 10:08:15ID:???
MASA-Pさん、電子書籍にしてください
0620nobodyさん2010/09/17(金) 12:39:29ID:???
誰が誰やら
0621nobodyさん2010/09/17(金) 19:08:58ID:???
CakePHP 携帯ライブラリと位置情報ライブラリを使った簡易GPS検索プラグイン「GeoSimple Plugin」 : エクスギア Blog
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:???
CakePHP1.3のAuthを使った認証システムを作っています。
エラーメッセージを出そうと、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:???
>>625
自分で言っているとおり、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
>>628
ありがとうございます。
これで先に進めます。
0630nobodyさん2010/09/22(水) 14:23:14ID:???
cakephp以前の問題だな・・・なんだこのスレ
0631nobodyさん2010/09/22(水) 18:54:44ID:???
>>627
モデル名 → テーブル名

と考えるとわかりやすいよ。
ただし、モデルの命名規則とテーブルの規則は違うから注意。
例)モデルでUserならテーブルはusersを作成する
0632nobodyさん2010/09/22(水) 19:50:42ID:???
>>627がそういうことを聞いているようには見えない。
別に煽るわけじゃないんだが……
0633nobodyさん2010/09/22(水) 20:19:43ID:???
テーブルに命名規則があるからDB名にも命名規則があるのかと思っただけじゃない?
0634nobodyさん2010/09/22(水) 23:10:29ID:???
もう解決してんだろアホのくせに書き込むな
0635nobodyさん2010/09/23(木) 00:14:42ID:???
>>627の疑問は解決してても、俺らの疑問はまだ解決してない
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:???
PHP歴3年で、開発してるがCake触ったことない俺がきたよ。
公式のサンプルやり始めた俺には参考になるよ。
命名規則で結構引っかかってたところ。

サンプルだとpostっていうモデル作ったら
DBはpostsにしろって言われてなんでsつけるのか意味不明だった。
コントローラーにもよくわからない形(posts_controller.php)
とか名前つけてるから?が多かった。

自動解釈してくれるからこういう形式にしろよって意味だろうけど
書籍なしでいきなり始めるとわけわかめ。
0640nobodyさん2010/09/23(木) 15:01:57ID:???
あのチュートリアルはニコニコとかYoutubeとかUstreamでyandodさんが解説してくれてるぞ、たしか。
0641nobodyさん2010/09/23(木) 15:15:12ID:???
英語の複数形だろ。。。>s
0642nobodyさん2010/09/23(木) 15:23:18ID:???
>>641
そんなことはわかってるが、なぜ複数形にする必要があるのか?
という点が意味不明だったわけだよ。
0643nobodyさん2010/09/23(木) 15:29:51ID:???
>>641
お前はもう黙ってろよ一生
0644nobodyさん2010/09/23(木) 15:32:43ID:???
レコード→post
テーブル→posts

レコードがたくさん集まってテーブルになるんだ。
これはphpやMVCとは関係ないDBの基本だからな、覚えとけよ。
0645nobodyさん2010/09/23(木) 15:56:34ID:???
>>640
ありがとう、早速動画見つけたので見てるが
すごいわかりやすくて助かる。

Cから入った人間だから、C++のときもそうだったけど
オブジェクト指向とか、MVCモデルについては
なかなかとっつきにくかったけど、これはありがたい。
0646nobodyさん2010/09/23(木) 16:05:37ID:???
bbsのためにbbssコントローラ作ったりするんだろうな
0647nobodyさん2010/09/23(木) 17:39:58ID:???
鯉を管理するためにはcarpテーブルが必要
単数形と複数形が同じなので注意!
0648nobodyさん2010/09/23(木) 20:19:39ID:???
ま、俺はs付けないけどな。
0649nobodyさん2010/09/24(金) 02:17:58ID:???
あの複数形と単数形のルール紛らわしいよな。
0650nobodyさん2010/09/24(金) 03:14:33ID:???
ところでさぁ。
新規の開発にしか使えないFWってどんなメリットがあるのよ?
既存の改修とかに使えないんだろ?
チンカスレベルの屑FWとしか言えんだろ?
0651nobodyさん2010/09/24(金) 03:55:59ID:???
作業高速化のためにFW使ってるのにわざわざそのFWに合わせて作り直すの?本末転倒だろ
0652nobodyさん2010/09/24(金) 08:33:43ID:???
ぶっちゃけ、大して作業が高速化する分けじゃないけどな。
むしろ命名規則にのっとたり、書き方も厳密にしなきゃいけないし、
よけない手間が増える。

だが、優柔不断な俺にはそれが良い。
0653nobodyさん2010/09/24(金) 08:42:53ID:???
そもそも既存のシステムのためにFWを導入するわけではないと思うよ?

PHPみたいに甘い言語だと、プログラマーによって
かなりオレオレ仕様だったり、ソースがわかりずらかったりするから
フレームワーク使うと、統一化されて跡から保守しやすいっていうメリットが生まれる。

また、ページごとにやってたようなエラー処理だとか
フォームの入力チェックみたいな処理も自動化出来てわかりやすい。

どちらかというと3人程度〜の新規開発向けだと思うよ。
個人でやってぱぱっと作るならFW使わなくても別に困らないしw
0654nobodyさん2010/09/24(金) 09:42:52ID:???
命名規則なりクラス構成規約なりを開発メンバーに強制することにより、
多少の生産性は犠牲にしつつも保守性を上げるための仕組み、
という面は確実にある気がする。
慣れてくればそのオーバーヘッドもだんだん減ってくる(はず)だし、
そもそもFWって元来そういうもんだよね。

CakePHPの場合は強制される規約が多すぎて、
たとえばタグライブラリ的な使い方をしようと思ったときに
ちょっと難しい部分があるのも事実だけど。
0655nobodyさん2010/09/24(金) 09:50:20ID:???
>>653-654
でも、それらって中小以上の、制作会社なら
独自の規約やルールが決まっていると思うんだよな。
フォームヘルパーのようなライブラリも作ってるだろ。

SOHOなら別にオレオレでも構わないと思うし、規模もたかが知れてる。
かといって、規模が大きめの案件ならFWは速度的なネックがある。

まぁ、俺はオレオレの仕様変更が多くて定まらないから、
Cake使ってるんだけどな。規模が小さい案件ばかりだし。。
0656nobodyさん2010/09/24(金) 10:26:20ID:???
http://www.amazon.co.jp/dp/4798027456/
CakePHP辞典 Pocket詳解 [単行本]
0657nobodyさん2010/09/24(金) 11:22:13ID:9bxZAnFY
DB使ってない状態で
paginatorのようにページ送りしたいんだけど、
いい方法ってありますか??
0658nobodyさん2010/09/24(金) 11:22:15ID:???
レコード1個のフィールド1個だけちょこっと更新したいんだけど
普通にfindしてからsaveしないと駄目?
saveByIdとか簡単な関数ないの?
0659nobodyさん2010/09/24(金) 11:33:35ID:???
>>658

$dataにidがあればupdateになるから

array(
'id'=>1,
'field1'=>'hoge',
);

これをsaveすればid1のfield1のみアップデートされる
0660nobodyさん2010/09/24(金) 11:34:10ID:???
>>658
良くわからない事言ってるが、
保存されている情報を取得するならfind(select)は必須だろ?
saveAllにしてパラメータ指定するのはダメなのか?
0661nobodyさん2010/09/24(金) 11:35:49ID:???
ああ、更新か。読み違えてた。すまん。
0662nobodyさん2010/09/24(金) 11:37:22ID:KWM9yVDw
ctpファイルの中に、

<?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:???
>>657
Webサービスとかなんらかの読み込み元のデータはあるんでしょ。

find、_findCount、_findAll あたりをオーバーライドしたモデルを作るか、
データソースドライバを作ればPaginator関係はそのまま使えるので便利。
0664nobodyさん2010/09/24(金) 12:16:54ID:???
>>659
すみません質問間違ってました、id以外をキーにしてそれできませんかね。

できないなら、やはりfindしてidを取ってこないといけないですよね。
0665nobodyさん2010/09/24(金) 12:39:38ID:???
>>662
Controllerクラスだけでなく、Viewクラスにも pageTitle というプロパティがあるので、
ctpファイルのどこかで
<?php $this->pageTitle = "ほげほげ"; ?>
とすればOKだと思う。
06666592010/09/24(金) 13:31:47ID:???
>>664
updateAll使えばできたんじゃないかな
0667nobodyさん2010/09/24(金) 14:39:38ID:???
>>665
答えに近いこと書いてあるけど、質問者の使ってるの1.3だからさ
06686622010/09/24(金) 15:21:06ID:???
あー、すみません、バージョンは1.3です。
このあたり、1.3で仕様が変更になっているんですよね。
'inline' => false の指定方法とか。

<?php $title_for_layout = 'ほげほげ'; ?>

のようにctpファイル内で変数をしてみましたが、レイアウトには適用されませんでした。
もう少し調査してみます。
0669nobodyさん2010/09/24(金) 16:20:29ID:???
>>663
ありがとうございます。やり方がわかりました!

シリアライズされた元のデータがあるので、
それを扱う例があれば嬉しいですけど、ネットで探しても見つからない
って時は作るしかないですよね。。わがままですよね
0670nobodyさん2010/09/24(金) 16:33:01ID:???
>>669
てか、いきなりCakePHP(フレームワーク)からはじめたの?
普通は、素のPHPのプログラミングを勉強していって
君の言う改ページ処理やファイルに書き込む処理など
基本的なコードを書いて勉強していくと思うんだけど。
06716652010/09/24(金) 16:55:01ID:???
>>667
最近使っていなかったから1.2の感覚で書いてしまいました・・・。
前に作ったの移行してみようかな。

>>668
すみませんでした。
http://book.cakephp.org/ja/view/1566/View-and-Helpers
このページを見る限りでは、
<?php $this->set('title_for_layout', "ほげほげ"); ?>
だと思います。
06726622010/09/24(金) 17:18:44ID:???
>>671
コントローラから

<?php $this->set('title_for_layout', "ほげほげ"); ?>

は当然効くんですが、Viewからは効いていないですね。
コアのコードを追ってみるか・・・。
■ このスレッドは過去ログ倉庫に格納されています