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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2011/02/16(水) 21:52:35ID:zCTGjUMq
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
0781nobodyさん2011/05/17(火) 18:03:41.28ID:???
>>780
0だと変数の型がintegerで'0'だとstringだから。
ちなみにfalseはbool型の0。
0782nobodyさん2011/05/18(水) 23:55:26.02ID:M1/yO2iL
findで以下のようにSQLの関数を使うと戻ってくる値がおかしくなります。
以下の例だとUser.sexの最初の値は$res[0]['DECODE(User']['sex']の中に入ってきたりします。
この現象を回避する手立てはあるのでしょうか?

$params = array(
  'fields' => array(
    'User.id',
    "DECODE(User.sex, 1, '男', 2, '女')"
  ),
  ・・・
)
$res = $this->User->find('all', $params);
0783nobodyさん2011/05/19(木) 00:00:58.47ID:???
virtualFieldsを使えば良い。
1.2とかだったらasで名前指定すればOK、ただしUserの配列の中に入れることはできない
0784nobodyさん2011/05/19(木) 13:25:40.80ID:hw1vryEv
class OrderDetail extends AppModel {
  var $hasMany = array('Stock');
}

これで注文テーブルから注文レコードとると、
注文詳細レコードも一緒にとってくるようになったんだけど、
注文詳細レコードから、商品レコードも一緒に自動で取りたい場合はどうしたらいいんだろう。
1階層?しか自動でとってこないのかな
0785nobodyさん2011/05/19(木) 14:05:27.71ID:???
>>784
他モデルの設定が分からんからなんとも言えないけど
マニュアルは読んでやってみたけどできなかったっつう話?
0786nobodyさん2011/05/19(木) 14:26:20.70ID:???
>>784
自前でjoin書かないと1階層までじゃないんだっけ?
0787nobodyさん2011/05/19(木) 18:32:06.41ID:???
>>784
テーブル設計が分かってないけど
recursive使えばいいんじゃない?
$this->Model->recursive = 2;
0788nobodyさん2011/05/19(木) 20:00:43.27ID:???
さんくすおまえら
0789nobodyさん2011/05/19(木) 23:51:36.35ID:???
>>786
recursiveを使えば取得できるけど、joinされたSQLが発行されるわけではない。
パフォーマンスを考えれば自前でjoinすべき。
0790nobodyさん2011/05/20(金) 00:27:57.20ID:???
joinとかサブクエリちょっと複雑なfind書こうとすると
とたんにSQL書き始めちゃうみたいになるよね。
コントローラでSQLって書いちゃ駄目だろとか思う。
0791nobodyさん2011/05/20(金) 00:29:29.63ID:???
>>783
1.3ですけどうまく行きませんでしたよ。
0792nobodyさん2011/05/20(金) 00:54:14.48ID:???
フォーム送信された電話番号に全角があったら半角に変更しようと、
beforeValidateに以下のように書きました。

function beforeValidate(){
if (isset($this->data[$this->name]['tel'])) {
$this->data[$this->name]['tel'] = mb_convert_kana($this->data[$this->name]['tel'], 'rnask', 'UTF-8');
}
return ;
}

しかし半角に変換されません。何か間違っているのでしょうか?
ちなみに、コントローラーでバリデーションを実行する前に
$this->Model->set($this->data);
こうしてます。
0793nobodyさん2011/05/20(金) 01:54:51.61ID:???
>>792
>この関数は true を返さなければなりません。
>そうでない場合、現在の save() の実行が中断されます。
でないの?
0794nobodyさん2011/05/20(金) 03:11:47.64ID:???
>>793
return ; にしているところを return true; にしても変化はありません。
全角が半角になりません。

また、確認画面を入れてますので、saveでの動作ではありません。
$this->Model->set($this->data);
if (!$this->Model->validates()) {
 $this->set('error', 'エラー');
}

みたいにしています。
0795nobodyさん2011/05/20(金) 08:35:02.16ID:???
>>789
これって2階層以上になるとjoinしなくなるってわけじゃないよな?
cakeのモデルの結びつけは全て単に個々のレコードをselectしてるんだよな?
0796nobodyさん2011/05/20(金) 08:51:23.08ID:???
っていうか、たとえば、「MySQLにとって最適なクエリはどう書くのか」っていう考えが出来てない奴大杉。
はじめからORマッピング使うからそうなる。

フレームワークのDBアダプター使えば全てのDBサーバに最適なクエリが発行できると
思ってる奴多いけど、最適なクエリはDBサーバによって書き方が異なるのだ。

って、ねーちゃんが言ってた。
0797nobodyさん2011/05/20(金) 09:52:43.86ID:???
>>795
1階層目まではjoinされる。
2階層目以降はjoinされない。1階層目のデータをキーに、複数のSQLが実行される。
0798nobodyさん2011/05/20(金) 10:10:25.55ID:???
アソシエーションで質問なんですけど、
FooとBarがそれぞれ3つのHogeを持たせるため、
Foo、Barそれぞれに hoge_id, hoge1_id, hoge2_id カラムを作成して関連づけました。
これでHogeをfindで取得した場合、
Array
(
  [0] => Array
  (
    [Hoge] => Array(~)
    [Foo] => Array(~)
    [Foo1] => Array(~)
    [Foo2] => Array(~)
    [Bar] => Array(~)
    [Bar1] => Array(~)
    [Bar2] => Array(~)
  )
)
こんなふうになるんですが、(foreignKeyごとにエイリアス名を変えています)
これを
    [Foo] => Array(
      [0] => Array(~)
      [2] => Array(~)
      [1] => Array(~)
    )
こんな感じに取って来れる方法はないでしょうか?
もしforeignKeyを分ける以外にいい方法があればそちらも教えて下さい。
0799nobodyさん2011/05/20(金) 10:37:34.40ID:???
そういう関数を作る
0800nobodyさん2011/05/20(金) 16:16:52.10ID:haTOk0oR
primary(文字列)に"0"設定したいんだけど、save()で登録できる方法ない?
0801nobodyさん2011/05/20(金) 19:43:16.98ID:???
$results = $Model->find('threaded',$options);

これでツリー式のデータを取得できますが、
それを出力する方法で悩んでます・・。
目的はセレクトメニューのoptionに入れたいのですが、
何か良い参考ページかやり方はないでしょうか?
0802nobodyさん2011/05/20(金) 21:52:34.07ID:???
>>801
セレクトに使う程度ならツリービヘイビアのgeneratetreelist使った方が楽だよ。
0803nobodyさん2011/05/21(土) 00:18:07.82ID:/xyh+Ud4
findでちょっと複雑なこと(と言ってもjoinとかサブクエリ程度)を
しようとすると本当に面倒くさい。
もう面倒だからquery()でSQL直着書きしちゃうんのってアリ?
0804nobodyさん2011/05/21(土) 00:27:59.30ID:???
どの程度の事なのかようわからんけど
ほとんどはcontainableビヘイビア使ってなんとかなってるけどなー
0805nobodyさん2011/05/21(土) 00:38:09.14ID:???
>>803
検索オンリーならDBにビュー作ったらいいよ
0806nobodyさん2011/05/21(土) 03:26:01.22ID:???
DBにビューってなんだ?
0807nobodyさん2011/05/21(土) 10:05:49.32ID:???
データが決まっているなら、CREATE VIEWしてそれをfindした方が早いと言っているのでは。
0808nobodyさん2011/05/21(土) 10:10:24.97ID:???
それすら知らなかったんだろ
0809nobodyさん2011/05/21(土) 10:54:51.77ID:???
cakephp2.0ってphp5.3にちゃんと対応してる?いつでんの?
0810nobodyさん2011/05/21(土) 11:27:17.26ID:/xyh+Ud4
CakePHP1.3.7使ってるんだけど
Model::execute()って無くなってない?
PDTの候補にも出てこないし実際に無いし。
0811nobodyさん2011/05/21(土) 15:28:04.45ID:???
>>810
executeは1.2で無くなったっぽいよ。
互換性のためにメソッドは最近まで残してあったのかも知れないけど。
0812nobodyさん2011/05/21(土) 15:29:00.87ID:???
CakePHPは終わコン
0813nobodyさん2011/05/21(土) 16:40:27.40ID:???
始じコンは何?
0814nobodyさん2011/05/21(土) 16:55:05.99ID:???
今後はなんでもJavaScriptで組まれるようになるよ
0815nobodyさん2011/05/21(土) 17:51:36.10ID:???
設計が良いCodeIgniterが始まってます数年立てば日本での立場は変わってくるよ
0816nobodyさん2011/05/21(土) 17:57:45.07ID:???
サーバサイドJSってやつか。面白そうだね。
0817nobodyさん2011/05/21(土) 18:01:52.25ID:???
CodeIgniterは情報が足りなすぎる。数年も待てない。
0818nobodyさん2011/05/21(土) 18:13:46.50ID:???
あれほど分かりやすいマニュアルはないない
0819nobodyさん2011/05/21(土) 20:14:04.70ID:???
Cakeのマニュアルよりマシなんじゃないの
Cakeのは簡潔すぎてマニュアルになってない
0820nobodyさん2011/05/21(土) 20:56:37.13ID:???
情報=マニュアルじゃなくて、使ってる人の事ね
0821nobodyさん2011/05/22(日) 01:47:54.93ID:???
なんか本とかWebも1.2の情報がベースで1.3の情報少ないよね。
非常に困る。で、1.3の本が出始める頃には2.0が出てると。
0822nobodyさん2011/05/22(日) 10:12:56.86ID:???
DooPHPはどうよ?
0823nobodyさん2011/05/22(日) 11:07:44.09ID:???
>>822
リファレンス本が欲しいんだよね。
CakePHPポケットリファレンスが1.2までにしか
対応してないのでほぼ使えない状態となってるのが悲しい。
0824nobodyさん2011/05/22(日) 11:09:24.79ID:???
>>814
デバッグがしにくいのと、変数の型がPHPよりも自由すぎるのが非常に気になる。
0825nobodyさん2011/05/22(日) 12:27:21.45ID:???
>>822
使ってるよ
CIよりは速度は遅いけどCakeよりは十分使える
0826nobodyさん2011/05/22(日) 13:03:28.19ID:???
>>822
DooPHPで作られたサンプル的なサイト
ttp://sagasunippon.com/
ttp://www.kensakunippon.com/
0827nobodyさん2011/05/22(日) 20:54:14.59ID:???
そういや、なんで findAll() って無くなったの?
findAllBy() は残ってるのに
0828nobodyさん2011/05/22(日) 21:47:10.29ID:???
まあなんでもかんでもfindAllするバカが多かったので廃止したんじゃないかね。
0829nobodyさん2011/05/22(日) 22:05:40.93ID:???
>>827
find('all')に統合した方がきれいだし、拡張性も高い。
findAllByは特殊な呼び出し方だからどうしようもないでしょ。
0830nobodyさん2011/05/23(月) 03:09:25.12ID:???
Cakeを使い始めの頃、1.2と1.3の違いを知らずに
ぐぐってfindAllを使って動かなくて困ったのも良い思い出
いや良くない思い出、マジ困るんですけど
0831nobodyさん2011/05/23(月) 03:20:06.75ID:???
MySQL の tinyint(1) を booleanとして使ってて、
毎回PHP側で判断するときに
(int)$hoge === 1
みたいに毎回intに変換して判断してるんだけどしょうがないのかな?
0832nobodyさん2011/05/23(月) 03:41:29.44ID:???
tinyintじゃなくて、smallintの方が良いよ
0833nobodyさん2011/05/23(月) 19:43:00.12ID:???
複数のモデルに共通する hasMany 設定をビヘイビアで設定しようと思い、setupメソッドに
$model->hasMany = array(...);
としたんですが以下のエラーがでます。
Notice (8): Trying to get property of non-object [CORE/cake/libs/model/datasources/dbo_source.php, line 813]
Notice (8): Trying to get property of non-object [CORE/cake/libs/model/datasources/dbo_source.php, line 838]
Notice (8): Trying to get property of non-object [CORE/cake/libs/model/datasources/dbo_source.php, line 841]
Fatal Error (256): ConnectionManager::getDataSource - Non-existent data source [CORE/cake/libs/model/connection_manager.php, line 102]
ビヘイビア内で hasMany などアソシエーションを設定する方法はないでしょうか?
0834nobodyさん2011/05/23(月) 20:47:58.20ID:???
>>833
$model->bindModel()で出来ると思う。
0835nobodyさん2011/05/23(月) 22:45:34.44ID:???
>>831
tinyintはもし何かの拡張で値が増えた場合小さくて不安になる
0836nobodyさん2011/05/24(火) 06:31:50.22ID:???
コントローラAで、コントローラBのメソッドを使いたいときどうしたらいいんだ?
同じコントローラなら $this->setAction でいけるんだけどな。

なぜこれがやりたいかと言うと、
あるコントローラから、別コントローラのアクションにリダイレクトさせたいんだけど、
変数の値も渡したい。
ただリダイレクトさせると変数が渡らないので、
リダイレクトじゃない方法があれば解決するはずなんだけど、無いのかな?
0837nobodyさん2011/05/24(火) 07:45:58.57ID:???
共通関数作ってオブジェクトで値渡せばいいのでは?
0838nobodyさん2011/05/24(火) 08:14:08.18ID:???
まぁやろうと思えばできるんだけど、
Cake Wayなものがあればいいなと思って聞いたんだ。

別コントローラに行くときにメッセージをビューで表示したい場合とかどうやってるんだろみんな
結構出てくるケースだと思うんだが・・・
0839nobodyさん2011/05/24(火) 11:16:00.88ID:???
ビューに表示ならヘルパーで良いじゃん
0840nobodyさん2011/05/25(水) 08:16:55.25ID:???
>>839

class AController extends AppController {
  function add() {
    $this->A->save()
    $this->redirect('B/view');
  }
}

↓AからBへリダイレクトする

class AController extends AppController {
  function view() {
$this->set('finish_message', $finishMessage);
  }
}

こんな感じで、AからBへリダイレクトするときに、Aから何らかのメッセージを渡したいんだ。
0841nobodyさん2011/05/25(水) 10:50:36.15ID:???
>>840
それならセッション使えよ
0842nobodyさん2011/05/25(水) 15:24:22.82ID:???
>>841
その手があった
サンクス!
0843nobodyさん2011/05/25(水) 16:27:17.78ID:???
いいってことよ!
0844nobodyさん2011/05/25(水) 16:42:33.67ID:???
>>843
誰だよ?
0845nobodyさん2011/05/26(木) 14:00:39.30ID:???
$this->Html->link( 'xxx', array('controller' => 'aaa', 'action' => 'bbb' ) );
で生成されるURL
http://www.example.com/aaa/bbb
を文字列として取得するにはどうすればいいのでしょう?
viewの他のか所で使いたいのですが
0846nobodyさん2011/05/26(木) 14:05:50.45ID:???
>>845
わかりました
$this->Html->url
ですね
失礼しました...
0847nobodyさん2011/05/26(木) 17:50:19.36ID:???
Authを使ったパスワードをmd5に変更したいのでマニュアルを見たのですが、
「Security::setHash('md5');」と設定しろとありました。

これってどこに書くのでしょうか?
0848nobodyさん2011/05/27(金) 12:07:32.90ID:???
どこでもおk。
before_filter()
app_controller.php
bootstrap.php
などなど
0849nobodyさん2011/05/27(金) 12:43:14.79ID:???
うちは
>app_controller.php
ここ
0850nobodyさん2011/05/28(土) 04:39:15.80ID:???
DBに画像保存先のパスを保存するために、
/img/user/01234.png
↑こういう風にCake風のパスを格納した場合、
どうやって絶対パスを取得できる?

上記のパスを、
Router::url($path, true);
このように Router::url に渡すと、
http:://localhost/img/user/01234.png
と取得される。
こんなディレクトリは存在しなくて、
本当は、
http:://localhost/myapp/img/user/01234.png
↑このような値が欲しい。
どうしたらいいかな?

絶対パスをDBに入れるのはあんまりしたくない。
ディレクトリが移動したときやCakeアプリケーションいれているディレクトリ名が変わったり、
ドメインが変わったり、、、などなど不都合が出る可能性が高い
0851nobodyさん2011/05/28(土) 12:01:51.80ID:???
CakePHPでCSRF対策ってSecurityコンポーネント使うのがスタンダード?
ちょっと使ってみた感じ使いにくかったような気がしたんだけど。
ググると自作してる人もいたりするんだよね。
0852nobodyさん2011/05/28(土) 12:17:08.98ID:???
ダブルコロン
0853nobodyさん2011/05/28(土) 14:26:11.69ID:???
>>851
普通にデフォルトで出力される部分はエスケープされるんじゃないの?
0854 忍法帖【Lv=30,xxxPT】 2011/05/28(土) 15:37:39.07ID:???
>>850
ttp://book.cakephp.org/ja/view/122/コア定義定数
あと一回くらいは主要なインスタンスでdebug($this)を見ておいた方がいいかも。
0855nobodyさん2011/05/28(土) 21:18:38.09ID:???
CakeってSQLの特殊文字って自動的にエスケープされるよね?
0856nobodyさん2011/05/28(土) 21:28:17.89ID:???
アスタリスク(*)やクエスチョンマーク(?)のこと?
やってくれてるはずだよ
0857nobodyさん2011/05/29(日) 13:39:00.49ID:???
もの凄いくだ質なんだけど、、、

$data = $this->User->findById(1);

こういう時の返り値を受け取る変数ってどうしてる?
上の例なら普通に$dataに入れればいいけど、
モデルが複数ある場合とかさどう書いてるのかな?と思ってさ。
$category_data = $this->Category->findById(1);
というのもなんか違う気がするし・・・
0858nobodyさん2011/05/29(日) 14:31:32.78ID:???
$user = $this->User->findById(1);
$users = $this->User->find('all');
$category = $this->Category->findById(1);
$categories = $this->Category->find('all');
0859nobodyさん2011/05/29(日) 17:28:32.40ID:???
>>858
俺もこれで良いと思う事はあるんだが、出力時に

$user['User']['name']
$categories[0]['Category']['name']

みたいになるわけだろ?
「ユーザにユーザ?」みたいな重複した無駄な間隔に襲われるんだよw
0860nobodyさん2011/05/29(日) 17:37:40.66ID:???
まぁ、フレームワークなんてどれもそんなもんだろ
無駄でも分かりにくいより分かりやすいほうが良い
0861nobodyさん2011/05/31(火) 17:12:52.71ID:???
今までindex.htmlのファイルにアクセスされていたのですが、
Cakeに移行したのでindex.phpにアクセスになります。

ただ、以前のURLでアクセスされた場合、ページが表示されなくなります。
index.htmlのファイルを作ってMETAで転送を入れようと思ったのですが、
それも無理でした。何か良い対策方法はないでしょうか?
0862nobodyさん2011/05/31(火) 19:12:25.36ID:???
CakePHP使える人って、人月いくらくらいで雇えるもの?
CakePHPでの経験が1年以上という前提で。
0863nobodyさん2011/05/31(火) 22:08:53.60ID:???
マジレスで20万は必要だと思います。
0864nobodyさん2011/05/31(火) 22:12:31.14ID:???
>>863
本気の話、50万出せば結構集まります?
0865nobodyさん2011/05/31(火) 22:48:09.71ID:???
>>864
お願いします。
0866nobodyさん2011/05/31(火) 23:05:32.79ID:???
>>864
冗談じゃなければ集まると思いますよ。
それぐらいだせば、PHPの経験5年以上、Cake3年以上は見つかると思います。
0867nobodyさん2011/06/01(水) 01:39:23.19ID:???
>>866
まじですか。募集に向いたサイト、是非教えてください。
0868nobodyさん2011/06/01(水) 10:36:35.25ID:???
ハローワーク
0869nobodyさん2011/06/01(水) 14:03:38.11ID:???
>>867
俺がやるよ
0870nobodyさん2011/06/01(水) 14:16:33.47ID:???
1週間雇われて捨てられるのがオチ
0871nobodyさん2011/06/01(水) 17:57:54.98ID:???
1週間50万なら捨てられても問題ないな
0872nobodyさん2011/06/01(水) 18:00:00.20ID:???
集まった人数で50万山分けだ!
0873nobodyさん2011/06/02(木) 09:36:07.69ID:???
>>864
派遣業者を通さずに?
よろこんで
0874nobodyさん2011/06/02(木) 10:50:55.22ID:???
業者を通すと20万になります
0875nobodyさん2011/06/02(木) 12:25:11.52ID:???
俺ならその20万をもらってマッチングサイトに10万で流す
0876nobodyさん2011/06/02(木) 13:12:15.25ID:???
俺、人月80万だけど50万とかありえるの?
0877nobodyさん2011/06/02(木) 13:22:05.78ID:???
メルアドさらしてくれれば、詳細送ります
0878nobodyさん2011/06/02(木) 18:43:49.24ID:???
ガチでぐるなびレベルのサイトをCakeで半年かけて作った


50万だった・・・
0879nobodyさん2011/06/03(金) 13:08:01.66ID:???
実働
半年?
0880nobodyさん2011/06/03(金) 13:14:29.51ID:???
実働
0881nobodyさん2011/06/04(土) 18:26:58.34ID:+J1aexiq
CakeのViewヘルパー内で$this->Session->writeしたいんですけど
やろうとするとエラーになってしまいます。
やり方があるのでしょうか?
■ このスレッドは過去ログ倉庫に格納されています