1 :nobodyさん:2011/07/01(金) 16:33:46.28 ID:???
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

前スレ
【PHP】フレームワーク CakePHP 11ホール目【v1.3】
http://hibari.2ch.net/test/read.cgi/php/1297860755/

5 :nobodyさん:2011/07/01(金) 19:38:21.72 ID:???
携帯サイトとPCサイトをCakeで作るとき、
- routes.php
Router::connect('/m/', array('controller' => 'home', 'action' => 'index', 'prefix' => 'mobile'));
Router::connect('/m', array('controller' => 'home', 'action' => 'index', 'prefix' => 'mobile'));
Router::connect('/m/:controller/:action/*', array('prefix' => 'mobile'));

- app_controller.php
function afterFilter() {
  if (!preg_match("/^m(\/)?/", $this->params['url']['url'])) {
   $this->redirect('/m/' . $this->params['url']['url']);
  }
  if ($this->isMobile) {
    $this->output = mb_convert_kana($this->output, 'k');
    $this->output = mb_convert_encoding($this->output, 'SJIS', 'UTF-8');
  }
}
こんな感じで振り分けたりしてるんだけど、

function show() {
$this->set('abc', $this->Model->find('all'));
}

function mobile_show() {
$this->set('abc', $this->Model->find('all'));
}
上記のようにコントローラにPC用と携帯用で全く同じ処理なのに
別々のアクションを作らないといけない。
これはしょうがないのかな?
もっとナイスな実装方法があれば助言お願いします


6 :nobodyさん:2011/07/01(金) 23:15:29.99 ID:???
>>5
beforeFilter()かそれ以前で携帯か判定して
beforeRender()でviewを切り替えるComponentをつくる。
Controllerのactionは基本共通で場合によって処理も分けられる。

8 :nobodyさん:2011/07/02(土) 00:36:56.30 ID:???
>>6-7
サンクス
いや、多分コントローラのアクション同一のものを使えると思う

>beforeRender()でviewを切り替える
なるほど。
処理が全て終わったあとで、
$this->render('mobile_' . 現在のaction名);
みたいな感じかな。

>beforeFilter()かそれ以前で携帯か判定して
これがちょっとわからない
beforeRender()のview切り替え時に携帯かどうか判断したらだめなの?

74 :nobodyさん:2011/07/20(水) 16:58:32.13 ID:???
同時アクセスとかあまり関係ない。

銀行口座AからBへ振り込み処理を行うとする。
1.UPDATEでAの残高を減らす
2.UPDATEでBの残高を増やす
もし1の処理の後、エラーが起きて2が実行されなかったとする。
するとAの残高だけ減っているというデータの不整合が起きてしまう。
こうならないために、1と2をトランザクションで囲って、
エラーが起きた場合はロールバックして1の処理をキャンセルする。

75 :nobodyさん:2011/07/20(水) 17:12:21.69 ID:???
同じ編集画面多重で開かれて
内容が戻るのを防ぐのもトランザクションでやるの?

77 :nobodyさん:2011/07/20(水) 17:58:07.77 ID:???
>>74はトランザクション処理だろ。

>>75はトランザクションじゃないね。
DBでやるなら行ロックとか。

80 :nobodyさん:2011/07/20(水) 20:08:13.30 ID:???
じゃ、コード書いてみて

81 :nobodyさん:2011/07/20(水) 20:08:31.53 ID:???
>>77
行ロックってデッドロックの解決わからなくて実装してないなぁ
手動で解除できるようにしとくくらいなのか?

82 :nobodyさん:2011/07/20(水) 20:35:12.17 ID:???
>>81
pconnect使わなければプログラム終了したらDB接続も勝手に切れる。
嫌ならロックやトランザクション使うときだけ明示的にconnectする。

>>80
AppModelかBehaviourに
$db =& ConnectionManager::getDataSource($this->useDbConfig);
return $db->begin($this);
こんなメソッド書くかんじ?
同じDB接続なら二回目以降は無視するとかcommit/rollbackをまとめて行うとかの工夫はほしいけど。

84 :nobodyさん:2011/07/20(水) 22:48:34.13 ID:???
>>82
そのコード、もう標準で組み込んでくれよと思う

85 :nobodyさん:2011/07/21(木) 00:07:23.26 ID:???
>>84
通常はsaveAllで事足りるはず。
MySQLならinnoDB使ってれば自動でトランザクションしてくれる。

87 :nobodyさん:2011/07/21(木) 14:11:40.28 ID:???
>>85
通常の範囲せますぎやない?
クエリの間に判定や分岐をいれたいことって多々あるとおもう。
MySQLのストアドは弱いしね。

88 :nobodyさん:2011/07/21(木) 16:19:08.49 ID:???
>>87
どんな時に使うの?
cakeではやった事無いよ。

89 :nobodyさん:2011/07/21(木) 16:40:06.60 ID:???
更新って1つのテーブルだけじゃないからな。
例えば、会員情報を更新しようとして、一緒に
プロフィールテーブルやポイントテーブルを更新する事は想定できるだろ。

143 :nobodyさん:2011/07/28(木) 01:45:02.72 ID:???
フリーランスでWEBアプリを開発しています。
PG歴8年で、PHP歴は1年程度です。
フレームワークを使わないPHP開発は一通り経験しているつもりです。

まだcakeを紹介したサイトをいくつか読んだレベルなのですが、
「なぜcakeを使うのか?」がいまいちピンときていません。

開発スピードなら、既成ライブラリや私製ライブラリで十分な成果が出る気がします。
MVCがしたいなら、別にcakeをつかわなくてもできるんじゃ?と思います。
複数PGでの協業にcakeが威力を発揮するとも思えないのです。

みなさんはなぜcakeにかぎらず、PHPフレームワークをつかっているのでしょうか?
みなさんのご経験された案件でcakeなりPHPフレームワークを使うことを決定した理由は
なんなのでしょうか?差し支えなければ教えてください。


145 :nobodyさん:2011/07/28(木) 09:25:36.36 ID:???
>>143
デザイナがいなくて画面を自分で作らなければいけない仕事をやってるんで、
scaffoldを吐き出してくれるのが一番助かってるかなあ。
あとはクエリパラメータを関数の引数にマップしてくれるので
どこでどのパラメータを使っているかわかりやすいとか。
フォームヘルパーみたいのも自作しなくてすむし。
ページングも楽だ。

まあ、単体で見るとたいしたことなくても、Railsがフルスタックフレームワーク
と言われていたように、オールインワンでそろってるのが楽なわけよ。

146 :nobodyさん:2011/07/28(木) 09:31:09.08 ID:???
>>143
俺は単に「ネット上の情報が一番多い」事が理由だな

cakeに限らない場合、命名規則や開発方法が決められていると、
開発時の迷いが少なくなるというメリットがある。俺にはこれがでかい。

148 :nobodyさん:2011/07/28(木) 10:55:09.01 ID:???
>>143
チーム開発してると合意というか統制がとりやすい。デザインパターンみたいなもん。
保守面でもFWのバグやセキュリティフィックスの作業が軽減できる。
Cake1.x自体は構造が古くてクソだけど。

172 :nobodyさん:2011/08/01(月) 14:58:08.84 ID:???
CakePHPで掲示板つくって運営してるけど、
さくらインターネットからプログラム見なおせゴルアとお叱りうけて、
同時接続数制限かかりました

200 :nobodyさん:2011/08/04(木) 01:12:45.98 ID:???
Containableで絞り込めばいいんじゃないの

225 :nobodyさん:2011/08/14(日) 08:17:24.45 ID:???
*聞かれた方の効率は含みません

230 :225:2011/08/14(日) 13:50:36.60 ID:???
マニュアルに書いてあることなのに読まず、人に質問して教えてもらったほうが効率がいいってこと・・・?
よくわからんな・・・

324 :nobodyさん:2011/09/05(月) 21:59:00.60 ID:???
とある事情でサーバーを変えてサイトを見ていたら
SQL Error: 1064: You have an error in your SQL syntax; check the manual that corresponds to
とかエラーが出ていた
データベースとの接続はできているしなんだろうと思っていたんだが
関数がうまく呼び出せてないっぽい
get_classでModelを表示させようとしたら表示がAppModelとかなってたんだけど
同じような現象になった方いませんか?
開発環境では何の問題もなく動くしget_classでModel名がちゃんと表示されるしわからん

326 :nobodyさん:2011/09/05(月) 23:42:44.48 ID:???
>>324
すごい適当だけど、PHPのバージョンが4系統とか

327 :nobodyさん:2011/09/06(火) 00:10:43.75 ID:???
>>324
俺も見当付かないんだけど、データベースサーバー側のエラーと思えるから、データベース名 + 1064で検索するとか、エラーナンバーから詳細を引ける方法を調べてみると何か分かるんでないかな?
(まさかとは思うが、1064ってのは1064文字目って意味じゃぁないだろうなぁ)

331 :nobodyさん:2011/09/06(火) 21:30:36.15 ID:???
>>326
サーバーはロリポップでPHPのバージョンは5.3.5で開発環境と一緒なんだ
しかしそうか
PHPの設定の違いを疑ってみるべきだったな
ありがとう!
>>327
違うページではAn Internal Error Has Occurredってエラーが出るから
データベースサーバー側かもしくは設定ミスってるのかなぁ
設定ファイルは最初に完璧であることを確認できたし考えにくいんだよな…
いろいろ調べてもわからなくて…
なぜオブジェクトがAppModelに…って考えてしまう…


332 :nobodyさん:2011/09/07(水) 00:16:46.95 ID:???
>>331

訳わからん挙動に悩んだ際のうっかり系チェックリストを当てずっぽうで書いてみる。
どっかで文字コードが違うファイルが混入してるとかは?
あるいはBOMが入り込んでたりとか。
ver.1.xならば、ファイル名に大文字小文字が入り交じっていないか。

そのエラーが出るページと出ないページがあるのなら、
両者でどこが違うのかを切り分けてみてはどうだろう。


361 :nobodyさん:2011/09/14(水) 05:25:27.50 ID:MD6DgTpS
/images/view/12345?height=135
このようにアクセスして、imagesコントローラのviewアクションで
サムネイルを生成して画像を表示させているんだけど、
なぜかCakePHPを介してこのようにアクセスすると、ファイルサイズが小さくならない。

viewアクションの動きは、上記を例にすると、
12345.jpgを縦135pxのサイズでimgejpg()を使って表示させる(横幅は比率維持)というものです。

/images/view/12345?height=1
このようにアクセスすると、縦幅1ピクセルの小さい画像が生成されるんですが、
ファイルサイズは17KBとかになってしまいます。

アクションの中身をそっくりそのままphpファイルにして、CakePHPとは無関係の場所でアクセスすると、
ファイルサイズも縮小分小さく(700Bぐらい)なっている。

誰か原因教えてくださいorz


365 :nobodyさん:2011/09/14(水) 12:58:26.16 ID:???
Controller側
function index(){
$hoge = 0;
$this->set('hoge',$hoge);
}
function ajax(){
$this->autoRender = false;
$this->uses = null;
Configure::write('debug',0);
$hoge = $hoge + 1;
$this->set('hoge',$hoge);
}

view側
<div id="div">
echo "$hoge";
</div>
<?php echo $ajax->link('ajax',ajax,array('update'=>'div')); ?>


ってやるとajaxで「$hoge空っぽなんだけど^^;」って言われるんですけど
ビュー側からコントローラー側へ変数を渡すにはどのようにすればよろしいのでせうか?

368 :nobodyさん:2011/09/14(水) 13:57:54.28 ID:???
>>365
何も値を渡して無いじゃないw
普通のリンクと同じ。$ajax->link(’title','ajax/1'.......)みたいにすればいい。
http://book.cakephp.org/view/1362/Methods

でもAjaxヘルパーはdeprecatedだからそろそろJsヘルパー使おうよ。

387 :nobodyさん:2011/09/17(土) 01:22:15.55 ID:???
設計の相談があります。

■usersテーブル(会員データを保存)
id、name、created
■photosテーブル(会員が投稿した写真を保存)
id、user_id、name

こういうテーブル構成になっているとします。
users→photosはbeLongsToの関係です。

Authでログインした後、$this->Auth->user();を参照しても
結合しているphotosのデータが取得されません。
どうしたらいいのでしょうか?

484 :nobodyさん:2011/09/26(月) 09:52:25.70 ID:???
モデルビューコントローラーの
ビューとコントローラーは表示と処理的な物ってわかるけど
モデルがよくわかんない

MySQLのテーブル名が規則に反してる時にしか使ってない

504 :nobodyさん:2011/09/27(火) 11:29:16.20 ID:???
$table = $this->Shin->query("$sql");
と、SQLからデータを持ってきて($sqlにはStringでSQL文が入力されています)
for($i = 0;$i < count($table);$i++){
$arr = $table[$i];
echo "<tr>";
echo "<td nowrap>{$arr['shin']['NO']}</td>";
echo "</tr>";
}
という感じでテーブルを出力してるのですが、
データの項目が多くなってくると表示する量が多くなるので
5件ずつ出力したいと思っています。

ページネーションを使って$tableの中身を5件ずつ出力するには
どうすればいいのでしょうか、ご教授お願いします。

505 :nobodyさん:2011/09/27(火) 17:56:03.91 ID:???
まずはここ
http://book.cakephp.org/ja/view/1231/%E3%83%9A%E3%83%BC%E3%82%B8%E4%BB%98%E3%81%91-Pagination

510 :nobodyさん:2011/09/28(水) 11:20:31.89 ID:???
>>505
読みつつ無い頭でウンウン考えて
$table = $this->Shin->query("$sql");
$table = $this->paginate();

for($i = 0;$i < count($table);$i++){
$arr = $table[$i];
echo "<tr>";
echo "<td nowrap>{$arr['Shin']['NO']}</td>";
echo "</tr>";
}
とすれば表示件数がページネーションで指定した件数になりましたが、
$sqlのSQL文が反映されていないようです。
>>504の方法ではテーブル名が「shin」でよかった(MySQLのテーブル名)のに対し、
この方法で実行すると「Shin」(modelで設定した名前)になってしまいます。

511 :nobodyさん:2011/09/28(水) 12:06:10.11 ID:???
>>510
$this->Shin->query("$sql") の後に$this->paginate(); やっても意味無いっしょ。
2回クエリを発行してる。

基本的な$this->Model->find()の使い方とかわかってますか?
paginate()はfind()に毛が生えたようなものなので、find()と同じように条件を与えればいい。

どうしても$this->Model->query()を使うなら、
データを持ってくる範囲のLIMITの計算とかORDERとか、最後まで面倒みるつもりで。



526 :nobodyさん:2011/09/28(水) 18:19:57.43 ID:???
ちょっとだけ補足するとGETかPOSTで数値を投げて結果を受け取るだけです。
勉強し直せと言いたくなるのは分かるがw


http://hibari.2ch.net/test/read.cgi/php/1309505626/l50人気ブログランキングへ