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

【PHP】フレームワーク CakePHP 6ホール目【v1.2】

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2009/03/09(月) 10:55:37ID:3PTy4GqZ
CakePHPは、Ruby on Railsの概念の多くを取り入れた、Rails流の高速開発とPHPの機動性を兼ね備えたフレームワークです。

※sage推奨
※日本語マニュアルURLを貼るときは、http://book.cakephp.org/ja/view/1/ のようにしましょう(末尾のエンコードされたタイトル部分は不要)

■本家
http://www.cakephp.org/
APIドキュメント
http://api.cakephp.org/
the Bakery
http://bakery.cakephp.org/
CheatSheet (PDF)
http://cakephp.org/files/Resources/CakePHP-1.2-Cheatsheet.pdf

■日本語公式
http://cakephp.jp/
フォーラム
http://cakephp.jp/modules/newbb/
cookbook(マニュアル)
http://book.cakephp.org/ja
0449nobodyさん2009/06/03(水) 15:50:52ID:???
>>448
なんかまずい?
0450nobodyさん2009/06/03(水) 19:11:02ID:???
>>449
…
0451nobodyさん2009/06/04(木) 00:33:50ID:???
cakeの時代になると、Smartyの扱いってどうなるの?
0452nobodyさん2009/06/04(木) 09:04:20ID:???
ぞんざいになるの
0453nobodyさん2009/06/04(木) 09:07:40ID:???
ひややか
 ↓
なまあたたかい
 ↓
ぞんざい
0454nobodyさん2009/06/04(木) 19:04:13ID:???
cakeのチェックボックスを下にずらーっと並べないで
きれいに並べたいんだけどなんかないのですくわ
0455nobodyさん2009/06/04(木) 20:16:55ID:???
>>454
http://cakephp.jp/modules/newbb/viewtopic.php?topic_id=1874&forum=9
0456nobodyさん2009/06/04(木) 23:58:54ID:???
>>454
cssでdivの幅指定 & float:left
0457nobodyさん2009/06/05(金) 12:46:45ID:???
>>455-456
ありがとう出来たよ。
幅を%指定にすることによって1行にいくつ並べるかも出来た。
0458nobodyさん2009/06/05(金) 16:59:50ID:???
MVC の初歩的な質問で申し訳ないのですが、
条件付の paginate したいときはコントローラー内で書くしかないのでしょうか。
何となく、SQL の発行とはかモデル内でやった方が良いかなぁと思うのですが、、
0459nobodyさん2009/06/05(金) 17:46:29ID:???
>>458
前に似たような質問と回答があったから、
そちらを見てみては。
04604582009/06/05(金) 19:17:20ID:???
>>459
ありがとうございます。
>>198-208
コンポーネントでやってみることにします。
私は何でもコントローラーに詰め込んでしまう傾向があるので、
MVC の基本から学んでみることにします。
0461nobodyさん2009/06/05(金) 20:41:11ID:???
h()とかって使ってるバカいるの?
0462nobodyさん2009/06/05(金) 21:01:51ID:???
>>461
まずいの?
昔はENT_QUOTEついてなかったりしたけど。
0463nobodyさん2009/06/05(金) 21:16:33ID:???
>>462
いまだってついてないだろ?
それとも最近はついたの?
0464nobodyさん2009/06/05(金) 21:29:47ID:???
>>461
え?何が悪いの?
0465nobodyさん2009/06/05(金) 21:32:48ID:???
>>464
シングルクオートをエスケープしないだろ
0466nobodyさん2009/06/05(金) 21:44:01ID:???
>>463
http://www.infinity-blue.jp/archives/58
とっくの昔についてるわ
0467nobodyさん2009/06/06(土) 00:53:52ID:???
>>465
?そうだっけ?
0468nobodyさん2009/06/07(日) 23:06:58ID:IWMv9X2i
いやーアソシエーション便利やわーって、ふと疑問に思ったのですが、
回帰的にHABTMってできるんでしょうか?
例えばpostsなんてテーブルがあって、
posts_postsなんて結合用のテーブルを用意して、
一つのテーブルを回帰的に多対多にするとか。
無理?それとも不幸になる?
0469nobodyさん2009/06/08(月) 00:56:23ID:???
作り込み始めたら、すっげー遅くなってきた。
リンク押すとすぐに表示される場合もあれば、10秒くらいかかることもある。
キャッシュは使ってるんですが、なにかもっと速くする方法ないでしょうかね?
0470nobodyさん2009/06/08(月) 01:10:18ID:???
APC、クエリキャッシュとアソシエーションを減らせばおk。
0471nobodyさん2009/06/08(月) 13:14:53ID:???
>>468
ttp://www.tonttu.net/tec/cakePHP/cakephpHABTMwith.html
これじゃね?試してないが
0472nobodyさん2009/06/08(月) 15:41:57ID:???
>>469
なんかネックになってるSQLがあって、10秒くらいかかってるんじゃね?
キャッシュが効いてる時はすぐに表示されると言うだけで
0473nobodyさん2009/06/08(月) 21:13:40ID:???
>>469
cakephp1.1?
1.1は遅いよ。1.2にすべし。
0474nobodyさん2009/06/09(火) 19:13:55ID:???
複数のコントローラ内で使用する共通の処理をさせたい時はビヘイビアで設定するのが正しいでしょうか?
ビヘイビアで設定しても呼び出し方が分からず困ってます。
TreeBehaviorとか決まった名前のビヘイビアしか作れないのでしょうか?
0475nobodyさん2009/06/09(火) 20:07:13ID:???
本読んだけど、まったくわからない。
0476nobodyさん2009/06/09(火) 21:20:39ID:???
>>474
複数のモデル内 => ビヘイビア
複数のコントローラ => コンポーネント

です。
名前は hoge ビヘイビアでも abesouri ビヘイビアでも何でも作れますよ。

あなたはコントローラー内でのモデルの使い方がいまいちわかっていないと思います。
0477nobodyさん2009/06/10(水) 09:41:54ID:???
>>474
>>476のようにcomponentで実装するのが良いでしょう
より簡単なやり方としては。
app_controller.phpで共通する処理を書いてあげると、すべてのcontrollerで利用できます。
※ただし、URLでアクセスされないように、function _hoge() のように _ をつけてね
0478nobodyさん2009/06/10(水) 13:01:47ID:???
Ajaxヘルパーのオートコンプリートを試しているのですが、
テキストフィールドに文字列を入力してエンターを押しても候補が表示されず、
1文字削除すると、候補が表示されます。

どうすれば直るのでしょうか?
04794782009/06/10(水) 13:28:23ID:???
どうやらfirefoxの場合に起こるようです。
何か対処法はないでしょうか・・・
0480nobodyさん2009/06/10(水) 14:28:19ID:???
>>476-477さん
レスありがとうございます。
呼び出し方として
モデル->ビヘイビア
ではなく
コントローラ->{モデル,ビヘイビア}
ということでしょうか?
おんなじ処理(たとえばPV集計など)を書くのにコンポーネントだとMVC的に間違っている気がするのですが
0481nobodyさん2009/06/10(水) 14:29:41ID:???
レイアウトの表示文字コードを変えるのはどうすればいいでしょうか?
core.php内で設定する以外でお願いします。
0482nobodyさん2009/06/10(水) 15:22:58ID:???
>>481
つ beforeRender()
04834822009/06/10(水) 15:39:30ID:???
間違えた afterRender() だた
0484nobodyさん2009/06/10(水) 15:44:47ID:???
>>480
まだいまいち状況がつかめていないが。

共通の処理というのが特定のモデルを使うようなものであれば、
そのモデルを各コントローラーから呼んであげればよい

モデルを使わないのであれば、各コントローラーで処理する

各コントローラーの処理を共通化するのは>>476-477
0485nobodyさん2009/06/10(水) 16:28:13ID:???
みんなaa()って使ってる?
どういう場面で使えばいいのかわかんなくて、一度も使ってないんだけど
0486nobodyさん2009/06/10(水) 20:31:17ID:???
まぁ、俺も使い所というか使う意義は分んないけど。
必要無いものを無理に使う必要はないと思う。
0487nobodyさん2009/06/10(水) 21:59:36ID:???
俺は e() も使ってない。
0488nobodyさん2009/06/10(水) 22:43:22ID:???
なにこれ難しすぎる
わけわからん
全然スイーツじゃねぇし
0489nobodyさん2009/06/10(水) 23:06:08ID:???
ぐ・・、つ・釣りか・・
しかし、もう我慢できない!



スイーツな名前だけどスイーツには使いこなせませんっ!
異論は認める
0490nobodyさん2009/06/10(水) 23:07:35ID:???
意外とスイーツは簡単に使いこなしてたりして

マニュアル主義的なところあるし
0491nobodyさん2009/06/11(木) 01:11:50ID:???
>>486
手を出さないのが無難とはわかりつつも、わざわざグローバル関数として
用意されているのだから、便利な使い方があるに違いないと邪推してしまう

>>487
e()って何だよと思って調べたらecho()か
だいたいechoは()でくくらないで使う方が普通だと思うし
それを考えると、逆に使いづらくなってるような

俺が使うのはhと、デバッグ時にprくらい
気分でenvとか使っちゃうことがあるけど、
自分でも何で使ってるのかわからない
0492nobodyさん2009/06/11(木) 01:36:39ID:???
短くするの流行ってるのかね
いっそのこと逆にsystem.out.print()とか作れよw
0493nobodyさん2009/06/11(木) 02:49:59ID:???
「いっそのこと」の使い方が間違ってないかw
0494nobodyさん2009/06/11(木) 13:27:45ID:???
viewでコードが横に長くなるのが嫌なので、view内でe()とh()はよく使う。
e(h())ってなるのがいやなので、eh()ってのを作って使うとより便利だけどね。
0495nobodyさん2009/06/11(木) 13:50:01ID:???
CakePHPでmysql_real_escape_string は使いませんか?
0496nobodyさん2009/06/11(木) 14:49:44ID:???
>>495
基本的に勝手にエスケープされるのでほとんど使わない

そういやCakeだとLIKのワイルドカードの%と_がエスケープされないけど
これは自分でエスケープしなきゃいけないのかね
フレームワークでは意図的に入れたワイルドカードか不意にポストされた
ワイルドカードか判断できないってことなのかな
0497nobodyさん2009/06/11(木) 15:20:52ID:???
>>496
なるほど。ありがとうございます
0498nobodyさん2009/06/11(木) 15:42:25ID:???
e()なんて初めて知った。
0499nobodyさん2009/06/11(木) 16:23:52ID:???
>>498
一度使うと病みつきになるよ。俺のコードe()だらけだ。
0500nobodyさん2009/06/11(木) 16:55:12ID:???
>>496
判断できてるからエスケープされてないんじゃないの?
0501nobodyさん2009/06/11(木) 21:09:45ID:???
俺もe()派。でもカッコだらけでわけわからなくなることが時々。
0502nobodyさん2009/06/12(金) 00:59:17ID:???
>>500
んー、検索フォームで%をポストされると、そのままワイルドカードに
なっちゃうんだよね
hoge%fugaで検索すると%hoge%fuga%にマッチするのを探しちゃう
本当なら%hoge\%fuga%になってほしいところなんだけど
まあ、そこまで問題ではないのかもしれないけど、意図しない動作なので気になる
0503nobodyさん2009/06/12(金) 03:14:29ID:???
>>502
む、それ結構やばくね
0504nobodyさん2009/06/12(金) 06:26:58ID:???
>>502
どう書いてるの?
0505nobodyさん2009/06/12(金) 06:51:54ID:???
>>481-483
function afterLayout(){
  $view =& ClassRegistry::getObject('view');
  $view->output = mb_convert_encoding($view->output, 'SJIS');
}
らしい。ttp://blog.ecworks.jp/archives/506
0506nobodyさん2009/06/12(金) 09:56:19ID:???
>>502
%は、エスケープされないみたいだね。
シングルクオート、ダブルクオートはエスケープされてるから、仕様っぽいな
0507nobodyさん2009/06/12(金) 10:18:18ID:???
コンポーネントで%を付加&エスケープ
function wildcard($text ,$escape = true ,$left = true ,$right = true ,$wc = '%') {
  return (empty($left) ? '' : $wc) . (str_replace($wc ,'\' . $wc ,$text)) . (empty($right) ? '' : $wc);
}
0508nobodyさん2009/06/12(金) 12:57:59ID:???
これって、入力値に対してデータ検索するようなプログラムの場合

%ほげほげ

って入力されたら、インデックスがあたらなくてサーバを簡単にあぼんできるってこと?
0509nobodyさん2009/06/12(金) 13:44:17ID:???
>>>508
ユーザーからの入力値を受け付けて、なおかつワイルドカードで始まらない
like文っていうのはあまり想像できないけどな。
0510nobodyさん2009/06/12(金) 16:10:41ID:???
cakeのチューニングについて詳しく書かれてるサイトとか教えてちょんまげ
0511nobodyさん2009/06/12(金) 19:58:24ID:???
出力されたHTMLの先頭にゴミデータが表示されるんですが
どこで出ているのか、特定できなくて困っています。

コントローラの最後にechoを入れるとゴミデータの前、
VIEWの最初に文字を入れるとゴミデータの後に
表示されるので、コントローラとViewの間で表示されていそうなんですが
どこがあやしいかわかりますか?
これをしてみれば?みたいなことがあれば教えてください。
0512nobodyさん2009/06/12(金) 20:30:44ID:???
ごみデータって具体的になんですか
05135112009/06/12(金) 21:14:17ID:???
自己解決しました。

文字コードが誤って判定されていました。
http_outputを設定することで解決しました。

httpだと問題なく動作していたんですが、httpsにしたとたん
問題が発生しました。
SSLでは文字コードの判定が違うんでしょうか。

>>512
ゴミデータは?でした。
0514nobodyさん2009/06/14(日) 05:26:58ID:???
h(); はだいぶ短くなるから使うのわかるけどさ。
e(); は echo の略だから 1文字しか短くならない。

だから使わないんだよね。
0515nobodyさん2009/06/14(日) 17:49:59ID:???
apc入れようとしてるんだけど、さくらサーバでも導入する事できるの?
0516nobodyさん2009/06/15(月) 05:53:28ID:???
>>515
ttp://pc11.2ch.net/test/read.cgi/hosting/1227200815/
0517nobodyさん2009/06/15(月) 05:54:41ID:???
>>515
これも
ttp://pc11.2ch.net/test/read.cgi/hosting/1236253865/
0518nobodyさん2009/06/15(月) 20:19:10ID:???
http://stackoverflow.com/questions/994897/cakephpform-submiiting-problem-in-mozila

この質問って回答するの難しい?
0519nobodyさん2009/06/15(月) 21:55:12ID:???
日本語でおk
0520nobodyさん2009/06/16(火) 01:02:44ID:???
英語が雑なので分かりにくいのでは?
0521nobodyさん2009/06/16(火) 22:49:42ID:???
http://www.amazon.co.jp/dp/4839932468
CakePHP1.2ガイドブック
6/27発売 キタ━━━━━━(゚∀゚)━━━━━━ !!
0522nobodyさん2009/06/16(火) 22:58:46ID:???
もうCake本いらないだろ・・・symfonyのを出してくれよ;
0523nobodyさん2009/06/16(火) 23:00:25ID:???
そりゃ売れるものを出すだろ
0524nobodyさん2009/06/17(水) 12:27:40ID:???
Bakerの皆さんに質問です。

最近のCakePHPではPostgreSQLでまともに動きますか?

それと、バグは収束傾向でしょうか?

0525nobodyさん2009/06/17(水) 17:37:53ID:???
>>521
たか〜

CakePHPにこんな分厚いマニュアルなんているのかよ
0526nobodyさん2009/06/17(水) 17:52:25ID:???
確かに高いが、日本に何人いるかわからんBakerのための本と考えると
こんなもんなのかと思える
ただのPHPと違ってユーザー数は一桁違うだろうからね
0527nobodyさん2009/06/18(木) 12:52:15ID:???

Componentでsmartyをつかいたいのですが、
<?php
class Mail_sendComponent{

//メール内容生成------------------------
var $smarty;
var $tmp_path;
var $url;
function make_mailbody($tmp_path,$url){
App::import('Vendor','smarty/Smarty.class');
//合成
$this->smarty->assign("url",$url);
$out = $this->smarty->fetch ($tmp_path);

return $out;
}
}
?>
エラー内容
Fatal error: Call to a member function assign() on a non-object in /パス/mail_send.php on line 18


どしたらいいのでしょうか・・・・
0528nobodyさん2009/06/18(木) 12:58:09ID:???
どうしたら良いも何も…。
05295272009/06/18(木) 13:09:19ID:???
初心者の為、
そもそものコピペの流用なのですが、

vendor("smarty/Smarty.class");
↓
App::import('Vendor','smarty/Smarty.class');
に変えただけなのですが・・・・


$this->smarty =new Smarty();
とか、そういう方向でしょうか・・・?
0530カナディアンマン2009/06/18(木) 16:07:17ID:???
チェックボックスを作成しました。
出力されたHTMLで、 data[User][job] の後の括弧の中身が空欄なのですが、これは正常ですか?

チェックボックスにチェックをしてFormを送信しても値が取れないんです。

出力されたHTML
<input type="checkbox" name="data[User][job][]" value="1" id="UserJob1" /><label>ヒキ</label>
<input type="checkbox" name="data[User][job][]" value="2" id="UserJob2" /><label>ニート</label>
<input type="checkbox" name="data[User][job][]" value="3" id="UserJob3" /><label>フリーター</label>

VIEWの記述
echo $form->input('job', array('label' => '仕事', 'type' => 'select', 'multiple' => 'checkbox', 'options' => $jobs));

コントローラーの記述
$jobs = $this->User->Job->find('list');
$this->set(compact('jobs'));
0531nobodyさん2009/06/18(木) 16:31:55ID:???
>>530
値が取れないって、どうやったら取れなかったの?
debugは有効にしてる?
0532カナディアンマン2009/06/18(木) 17:00:36ID:???
レスありがとうございます。

data[User][job]の中身がNULLでした。
0533カナディアンマン2009/06/18(木) 17:09:12ID:???
すいません。
僕の質問の仕方がわかりづらいと思うので、少し変えます。

>>530のHTMLでチェックボックスをONにして送信しても、empty(data[User][job]) がTRUEになります。

チェックボックスがONになっているという情報はどのように取得できるのでしょうか?
0534nobodyさん2009/06/18(木) 17:13:21ID:???
>>533
this->data じゃなくて??
0535nobodyさん2009/06/18(木) 17:42:48ID:???
$も'も省略されるとphpっぽくないよな。
05365342009/06/18(木) 18:08:35ID:???
一応分りやすいように・・
$this->data
ね

debugをオンにしてないってオチじゃないよね?
0537nobodyさん2009/06/18(木) 18:57:33ID:???
>>533
debug( $this->data );
を、controllerに記述して中身を確認しましょう。
そしたらあとはカラムの型に応じて適当に処理すべし
0538nobodyさん2009/06/18(木) 20:08:09ID:???
新規でPHPの構築サイト案件がちらちらマッチングに出てるが
そのほとんどはデザイナ会社が勘違い(or 背伸び)で取ってきた案件が多いな。

だから>>521のような本が伸びるんだろう。
0539カナディアンマン2009/06/18(木) 23:28:34ID:???
お手数かけます。
debug( $this->data ); をしました。

結果
Array
(
[User] => Array
(
[hoge] => 1
[job] =>
[hogehoge] =>aaa
)
)

やっぱりjobの中に何も入ってないです。
0540nobodyさん2009/06/18(木) 23:53:02ID:???
>>539
>>530見直したらアソシエーションしてるね
どう関連づけされているかおしえて。
0541nobodyさん2009/06/19(金) 00:05:29ID:???
>>539
HABTMなら
http://book.cakephp.org/view/85/Saving-Related-Model-Data-HABTM
$form->input('Job.Job');
ってまだHABTMやったことないけど
0542カナディアンマン2009/06/19(金) 00:39:16ID:???
アソシエーションはこれです。
var $belongsTo = array(
'Job' => array(
'className' => 'Job',
'foreignKey' => 'job_id',
'conditions' => '',
'fields' => '',
'order' => ''
)
);
HABTMではありません。

あと、申しわけないのですが、VIEWの記述は>>530のヤツには少し間違いがありました。正しくはこれです。

出力されたHTML
<input type="checkbox" name="data[User][job][]" value="1" id="UserJob1" /><label>ヒキ</label>
<input type="checkbox" name="data[User][job][]" value="2" id="UserJob2" /><label>ニート</label>
<input type="checkbox" name="data[User][job][]" value="3" id="UserJob3" /><label>フリーター</label>

VIEWの記述 (※inputの後は'job_id'でした)
echo $form->input('job_id', array('label' => '仕事', 'type' => 'select', 'multiple' => 'checkbox', 'options' => $jobs));

コントローラーの記述
$jobs = $this->User->Job->find('list');
$this->set(compact('jobs'));

0543カナディアンマン2009/06/19(金) 00:48:30ID:???
それで、少しいじったらうまくいきました。

VIEWの記述
echo $form->input('job_id_hoge', array('label' => '仕事', 'type' => 'select', 'multiple' => 'checkbox', 'options' => $jobs));

「$form->input(」の後ろを「job_id_hoge」にしたらうまくいきました。
Userテーブルに存在する列と同じ名前だとうまくいかないみたい?
何でかわかりませんが・・・。
0544nobodyさん2009/06/19(金) 07:52:35ID:???
>>542-543
なんだjob_idなのか。
habtmじゃないとしたらUser.job_idにはint型ひとつしか入らないでしょ。
だからUser.job_idは複数選択できちゃだめ。
で、field にないデータが欲しいときは、架空のフィールド(例User.jobs)を作ってあげるイメージ
そしたら、multiple checkbox でも何でもできるから、$this->data['User']['jobs']に所望のデータが入るってこと。

データが消えたのは重複するjob_idが存在したか、もしくはモデルのデータを参照したとかかな?
0545nobodyさん2009/06/20(土) 02:06:37ID:???
Titleというモデルとコントローラを作り、

<?php
class TitlesController extends AppController {

var $name = 'Titles';
var $scaffold;
}
?>

としたところ、
viewアクションで
Undefined variable: title
が発生してしまいました。

いろいろ調べたところ、
$controller::set()で
titleにセットすると、
$titleにセットされずに$view::pageTitleにセットされるのが原因のようです。

titleを別の名前にするのが手っ取り早いとは思うのですが、
何か他に解決方法はないでしょうか?
0546nobodyさん2009/06/20(土) 09:35:43ID:???
>>545
viewアクションだけ自作するのがよさげ
nullチェックと$this->set('title' ,$this->Title->read ・・・ くらいしかしてないから
05475452009/06/21(日) 00:44:37ID:???
>>546
特定のアクションだけ自作とかできたんですね。
ありがとうございます。

しかしtitleが使えないとなると、なんて変数名でセットしようか・・・
こういうところで悩んでしまってぜんぜん進まない;
0548nobodyさん2009/06/21(日) 06:29:42ID:???
Tree ビヘイビアで作ったモデルを
generateTreeList でツリー構造の連想配列で取得できないのでしょうか。
ttp://book.cakephp.org/ja/view/228/Basic-Usage

例えばこんな感じ。
$ary = array(
'id' =>1,
'name' => 'カテゴリ',
'children' => array(
'id' => 2,
'name' => '楽しみ',
'children' => array(
array('id' => 3, 'name' => 'スポーツ',
'children' => array(
array('id' => 4, 'name' => 'サーフィン'),
array('id' => 5, 'name' => 'スケート'),
),
),
array('id' => 6, 'name' => '友人',
'children' => array(
array('id' => 7, 'name' => 'ジェラルド'),
array('id' => 8, 'name' => 'グウェンドリン'),
),
),
),
),
);
■ このスレッドは過去ログ倉庫に格納されています