【PHP】フレームワーク CakePHP 3ホール目【本命】
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2008/03/14(金) 15:16:00ID:HF9x5ODX10分で作るCakePHPアプリ for Windows
http://p4life.jp/cake/
マニュアル日本語化
http://www.cakephp.jp/doc/
日本語フォーラム
http://cakephp.jp/modules/newbb/
あとこのへんとか(初心者向けTIPS)
http://www.avatarfinancial.com/pages/cake/
CakePHP入門リンク集
ttp://pub.studio15.jp/2007/11/13/cakephp-links/
【PHP】フレームワーク CakePHP 2ホール目
http://pc11.2ch.net/test/read.cgi/php/1194976228/
【PHP】フレームワーク CakePHP
http://pc11.2ch.net/test/read.cgi/php/1163850802/
0705697
2008/04/18(金) 21:22:22ID:???これは取り出した後で、PHPのcount関数で配列の要素数をカウント、ということでしょうか?
そうではなくて、
たとえばfindAllするときに取得順などにHasManyModelのカウント数を使いたいのですが。
質問の文章がわかりづらくて申し訳ありません;
よろしくお願いします。
0707697
2008/04/18(金) 21:47:07ID:???やはりそうですか;
せっかくフレームワークを使っているのでできればクエリは書きたくないですね・・・
UsersをPostsの多い順に並べ替える、など、結構よく登場すると思うのですが;
0708nobodyさん
2008/04/19(土) 01:00:18ID:???やってないけど、これは、findAllの条件にexistsなんたらって書いて
countだせばいいとだろうから、一応findAllは使えるな。
半分ぐらいしか意味ないけど。
0709nobodyさん
2008/04/19(土) 01:16:45ID:???それか、1回データを取り出した後で件数をキーにした連想配列に入れかえるのはどうでしょうか。
配列の添え字を、
$array[$count .' - ' .$id]
こんな感じにして配列をソートしたら出来そうですが。
0710nobodyさん
2008/04/19(土) 10:26:43ID:???> UsersをPostsの多い順に並べ替える、など、結構よく登場すると思うのですが;
ちょうど同じような事例を考えていた。
顧客とその顧客の取引データが一対多でつながっている場合に
取引が多い顧客を見たいと。
で、いろいろ考えたんだが、顧客数や取引が多くなると重くなりそうなので、
(だって内部的には顧客ごとにデータ数えて、その数でソートするんだろう!?)
非正規化することになるが、顧客データの中に取引数フィールドを作ることにした。
あとは取引データ保存時、つまりモデルのafterSave時に、
顧客テーブルの取引数フィールドをいじればいいと。
フレームワークを使っているとこういうトリガー的なことを
データベースに依存せずにやれるから良いね。
0711697
2008/04/19(土) 11:37:16ID:???奇遇です!
なるほど・・・あえて非正規化する、と。
手元にある参考書に
「処理効率を考えて、あえて非正規化することもある」
と書いてあった意味がわかりました。
たしかに、毎回自分でクエリ書くのに比べたら、
冗長なデータを持っておくくらい、なんてことないですね!
目からウロコでした!
0712nobodyさん
2008/04/19(土) 11:39:14ID:???0714nobodyさん
2008/04/19(土) 12:22:29ID:???0715nobodyさん
2008/04/19(土) 12:31:41ID:???function index() {
$data = "テスト";
$this->set('data', $data);
}
とやっただけで
Allowed memory size of xxx bytes exhausted ...
が出てしまいます;
CakePHP叩きではなく、本当に困っています。
対処法を教えてください。
0716nobodyさん
2008/04/19(土) 12:38:01ID:???その程度のコードで、そのエラーが出るときは、
基本的にバグだと思ったほうが良い。
まあ環境のせいもあるからとりあえず聞くけど、
OSとPHPのバージョンと、php.iniの設定(もしくはini_get('memory_limit'))の値)
function index() {
echo 'aaa';exit;
}
とやるとどうなるか。
index()以外のコードはどうなっているか。
0718715
2008/04/19(土) 12:47:34ID:???レスありがとうございます。
どうやらbakeで生成したビューをそのまま使っていたことが原因だったようです;
スレを汚してしまってすみません;;
0720nobodyさん
2008/04/19(土) 14:35:19ID:???依存PEARがうまく発見できないのですが、
どうすればよいのでしょうか?
php.iniのinclude_pathには
app/vendorsを追加してあります。
0721nobodyさん
2008/04/19(土) 17:44:54ID:???> じゃファイルベースでやりゃいいじゃん。やらない理由は?
フレームワークがファイルベースに対応していないから。
(読み書きできないということではなく、モデルが対応していないということ)
0722720
2008/04/19(土) 18:05:22ID:???事故解決しました。
0723nobodyさん
2008/04/19(土) 19:37:01ID:???ユーザが自由に選択することもできないってこと?
強制的にDB使用?
CakePHP糞FWすぎるwwwww
0724nobodyさん
2008/04/19(土) 20:20:16ID:???CakePHPで作られてるサイトで有名なところを見てみたいのですが、
教えていただけませんか?
たしかNiftyのなんかがCakeだと聞きましたが・・・
0725nobodyさん
2008/04/19(土) 21:00:48ID:???0726nobodyさん
2008/04/19(土) 23:46:04ID:???君頭大丈夫かね?
CakePHPは別にデータベースを使用する必要は無い。
ただデータベースを使ったほうが効率がいいだけだ。
それがファイルベースでやらない理由。
どうやら君は素人なのだろう。
0727nobodyさん
2008/04/20(日) 00:01:18ID:???非正規化は、一般的な業務システムでもよくやるな。
ただ、明らかに正規化をさぼってて、テーブルのカラム数が100個超えているのを
「性能を考えて非正規化している」と言い張る人はカンベンしてほしい。
あぁごめん。cakePHPの話から逸脱した。
>>723
どこか忘れたけど、コントローラあたりの設定で、DBを使わないようにもできたはず。
だれか補足頼むw
特殊な使い方でもしない限り、あんましメリットはなさそうだね。
0729nobodyさん
2008/04/20(日) 00:33:33ID:???0730nobodyさん
2008/04/20(日) 00:34:22ID:???CakePHPの方が実用的に見て優れているな。
0732nobodyさん
2008/04/20(日) 01:31:23ID:???だからDB使わない事もできるって。
デフォルト設定がDB使用になってるだけで、全然強制じゃない。
ttp://www.1x1.jp/blog/2007/08/cakephp_no_db.html
ファイルベースの設定方法は、わざわざ書かなくてもいいよね?
>730
CodeIgnitorを使いたい人は使えばいいし、CakePHPを使いたい人は
使えばいいし、それだけの事。
CodeIgnitorは機能が少ない分、実装がシンプルで軽いのが特徴なんだから、
機能的に足りていれば、そっちでもいいでしょ。
0733nobodyさん
2008/04/20(日) 01:35:00ID:???0734nobodyさん
2008/04/21(月) 16:11:05ID:Hc1e0Bqc俺のコードに問題がある可能性もあり。
1.2.0.6311-beta のデフォルトのセッション管理(ファイルベース?)
Configure::write('Session.save', 'cake');
のとき、同時に複数のアクセスがあるとロックされるかもしれない。
つまり、一つの目のアクセスで長い処理を行っていると
二つ目のアクセスがロックされ一つ目が終わるまで実行されない。
Session->read()で待たされる。
Configure::write('Session.save', 'database');にして
DBベースのセッションにするととりあえず回避できる。
関係ないとは思うがPostgreSQLの場合。
0735nobodyさん
2008/04/21(月) 16:34:17ID:???0736734
2008/04/21(月) 19:37:53ID:???アクセスしたユーザーはロックされるが
他の人(ようするにセッションファイルが違う人)は
ロックされないようだ
0737nobodyさん
2008/04/22(火) 13:08:38ID:???bakeで作ったコントローラをみると
$this->Session->setFlash(__('hogehoge.', true));
のようなコードがありますが
この__() や後ろのtrueは何を意味しているのでしょうか?
もしかするとcakePHPに限ったことではないかもしれませんが、
よろしくお願いします。
0738nobodyさん
2008/04/22(火) 15:52:58ID:???多言語化機能。
/app/locale/jpn/LC_MESSAGE とその周辺あたりに言語ファイル
.po や .mo を置くと、hogehogeが翻訳される。
多くはビューで使われるため、<?php __('hogehoge') ?> と簡便に書くことが出来るようになっている。
この場合、言語ファイルがあると、hogehogeが翻訳されて”出力”される。
第二引数にtrueを指定すると出力せずに戻り値として返すという意味。
これと似たやり方は、CakePHPだけでなく、PHP以外でも良く使われ
多くは _('hogehoge')という書き方をする。
PHPではgettext関数の別名として_()関数が使用できる。
http://jp.php.net/manual/ja/function.gettext.php
CakePHPではこのやり方を独自に拡張しており、
関数名がアンダーバー二つになっている。
0739nobodyさん
2008/04/22(火) 15:54:09ID:???1.ソースコードやビューの中の翻訳したい文字列を__('hogehoge')という書き方にする。
2.cake i18n extractツールを使うと、ソースコードの中から__()の部分を抽出、.potファイルを生成してくれる。
3.poeditなどのツールを使い、.potファイルを取り込み、.poを作る。
4..poを編集して翻訳リストを作っていく。
5.最後に.poを.moにコンパイルする。.moが最終的な翻訳ファイル。poeditの場合.poを保存したら.moも出来る。
6.新たに単語が増えたときは、2の手順で再度.potファイルを生成する。
7.poeditで今使っている.poに.potファイルを追加取り込みをする。ちゃんと差分だけが取り込まれる。削除された単語も.poファイルに残っている。
8.再度翻訳して保存。.moを作る。
ファイルの意味をまとめると、
.pot・・・単語のリスト(今現在使用している単語を抽出するテキストファイル)
.po・・・作業ファイル(過去に使用して、今は削除している単語の翻訳情報なども残っているテキストファイル)
.mo・・・翻訳ファイル(作業ファイルに残っているいろいろな無駄が取り除かれたバイナリファイル)
※ 実はCakePHPは .mo が無くても .po を直接翻訳ファイルとして使える。
0741737
2008/04/22(火) 18:43:22ID:???丁寧なレスをありがとうございます。
CakePHPにはまだまだ知らない機能があるんですね。
いろいろ楽しみです。
0742737
2008/04/22(火) 18:44:53ID:???マウスオーバーしないようにお願いします;;
0743739
2008/04/22(火) 18:56:32ID:???ドットで始まるファイルではなく、拡張子という意味で書いた。
デフォルトではdefault.poやdefault.mo になる。
それぞれのファイルのdefaultの部分を変更することも可能。
abc.mo の場合、その場合、__d('abc', 'hogehoge') という書き方で
出来ると思うがやったこと無いので/cake/basics.phpでもよんどくれ。
0744新参者
2008/04/23(水) 05:59:57ID:???メニューを選んで、表示し終わる前にサイト内検索する。(Specialofferとか)
http://www.islandcruises.com/
OS: WinXP sp2
Browser: IE7
CPU: Core2 6300
Memory: 2G
Service: xampp
CakePHP 1.2で開発中なので、こういうの見るとビビっちまう・・・
0745744
2008/04/23(水) 06:23:11ID:???キャッシュクリア後とかに、
zeroで検索するとハングしやすい。
firefoxだと大丈夫なので、IE7の仕業くさいな。
調べてくるか・・・
0746702
2008/04/24(木) 18:22:26ID:???の流れから結局、model内でfindAllをオーバライドしてみたがなんかアソシエーション組んでるほかのモデルまで影響しているような気がする・・。
function findAll($conditions=null, $fields=null, $order=null, $limit=null, $page=1, $recursive=null){
if(isset($conditions) && is_array($conditions)){
array_unshift($conditions,"name like '%" . USER_NAME . "%'");
}else{
$conditions = array("name like '%" . USER_NAME . "%'");
}
return parent::findAll($conditions, $fields, $order, $limit, $page, $recursive);
}
0749nobodyさん
2008/04/26(土) 13:26:12ID:???CakePHPの関数とか呼ぶ方法内ですかね?
具体的に言うと、もともとウェブサイトがCMSで構築されており、
新たにCakePHPを使ったウェブシステムを追加したわけですが、
そのCMSのページ上にCakePHPシステムの情報・・・会員ユーザー名などを
表示させたいのです。
0750nobodyさん
2008/04/26(土) 13:30:26ID:???0751nobodyさん
2008/04/26(土) 14:52:38ID:CCA4AGBq0752nobodyさん
2008/04/26(土) 21:38:26ID:Uwx0xpWGネットで検索すると、存在していないcssや画像ファイルがあると消え、
htaccessでの設定で回避できるということだった。
css、画像ファイルのパスと存在が正しいことを確認、
htaccessファイルの設定も修正してみたが、セッションはクリアされたまま。
たすけて。
0753nobodyさん
2008/04/26(土) 22:33:41ID:???CakePHPのバージョンはいくつ?
こんなのがあった。
ttp://cakephp.jp/modules/newbb/viewtopic.php?topic_id=817&forum=9
ちなみに、初めてセッションを使おうといろいろ調べてるんだけど、参考になる
サイトあったら情報きぼう。
とりあえずこのあたりを参照中。
ttp://cakephp.jp/doc/session.html
ttp://d.hatena.ne.jp/hetima/20070116/1168883397
ttp://d.hatena.ne.jp/hetima/20070201/1170313526
ttp://develop.ddo.jp/new-tech/php/framework/cakephp/memo/%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A7%E9%85%8D%E5%88%97%E3%81%AE%E5%88%A9%E7%94%A8%E6%96%B9%E6%B3%95
ttp://sand-man.blog.so-net.ne.jp/2007-06-26-1
0754753
2008/04/26(土) 22:35:08ID:???0755nobodyさん
2008/04/26(土) 22:37:46ID:???えーと、core.phpだっけ? セキュリティレベルを設定するところ。
あそこが一番高いと、接続するたびに、セッションIDが変更される。
だから途中でエラー?とかあると、サーバー側ではセッションIDの情報が変わっているのに
クライアントでは新しいセッションIDをもらきれておらず、セッションIDが切断=クリアされてしまう。
だから俺はセキュリティレベルを中にした。
0756755
2008/04/26(土) 22:41:33ID:???> slywalker 投稿日時: 2007-11-5 12:58
この人と同じこと。
0757nobodyさん
2008/04/26(土) 23:10:06ID:Uwx0xpWGセションをwriteした直後にreadしてみたら、ちゃんと設定されてるのは確認できたんですけどね。
次の画面でreadすると空になってる。ん〜困った。
0758nobodyさん
2008/04/26(土) 23:38:17ID:???セキュリティソフトとか。
0759nobodyさん
2008/04/26(土) 23:42:15ID:???確認するのはあまり意味無いよ。
なぜなら、情報が実際にセットされるのは
ブラウザにクッキー情報が返ってからだから。
ieHTTPHeadersやLive Http headers
ブラウザのクッキー情報を見るツールを使って
調べてみよう。
0760nobodyさん
2008/04/27(日) 00:07:57ID:???自分の使い方の問題もあるだろうけど、databaseがなんかうまくいかなかった。
0761nobodyさん
2008/04/27(日) 00:41:14ID:DD3/O3h6いま↓を見てるんだけど、aタグによるリンクで画面遷移させるので、
セッションIDを付加しないといけないことがわかった。
ttp://cakephp.jp/modules/newbb/viewtopic.php?topic_id=840&forum=3&post_id=1579
これからやってみます。
0762nobodyさん
2008/04/27(日) 02:40:18ID:???sqlのCASEはquery対処なんかなあ。$optionsでいけたりする?
0763761
2008/04/28(月) 00:00:23ID:???URLにセッションIDを付加する方法でやるしかない。
PCサイトの場合は、セッションハイジャックの危険性があるからURLへのセッションID付加は使えない。
結局、セッションを使わずcookieで運用する方法で実装しました。
本来の意味でのセッションではなく、単なるデータの引き継ぎ用途なので、cookieでよいかと。
0764nobodyさん
2008/04/28(月) 20:32:23ID:???ttp://pc11.2ch.net/test/read.cgi/php/1207863515/236-249
0765nobodyさん
2008/04/29(火) 00:30:20ID:???0766nobodyさん
2008/04/29(火) 00:50:53ID:???何かバグにぶち当たったのかもしれんけど、こんな風にいい逃げする
荒らしもいるしなぁ。
本当に困ってるのなら、具体的なバグ例を挙げてみるといいよ。
そしたら対処方法も出るかもしれないし。
話は変わるけど、前のレスでも出てたし、みんな知ってるのかもしれないけど、
このサイトいいね。参考になる。
テンプレに載せてもいいんじゃない?
ttp://bakery.cakephp.org
0767nobodyさん
2008/04/29(火) 02:39:08ID:???宣伝乙^^
0768nobodyさん
2008/05/01(木) 10:47:29ID:oWWm9vMD親のmodifiedを更新したいのですが、どのようにすればいいでしょうか?
子のデータ更新をするcontrollerでいっしょに更新しようとしたのですが、
上手くいきませんでした。
32 function edit($id = null)
33 {
34 $this->Response->id = $id;
35 $thread_id = $this->Response->field('thread_id');
36
37 if ($this->Response->saveField('cooking_name',$this->data['Response']['cooking_name']))
38 {
39 $this->Thread->saveField('modified',$this->data['Response']['modified']);
40 $this->redirect( '/responses/view/'. $thread_id . '#' . $id);
41 }
42 }
modelはこの通りです。
7 var $belongsTo = array('Thread' =>
8 array('className' => 'Thread',
9 'conditions' => '',
10 'order' => '',
11 'foreignKey' => 'thread_id'));
0771768
2008/05/02(金) 02:37:54ID:???39行の手前で、親の方にidを設定したところ、きちんと更新されました。
$this->Thread->id = $thread_id;
0773nobodyさん
2008/05/07(水) 00:15:31ID:ehDEto56展開したいのですが、どうすればいいでしょうか?
対応するコントローラもなさそうだし・・・。
0775773
2008/05/07(水) 00:29:55ID:???というと、複数のviewで使いたい場合は、各コントローラ、各アクションで
setするという事でしょうか?
あるいは、全てのコントローラの前に読み込まれる、共通コントローラみたいのが
あったりするのでしょうか。
0777nobodyさん
2008/05/07(水) 14:32:05ID:???0779773
2008/05/08(木) 01:09:40ID:???requestActionで取得する事にしました。
http://cakephp.jp/doc/ch07s02.html
/views/layouts/default.thtml
<?php echo $this->set('users', $this->requestAction('/users/getUserList'), array('return')); ?>
<p><?php $user_numbert = array_rand($this->viewVars['users']);
echo $this->viewVars['users'][$user_numbert]['User']['name']; ?></p>
0781nobodyさん
2008/05/08(木) 09:23:20ID:???function beforeRender() {
# ここに/users/getUserListの中身とかを
$this->set('user_numbert' , $user_numbert);
}
default.thtml
<?php e(h($user_numbert['User']['name'])) ?>
0782nobodyさん
2008/05/08(木) 09:34:15ID:???0783nobodyさん
2008/05/08(木) 19:24:13ID:???フォームの画面遷移のときのデータの持ち回り方について・・・
1.普通にhiddenで埋め込む
2.serializeしてbase64_encodeしたものをhiddenで埋め込む
3.serializeしてbase64_encodeしたものをセッションに書き込む
などが考えられますが、
CakePHP的には、どの方法がベターでしょうか?
0784773
2008/05/09(金) 01:55:42ID:???じゃないや、スマートな実装ができました。
どうもありがとうございました。
0787783
2008/05/09(金) 18:55:31ID:???すみません。よくわからないで書いてしまいました;;
シリアライズだけで十分ですか?
>>786
最終的にsaveするまえにしっかりバリデートすれば、それでも問題ないのかもしれませんね・・・
でもやっぱりソース見たときに、パスワードとかメールアドレスがもろに書いてあると、
このサイト大丈夫か??って気になりますが・・・
ちょっと気になったのですが、PEARのHTML_QuickForm_Controllerなんかは
どの方法なんでしょうか??
0788nobodyさん
2008/05/09(金) 20:19:38ID:???不満を言う余裕はあるくせに
戦争する暇もある
0789nobodyさん
2008/05/10(土) 00:11:55ID:???ソース見られたらっていうのは確かにある。
しかもそれを無理矢理改ざんして入力不可の文字を入力される可能性もある。
しかし、よほどのサイトじゃないとそこまでハッカーも暇じゃないから攻撃しないのでは?
と思います。
現に、ここ 5年ほど、何も問題ありませんでした。
0791nobodyさん
2008/05/10(土) 17:55:53ID:???セキュリティ目的ならbase64_encodeは用をなさないという認識。
>>789
データはhiddenで埋め込んでおいて、$this->dataをserialize後saltつけてハッシュ化したやつを別でhiddenに埋め込む
↑のふたつを比較して整合性チェックとか?
0792nobodyさん
2008/05/10(土) 18:59:59ID:???ばれてるぞ!
0793nobodyさん
2008/05/10(土) 19:29:59ID:???0794nobodyさん
2008/05/11(日) 11:28:50ID:qWqUPYxDと言いつつ、いつもこっちに書くのだけど・・・。
下の記事を参考に、携帯用ページを作っています。
ttp://www.1x1.jp/blog/2008/04/cakephp_12_routing_prefix.html
で、paginateでページングされているのですが、ひとつ問題が。
pagineateの結果、下のようにURLが生成されるのですが、
携帯エミュレータ(P1エミュレータを使用)で確認したところ、
どうやら「page:2」のセミコロンが、有効な値ではないとエラーになるっぽいです。
<a href="/~recipe/m/responses/view/page:2">2</a>
これって、どう対応すればいいのでしょう?
0795nobodyさん
2008/05/11(日) 12:01:33ID:???0796794
2008/05/11(日) 13:42:34ID:???Router::connectですね。
ふぉぉ、すぐに答えていただきありがとうございます!
PC側の方もちょっと調整が入りますが、おかげで解決しました!
0797nobodyさん
2008/05/12(月) 02:29:40ID:8yg2YXGeバリデーションルールが多様になったほかに、create時update時それぞれに有効無効に
できるなんてこと知ったのだけど、その他含めてちゃんとまとまった情報ってないかな
0798nobodyさん
2008/05/12(月) 18:22:39ID:???たとえば、
ログイン後にユーザーメニューからユーザ名の変更などを行った場合、
セッションには変更前のユーザ名が格納されているため、
ヘッダーなどに表示されている
「ようこそxxさん」のような表示が変わらない、ということになってしまいます。
いちおうの解決策としては、
セッションにはIDのみを格納しておいて、
app_controllerで
毎回、$this->User->findByIdしてセッションに記憶させるという方法をとっていますが、
あまりスマートではありません;
ユーザ名の変更処理の直後のみユーザ情報を取得しなおしたいのですが、
なにかよいアイデアはないでしょうか?
0800nobodyさん
2008/05/12(月) 22:27:51ID:???DBからデータをviewで表示するだけなら1.2でも大丈夫かな?
現在は1.1で運用中。
多言語対応が1.2でやりやすいのなら、1.2で作りかえるんだけど。
0801nobodyさん
2008/05/12(月) 22:35:05ID:???俺はやっちゃったw
半年ぐらいCakePHP使っていて、コアの中まで見てると
大丈夫なんじゃないかなぁと思う。
バグではないが、ベータ版だから仕様が変わるのが
ちょっとネック。
0802794
2008/05/13(火) 00:21:01ID:???いま、2ちゃんねるのレシピ集のサイトをCakePHP1.2で作ってます。
paginatorなどが使いたかったのと、バグっても差し支えないので。
で、ひとつバグらしきのに当たりました。
先に書いた通りのページを参考に、URLルーティングのprefixを使って
携帯用とPC用のページを作り分けしたのですが、この状態でpaginatorを使うと、
PC側のページで、$paginator->prev、nextで何故か携帯用のURL
(/m/:controller・・・)へ飛ばされる事象が。
prefixを設定する前は発生していませんでした。
原因は不明ですが、これまた何故か$paginator->optionsの設定次第で
事象が発生したりしなかったりするので、発生したPC用ぺージでは、
$paginator->options(array('url'=>array("test" => 'test')))
と、ダミーのURLオプションを追加してごまかしています。
0803nobodyさん
2008/05/13(火) 02:42:36ID:???乗り換えるべきかどうか迷う・・・
0804nobodyさん
2008/05/13(火) 13:48:12ID:???cakephp 1.1 も 1.2 も両方開発してアップしてますけど両方問題ないですよ。
ただ、モバイルサイトも作ろうと思えば 1.1 の wevservices が便利です。
■ このスレッドは過去ログ倉庫に格納されています