【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
0006nobodyさん
2010/07/23(金) 09:15:34ID:???・ver1.3系
CakePHP 1.3によるWebアプリケーション開発―オープンソース徹底活用
http://www.amazon.co.jp/dp/4798026646/
CakePHP 1.3 (独語らしい)
http://www.amazon.co.jp/dp/3827327709/
・ver1.2系
CakePHP1.2ガイドブック
http://www.amazon.co.jp/dp/4839932468/
CakePHPによる実践Webアプリケーション開発
http://www.amazon.co.jp/dp/4839930651/
オープンソース徹底活用 CakePHPによるWebアプリケーション開発
http://www.amazon.co.jp/dp/4798022225/
CakePHP ポケットリファレンス※ver1.2beta
http://www.amazon.co.jp/dp/4774135038
CakePHP徹底入門
http://www.amazon.co.jp/dp/479811717X
PHPで作る携帯サイトデベロッパーズガイド
http://www.amazon.co.jp/dp/4798024767/
・ver1.1系
CakePHPガイドブック
http://www.amazon.co.jp/dp/4839924317
Fast CakePHP
http://www.amazon.co.jp/dp/4774133418
0007nobodyさん
2010/07/23(金) 09:16:23ID:???補足があればどうぞ
Have a Nice Cooking !
> cake bake all User
0008nobodyさん
2010/07/23(金) 14:23:29ID:???バリデート後にコントローラー内で
$this->data[モデル] = $this->モデル->data;
ってやってたんですが、
これだとモデル毎にコントローラー内に書かないといけないので
もっと簡単にする方法はないでしょうか
0009nobodyさん
2010/07/23(金) 14:30:58ID:???基本的にbeforeValidateはsave用のデータを変更するときに使用するから
コントローラーのdataに戻さない使い方が基本よ
で、saveに失敗したら戻したいとかなら、データ加工のメソッドをモデルに別で作って、setの前とかで呼んであげたほうが良いと思う
$this->data = $this->User->changeStatus();
みたいに
0010nobodyさん
2010/07/23(金) 14:31:19ID:???class BbsController extends AppController {
var $name = 'Bbs';
var $title = "BBS";
とやったんですが、「bbテーブルがない」とエラーになります。
sで終わる単語は使うとまずいんでしょうか?
0011nobodyさん
2010/07/23(金) 14:33:22ID:???あ、その例だとデータ渡ってないな
$this->data = $this->User->changeStatus($this->data);
こうか?
0012nobodyさん
2010/07/23(金) 14:35:33ID:???sで終わる略語はInflectorに設定しなくてはだめ
可能ならtable名をboardsとかにしたほうが良い
0013nobodyさん
2010/07/23(金) 15:28:37ID:???コントローラで
var $uses = array('Bbs');
bbsモデルで
var $useTable = 'bbs';
って明示的に指定してやればうまくいきそうだけど。
0014nobodyさん
2010/07/23(金) 15:51:54ID:???テーブル名は自由に付けたい
0015nobodyさん
2010/07/23(金) 20:53:02ID:???BBSコントローラーだといまいち何をするものかわからん気がする
掲示板システム全部を請け負うと肥大化しそうだし、boards,threads,responsesとかで分けた方がいいんじゃね?
0016nobodyさん
2010/07/23(金) 23:15:07ID:???てか、掲示板は英語でforumって書くのが一般的だと思うが
0017nobodyさん
2010/07/23(金) 23:30:08ID:???0018nobodyさん
2010/07/23(金) 23:42:12ID:???標準ページングのURLが気持ち悪くて、/hogeとか/hoge?page=2にしてみて、
/hogeをキャッシュしようと思ったら/hoge?page=2も同じページと見なされちゃうっぽいんだけど
0019nobodyさん
2010/07/24(土) 00:57:52ID:???そこなんだよね。
cakeのpage:2 形式だとクエリストリングにスラッシュとか入った時におかしくなるし、
?page=2にしたらキャッシュしてくんないし。俺はキャッシュの方をあきらめたけど。
0020nobodyさん
2010/07/24(土) 01:38:30ID:???にかえるのでよければ簡単にできる。
あとキャッシュは自前でクラス使うのもそれほど苦じゃないかと
0021nobodyさん
2010/07/24(土) 04:31:49ID:???キャッシュの恩恵が受けられるサイトの場合、鯖で対策するだろうし。
0022nobodyさん
2010/07/24(土) 14:37:15ID:???0023nobodyさん
2010/07/24(土) 20:02:03ID:???それで気持ち悪いと思わないの?
0024nobodyさん
2010/07/24(土) 20:07:02ID:???0026nobodyさん
2010/07/24(土) 22:56:15ID:???0027nobodyさん
2010/07/24(土) 23:00:45ID:???0028nobodyさん
2010/07/24(土) 23:03:23ID:???気持ち悪いと思わないの?
気持ち悪いのであれば何故使ってるの?
>>26
なぜバージョンが気にならないの?
今時PHP4の書き方なんかに戻れないんだけど。
0029nobodyさん
2010/07/24(土) 23:17:59ID:???PHP5でしかつかわないんならPHP5で書けばいいだけだと思うんだけど
PHP4を強要される場面があるなら教えてくれないか?
0030nobodyさん
2010/07/24(土) 23:26:33ID:???0031nobodyさん
2010/07/24(土) 23:36:03ID:???「気持ち悪いと思わないの?」なんて聞かれるのは気持ち悪い
PHP4の書き方が気持ち悪いかどうかで言ったら別に気持ち悪くはないし
だから
PHP4の書き方強要されるのが嫌だ もっとうまい具合に解決してほしい
とストレートに言ってくれたほうがいいな
0032nobodyさん
2010/07/25(日) 00:37:10ID:???0033nobodyさん
2010/07/25(日) 03:13:37ID:???相手にしても会話にならない
0034nobodyさん
2010/07/25(日) 03:34:31ID:???むしろ批判こそいろいろ見えてきていいと思うけどな。
批判してた人も、え?そうなの!?になるかもしれないじゃん。
0035nobodyさん
2010/07/25(日) 04:37:05ID:???/contoroller/action/1 や /contoroller/action/id:1
みたいな形はSEO的に良いかもしれないけど、少しわかりづらい。
従来のように
/contoroller/action/?id=1 とか /contoroller/action?id=1
でも良いと思う。
0036nobodyさん
2010/07/25(日) 05:36:41ID:???OAuth認証のsignatureが合わなくて苦労した
0037nobodyさん
2010/07/25(日) 13:46:57ID:???スタティックなページだと、smart URLの方がいいと思うんだけど、
ページングとかのダイナミックなページは従来のURLの方がいいと思う
× /archive?id=1
○ /archive/id:1
○ /archive?page=2
× /archive/page:2
というわけで俺も両方使えた方がいいと思うけど、
従来のURLを切り捨てて実装している機能が多いから無理だろうなあ
前スレに出ていたキャッシュとかもそうだけど。
0038nobodyさん
2010/07/25(日) 16:16:20ID:???Cake標準のページネーション使うと、
named使わなきゃならないんだよね。
検索フォーム作るとき、
POSTのときと、namedのときで処理を変えなきゃいけないのが面倒・・・
Paginatorヘルパー拡張して、page=1みたいなURL吐くようにすればいいのかな?
0039nobodyさん
2010/07/25(日) 16:33:37ID:???おれはいっそのこと、$_POSTとか$_GETとかそのまま受け取るようにしてるよ。
namedから呼び出していたら使い勝手悪いし。
0041nobodyさん
2010/07/25(日) 20:49:24ID:???if ($_GET["page" > 1]) {
$page = $_GET["page"];
} else {
$page = 1;
}
こんな感じでページネーションに渡せば良くないか?
0042nobodyさん
2010/07/25(日) 20:50:32ID:???if ($_GET["page"] > 1) {
ま、整数のみ許可するとかもう少し処理入れるべきだろうが。
0043nobodyさん
2010/07/25(日) 21:03:34ID:???0044nobodyさん
2010/07/25(日) 21:04:58ID:???0045nobodyさん
2010/07/25(日) 21:05:59ID:???0046nobodyさん
2010/07/25(日) 21:33:12ID:???0048nobodyさん
2010/07/25(日) 23:54:46ID:???0049nobodyさん
2010/07/26(月) 01:51:25ID:REeMHXov/home/test/public_html // CakePHP以外のHTMLファイルなどがある
/home/test/public_html/system // CakePHPの公開ディレクトリ
ベースURLはhttp://localhost/test/だとし、
システム用の(Cake用)の場合は、http://localhost/test/system/になるとします。
ビューの中で<?php include("../include/header.php")?>
と相対指定すれば
/home/test/public_html/include/header.php
のファイルを読み込む事が出来るのですが、
ページネーションなどでURLが階層化されるとinclude出来ません。
通常は、views/elementにビューの共通ファイルを入れると思うのですが、
/home/test/public_html/include/header.phpにあるファイルをコピーするので
同じファイルが2つ存在する事になり、効率が良くないです。
上記のように「Cakeを使う箇所・使わない箇所」で分けている時、
共通化するファイルはどうするべきでしょうか?
やはりviewsに入れて分けるしかないのでしょうか?
0050nobodyさん
2010/07/26(月) 02:21:11ID:???>ビューの中で<?php include("../include/header.php")?>
>と相対指定すれば
あたりまえだろ
絶対指定しろ
>上記のように「Cakeを使う箇所・使わない箇所」で分けている時、
>共通化するファイルはどうするべきでしょうか?
>やはりviewsに入れて分けるしかないのでしょうか?
絶対指定した上で自分でどちらが扱いやすいか判断しろ
0051nobodyさん
2010/07/26(月) 02:27:28ID:???0052nobodyさん
2010/07/26(月) 02:51:26ID:???しかも聞くだけ聞いてまたのこのこあらわれる
0053nobodyさん
2010/07/26(月) 10:10:02ID:???0054nobodyさん
2010/07/27(火) 11:03:38ID:???こんな感じでモデルに記述してOKでしょうか
function rollback()
{
parent::rollback();
$this->afterRollback();
}
function afterRollback()
{
//処理
}
0055nobodyさん
2010/07/27(火) 11:50:14ID:???なんだよモデルってAppModel? 特定のモデル?modelClass?
あとOKでしょうか?ってエラー出なきゃなんでもOkっちゃOKだよ
0056nobodyさん
2010/07/27(火) 13:08:06ID:???0057nobodyさん
2010/07/27(火) 13:14:07ID:???0058nobodyさん
2010/07/27(火) 13:28:33ID:???0059nobodyさん
2010/07/27(火) 14:33:44ID:???insertしたら責任を取れ!
0061nobodyさん
2010/07/27(火) 14:44:16ID:???0062nobodyさん
2010/07/27(火) 14:51:29ID:???0063nobodyさん
2010/07/27(火) 15:47:46ID:???0064nobodyさん
2010/07/27(火) 15:53:51ID:???とすると、
$dataにはArrayデータが格納されます。
このArrayの中に「value」というカラムのデータがあるのですが、このvalueの値を1行で取得したいのです。
$value = $this->TestModel->findById(1)['TestModel']['value'];
はだめでした。
文法的にどのように書くのが正しいのでしょいか?
0065nobodyさん
2010/07/27(火) 15:57:55ID:???そんな風に考えていた時期が僕にもありました。
今考えると赤面ものです。
0068nobodyさん
2010/07/27(火) 16:03:05ID:???1.findのfieldsで取得したいfieldを指定できる。
2.配列の値がひとつならcurrentで下がっていけばいい。
これでできるんじゃないか
読みづらくてあほだけど。
0069nobodyさん
2010/07/27(火) 16:09:35ID:???perlでは
{$this->TestModel->findById(1)}['TestModel']['value'];
こんな感じにできた気がするなぁPHPは無理なんじゃない?てか知らない。
0070nobodyさん
2010/07/27(火) 16:39:06ID:???0071nobodyさん
2010/07/27(火) 18:37:46ID:???これじゃだめなん?
$data = $this->TestModel->field('value', array('id' => 1));
0072nobodyさん
2010/07/27(火) 19:43:06ID:???0073nobodyさん
2010/07/27(火) 19:45:19ID:???0074nobodyさん
2010/07/27(火) 19:45:57ID:???007564
2010/07/27(火) 21:01:45ID:???ありがとうございました。
modelに処理を書くにしてもシンプルに書きたいので、まさに理想です。
このやり方、しっかり心に刻みます。
みな調子いいなぁ・・・w
0076nobodyさん
2010/07/27(火) 21:43:58ID:???0077nobodyさん
2010/07/29(木) 03:48:26ID:8543E4o9http://japan.zdnet.com/video/screencast/story/0,3800079413,20354695,00.htm
http://www.asahi.com/ai/cp27863.edgefcs.net/screencasts/toytter.zip
http://japan.zdnet.com/blog/yoshimi/2007/10/01/entry_27016431/
http://japan.zdnet.com/blog/yoshimi/2007/10/10/entry_27016432/
http://japan.zdnet.com/blog/yoshimi/2007/10/12/entry_27016433/
http://japan.zdnet.com/blog/yoshimi/2007/10/22/entry_27016434/
http://japan.zdnet.com/blog/yoshimi/2007/11/14/entry_27016435/
http://japan.zdnet.com/blog/yoshimi/2007/11/17/entry_27016436/
http://japan.zdnet.com/blog/yoshimi/2007/11/22/entry_27016437/
http://japan.zdnet.com/blog/yoshimi/2007/11/29/entry_27016438/
http://japan.zdnet.com/blog/yoshimi/2007/12/08/entry_27016439/
toytter-2.0
http://japan.zdnet.com/blog/yoshimi/2008/02/05/entry_27016446/
TwitterAPIをActiveResourceで
http://japan.zdnet.com/blog/yoshimi/2008/02/18/entry_27016448/
script/consoleから
> Twitter::Status.post(:update, :status => "activeresource test")
ってやるだけで、Twitterに投稿できる。
これでtoytter内で発言すると、twitterにも同じ内容が投稿されるようになりました。
0078nobodyさん
2010/07/29(木) 15:34:05ID:???findしたデータを1次元の配列に変換しないといけないのですが
これができる関数ってあるのでしょうか。
array_mapするのが定石でしょうか。
$result=$this->Model1->find('all', array('fields'=>'Model1.id'));
$array=hoge_function($result);
$conditions=>array('Model2.hoge_id'=>$array);
$this->Model2->find('all', array('conditions'=>$conditions));
上記の例の場合のhoge_functionのような処理を簡単にしたいです。
0079nobodyさん
2010/07/29(木) 15:43:01ID:???その例ならアソシエーション使わない理由が分からない
例を無視して応えるならfind('list')で取得してarray_keysかな?
只今オープン価格中
http://gekiyasu.issekinicho.com
0081nobodyさん
2010/07/30(金) 09:29:57ID:???Set::extractかな
http://book.cakephp.org/ja/view/1501/extract
CakePHPはサブクエリが思うように使えないから、俺もよくやる
0082nobodyさん
2010/07/30(金) 10:01:28ID:???008378
2010/07/30(金) 12:28:39ID:E2f+bC/4おー、まさにこれですね。ありがとうございます。
他にも使えそうなのがありますね > setクラス
0084nobodyさん
2010/07/30(金) 12:32:10ID:???Set::combine
Set::extract
あたりは結構常用してる
0086nobodyさん
2010/07/30(金) 18:30:15ID:???下記のようにあるコントローラに別のコントローラを継承させています。
App::import('Controller','Base');
class TestController extends BaseController {
Testというページは情報入力画面なのですが、
最初の画面は表示されるのにサブミットボタンを押した後真っ白な画面になってしまいます。
phpのエラーはなくdebug.logにも何も出力されておりません。
継承ではフォームの作成は出来ないのでしょうか。
あいまいな質問ですみません。
何かヒントでもつかめればと思います。
0087nobodyさん
2010/07/30(金) 18:47:58ID:???TestControllerとTest2Controllerというコントローラがあり
処理も全く同じでファイルパスだけが違うます。
これまで処理が全く同じでパスだけ違う場合
シンボリックリンクを張りファイル名だけ変えていたのですが
cakeの場合クラス名が変わるのでそれが使えません。
同じ処理を行うファイルを複数使用する場合
効率のいいやり方はありますか?
0089nobodyさん
2010/07/30(金) 19:14:56ID:???SecurityComponentを外したら確かにアクセス出来るようになりました
どうもありがとうございます!
0090nobodyさん
2010/07/30(金) 19:24:07ID:???答えたくもないわ
0092nobodyさん
2010/07/30(金) 22:55:32ID:???URLにプラグインが保管されてしまうんですがこんな仕様でしたっけ?
$html->link(array(....));のときにプラグイン名を明示的に
'plugin'=>nullってしてやらないとこれもプラグインが勝手に保管されるので同じように
form->create()の第二引数で指定してやってもダメでした。
なんか他のところに原因があるんでしょうか
009392
2010/07/30(金) 23:05:23ID:???で、どーもそういう仕様っぽいなってことで、以下のようにしました。
<?php echo $form->create('Member', array('url'=>array('plugin'=>null, 'controller'=>'members', 'action'=>'login')));?>
memberを2個かくのに抵抗感汁んですがまぁいいや。
0094nobodyさん
2010/07/31(土) 07:39:26ID:???それならpluginをnullしなきゃいけないのは当然よ
0095nobodyさん
2010/08/01(日) 00:23:04ID:???んで、html->link()の時はplugin=null入れなきゃってのは前からやってたんですが、
formのケースが自分でかってに
plugin=nullなんて指定しなくても第一引数がPlugin.Memberとかでない限り大丈夫だと思ってたんです。
でもそうじゃなかったと。
サーセン
0096nobodyさん
2010/08/01(日) 08:44:34ID:???基本的に現在のURLを残そうとするからね
0097nobodyさん
2010/08/01(日) 09:04:08ID:???0098nobodyさん
2010/08/02(月) 12:35:29ID:n6/Fh0gL知恵をお貸しくだされ
入力任意の日付項目があって
viewで
$form->input('A',array('type'=>'date','empty'=>'','selected'=>'' ・・・
ってしたときに
modelでvalidateを下記のように設定する
'A' => array(
'rule' => array(
'allowEmpty' => true,
'message' => '正しい日付を選択して下さい'
)
),
で設定すると入力フォームで年月日を全部選択しないとmodelで値が
取れないからどうしたらいいか迷ってる。
一番簡単な方法は'type'=>'date'を使わないで
年月日を別々に作っちゃうことだけど
それ以外の方法でなにかないかな?
0099nobodyさん
2010/08/02(月) 12:53:48ID:???超簡単にかけるでしょ
0100nobodyさん
2010/08/02(月) 13:48:24ID:???findのconditionで指定した場合(例えば $condritions=array('xxx'=>'aaa')など)
「Column 'xxx' in where clause is ambiguous」
というエラーが発生します。
$condritions=array('(テーブル名).xxx'=>'aaa')
というようにテーブル名を条件指定のときに付与すれば回避できるのですが、
テーブル名を直接記述するのもフレームワーク的にしっくりきません。
他にこのエラーの回避方法などありますでしょうか?
0101nobodyさん
2010/08/02(月) 13:51:18ID:n6/Fh0gL99さん返信ありがとです
98ですが、独自ルールの前に値がmodelでは取れないので困っているんです
viewでは取れているのですが^^;;;
具体的には
'A' => array(
'rule' => 'validateData',
'message' => '正しい日付を選択して下さい'
),
##データValidate関数
##$this->data[$this->name][$key]['year']と
##$this->data[$this->name][$key]['month']と
##$this->data[$this->name][$key]['day']がとれない;;
##'A'というkeyで値が取れている。ひとつでも選択されてないと値が空白になる
##という理由で独自に作ってもだめです><
function validateData($field=array()) {
foreach($field as $key => $val){
if($key=='A'){
if(!empty($this->data[$this->name][$key]['year']) && !empty($this->data[$this->name]['month']) && !empty($this->data[$this->name]['day'])){
return checkdate($this->data[$this->name]['month'],$this->data[$this->name]['day'],$this->data[$this->name]['year']);
}else if(empty($this->data[$this->name]['year']) && empty($this->data[$this->name]['month']) && empty($this->data[$this->name]['day'])){
return true;
}else{
return false;
}
}
}
return true;
}
0103nobodyさん
2010/08/02(月) 14:05:01ID:???http://book.cakephp.org/ja/view/1018/find
のソースをよーく見てね
0104100
2010/08/02(月) 14:10:02ID:???ありがとうございました。
conditionsの指定はカラム名だけでOKなものと思い込んでいました。。。
モデル名の付与がそもそも正しいんですね。
■ このスレッドは過去ログ倉庫に格納されています