【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
0717nobodyさん
2010/09/29(水) 09:13:10ID:???うーん。多分そういう用途じゃないよ
前者はcounterCacheという機能を使って予め親モデルに書き込んでおくようにする
バーチャルフィールドは郵便番号の上3桁と下4桁を別のフィールドで持っている場合とかに、あたかもひとつのフィールドとして扱いたい場合に使うためにある
氏名を分割していたりとか
0718nobodyさん
2010/09/29(水) 09:49:52ID:???なるほど。と言う事は、716的な用途の場合は、
パラメーターにjoinsを指定して、直接SQLを書く方が良いですね。
0719nobodyさん
2010/09/29(水) 11:46:35ID:???date_format(created,"%Y年%m月%d日") みたいな。
0720nobodyさん
2010/09/29(水) 13:02:49ID:???俺が試した限りでは無理だった
0721nobodyさん
2010/09/29(水) 14:14:46ID:???0722nobodyさん
2010/09/29(水) 14:54:21ID:???0723nobodyさん
2010/09/29(水) 16:54:29ID:???var $virtualFields = array(
'order_num' => 'COUNT(Order.user_id)',
);
コントローラーのfindを
$params = array(
'conditions' => array('order_num' => 1),
'group' => array('User.id',),
);
$data = $this->User->find('all', $params);
print_r($data);
したんだけど、「SQL Error: 1054: Unknown column 'order_num' in 'where clause'」
ってエラーが出る。conditionsの箇所を削ると表示されるから、
conditionsで検索(where)できないと思ってるんだけど。
0724nobodyさん
2010/09/29(水) 18:00:24ID:???そもそも、コロン区切りパラメータってのが、なんか気持ち悪いんだよなぁ・・・
普通にGETでいいのに。
0725nobodyさん
2010/09/29(水) 18:09:44ID:???namedパラメータの後に?xxx=yyy 形式が俺の中ではベストかと。
まあURLがちょっとあれだけど。
paginatorで無理しなくてそのまま使えるし、
検索キーワードなどでnamedで通せないものもgetのパラメーターで通せるし。
0726725
2010/09/29(水) 18:19:31ID:???Getのパラメーター部分がキャッシュのファイル名に入ってくれないからキャッシュ生成が無理。
別の話だけど、Searchプラグインなんかだと、packで文字列生成してnamedパラメーターを通すようにしてるけど
これだと本当にURLが意味不明の文字になってしまうから使いどころにはちょっと悩むね。
0727724
2010/09/30(木) 05:53:30ID:???それはさすがに気持ち悪いなぁ。
かといって、検索条件をセッションに入れちゃうと、
たとえばカテゴリ別のリンクとかが作れなくなっちゃうし・・・
あと、複数カテゴリを指定しての検索とかってよくあると思うけど、
namedは配列を扱えないらしい。
http://cakephp.jp/modules/newbb/viewtopic.php?topic_id=1925&forum=3
うーん、悩む・・・
0728nobodyさん
2010/09/30(木) 08:51:07ID:???ログイン後にしばらくしたら自動でログアウト状態になるんだけど、
ブラウザのリクエストが無いとセッションが自動で切れるのって仕様?
0729nobodyさん
2010/09/30(木) 08:53:03ID:???やっぱり勝手に切れる。どういうことだろ?
0730nobodyさん
2010/09/30(木) 10:37:41ID:???本来はModelに持たせたいなーとか。思ったりするのだけど。
0731nobodyさん
2010/09/30(木) 11:21:51ID:???ってのが目的だから別に良いと思うけど。
0733nobodyさん
2010/10/01(金) 02:05:57ID:???テンプレートの修正はCakePHP方式にするかSmartyにするか延々悩んでる。
テストしてもどちらが良いか悪いか判断付かない。
Smarty編集出来るような人はPHPも使えるだろうから、
別にCakePHPのソースを編集する形でも良いのかな。
0734nobodyさん
2010/10/02(土) 19:47:36ID:???HTMLヘルパーでリンクを張るとき
echo $this->Html->link("あいうえお", array('action'=>'read', 'url'=>$url));
として、
http://localhost/controller/read/url:http://www.yahoo.co.jp
と出力させたいのですが、
http://localhost/controller/read/url:http:/www.yahoo.co.jp
となってしまいます。パラメータとしている値の「//」が「/」とエスケープされてるようなんですが、
どうすればいいかご存知のかたはいませんか。
0735nobodyさん
2010/10/02(土) 21:33:56ID:???スラッシュがエスケープされてしまうなら、単純に
$url = 'http:////www.yahoo.co.jp';
と、2重に書けばいいのでは。
ただ、このままだとコントローラで
$this->passedArgs['url']
で取り出される値は、『http:』のみになってしまいます。
スラッシュは、パラメータの値として判断してくれないんです。
ですから、
$url = 'http://www.yahoo.co.jp';
echo $html->link('あいうえお', "{$this->webroot}hoge/read?url=$url");
としてはどうでしょう?
コントローラでは、
$this->params['url']['url']
で、URLを欠けることなく取り出すことができます。
もしも、URLのパラメータをページングでも保持しておきたい場合は、
url:http://www...
の形にせざるをえません。
その場合、スラッシュを別の文字に一時的に置き換える処理を独自に
作る必要があると思います。
例えば、僕はスラッシュを『~!』に変換しています。
詳しいことは下記に書いてますので、734がページングを使いたいと
思っているのなら参考にしてください。
http://d.hatena.ne.jp/sutara_lumpur/20100829/1283074357
0736nobodyさん
2010/10/03(日) 04:02:29ID:???http://www.moongift.jp/2010/08/listter/
0737nobodyさん
2010/10/03(日) 14:37:31ID:???どうすればいいのでしょうか?
コントローラ内で$header = $this->element('header')としても駄目でした。
0738nobodyさん
2010/10/04(月) 16:30:37ID:???example.com/index/index/
↓
views/index-index.ctpを見る
ディレクトリで分ける方法だと管理が面倒なのでこう出来ればいいなと思いました。
ご教示お願いいたします。
0739nobodyさん
2010/10/05(火) 21:20:28ID:???0740nobodyさん
2010/10/05(火) 22:38:37ID:???向こうの方が丁寧に答えてくれると思う。
0741nobodyさん
2010/10/06(水) 07:02:07ID:???0742nobodyさん
2010/10/06(水) 07:19:30ID:???0744nobodyさん
2010/10/06(水) 07:55:36ID:???MVCのV(ビュー)で使うべきelementをコントローラで使いたいというのが
そもそも間違っていると思いますよ。
プログラムの流れを見なおして、整理してみては?
>>738
質問したいことの意味がよくわかりません。
indexコントローラのindexアクションを呼び出した場合、
app/views/index/index.ctp を参照するのではなく、
app/views/index-index.ctpを参照するようにしたいということでしょうか?
無理だと思います。
おとなしくviewsフォルダの下にindexフォルダを作り、その中に
index.ctpを置くしかないと思います。
…、やっぱり質問はフォーラムに回したほうが、重複も防げていいと思う…。
http://cakephp.jp/modules/newbb/
0746nobodyさん
2010/10/06(水) 10:48:31ID:???http://cakeqs.org/jpn
0747nobodyさん
2010/10/06(水) 13:12:41ID:???回答付く質問はageなくても付く
それくらいの人数のお気に入りには入ってる。ここは
質問時にage出す人がでてきたのもここ2〜3スレくらいでは?
>>745のような人がいるからこのスレはいいよね
0751nobodyさん
2010/10/06(水) 16:51:06ID:???的をはずれた質問は回答つかないことが多いな実際
0752nobodyさん
2010/10/06(水) 16:55:08ID:???0753nobodyさん
2010/10/06(水) 17:17:49ID:???0754nobodyさん
2010/10/06(水) 17:22:55ID:???0755nobodyさん
2010/10/06(水) 17:51:45ID:???暇だからバカのために調べてやったぞ
http://api13.cakephp.org/view_source/view/#line-830
843行目を
$name = $this->viewPath . '-' . Inflector::underscore($name);
で可能。
大人しく、>>745の指示に従うのが賢明だと思うがな。
0756nobodyさん
2010/10/06(水) 18:00:00ID:???0758nobodyさん
2010/10/07(木) 08:49:35ID:???コントローラ内でrenderして変数に入れる。
$this->autoLayout = false;
$header = $this->render('header');
$this->output = "";
outputに出力内容が保存されているから、
それを初期化するのが大事。
0759nobodyさん
2010/10/07(木) 08:52:35ID:???$this->autoLayout = false;
$this->render('header');
$header = $this->output;
$this->output = "";
こうでした。renderしたら、outputに入るから、それを変数に代入するんだった。
0760nobodyさん
2010/10/07(木) 14:07:00ID:???そんな発想無かったから全然分からなかった
せめてもうちょっと一般的なController名にしてくださいorz
0761nobodyさん
2010/10/07(木) 14:27:24ID:???0762nobodyさん
2010/10/08(金) 02:35:30ID:???Authコンポーネントが勝手にpasswordフィールドをハッシュ化するから
validationが効きませんってのは設計ミス以外の何物でもない気がする
0763nobodyさん
2010/10/08(金) 05:46:47ID:???そうか?別フィールドでやれば良いだけだから困ったことないな
まして設計ミスって
何度か仕様変えた結果今のに落ち着いているわけだが
0764nobodyさん
2010/10/08(金) 07:27:01ID:???Authコンポーネントが勝手にセッション切れを起こすのは
設計ミス以外の何者でもない気がする。security.level変えても同じだし。
0765nobodyさん
2010/10/08(金) 09:24:21ID:???0766nobodyさん
2010/10/08(金) 10:19:03ID:???それをさらにforeachで1つの配列に纏めてるのだけど
これをpaginateに組み込む方法ってないですよね
prev nextが使いたいのですが
0767nobodyさん
2010/10/08(金) 11:15:15ID:???素直に自作したらどうだ?
0768nobodyさん
2010/10/08(金) 14:50:51ID:???0769nobodyさん
2010/10/08(金) 16:08:39ID:???766の目的では、一旦DBから抽出したものを加工して、ってことだけど。
0770nobodyさん
2010/10/08(金) 20:16:14ID:???「別フィールドでやる」ってバッドノウハウとしか言いようがなくね?
それで不自由があるかないかと設計の良し悪しはまるで別の要素だと思う。
0771nobodyさん
2010/10/08(金) 20:46:10ID:???paginate() paginateCount()はquery飛ばさなきゃいけないってわけでもないでしょ
0772nobodyさん
2010/10/08(金) 21:13:20ID:???マニュアルにバッドノウハウ書いてあるとか?
暗号化されてないデータをむやみにcontrollerに渡したくないんでしょ
0773nobodyさん
2010/10/08(金) 21:19:28ID:???それがPHPって言語の文化だろって言われたらそれまでだけど。
0775nobodyさん
2010/10/09(土) 14:58:31ID:???リファレンスじゃなくて完全に関数説明だけだった・・・
0778nobodyさん
2010/10/10(日) 11:37:36ID:???0780nobodyさん
2010/10/10(日) 13:50:41ID:???0781nobodyさん
2010/10/10(日) 14:01:37ID:???逆引きリファレンスっぽいのを期待してたんじゃない?
単純に関数の説明だけならcook bookでいいじゃん!ってことかな
0782nobodyさん
2010/10/10(日) 16:26:14ID:???id, name
- posts
id, name
- posts_tags
id, post_id, tag_id
- アソシエーション
Post hasAndBelongsToMany Tag
Tag hasAndBelongsToMany Post
PostsTag belongsTo Post
PostsTag belongsTo Tag
こんな感じのテーブルとアソシエーションで
記事(post)に複数つけられるタグ(tag)の機能を実装すると期待通りに動作します。
ここで例えばタグのうちひとつを代表タグとして扱いたいとします。
そこで以下のようなテーブル変更とアソシエーション追加を試みたのですが
アソシエーションがぶつかって(?)bakeで焼かれたままのコードでも挙動がおかしくなります。
- 変更されたposts
id, name, tag_id (代表タグ用に追加)
- 追加されたアソシエーション
Post belongsTo Tag
Tag hasMany Post
たぶん発想が良くないんだと思いますが、一般的にこのような場合、
どういうアプローチで代表タグ(複数ひもづくタグのうち一つをメインにしたい)
を実装するのがベターでしょうか。
0783nobodyさん
2010/10/10(日) 17:09:24ID:???そう。そういうこと。
俺がこれまで買ってたリファレンス系は、だいたいその仕組みだったからさ。
あと、amazonで買ったから中身見られなかった。
こういう時に、中身検索があれば・・・
0784nobodyさん
2010/10/10(日) 17:17:29ID:???追加するアソシエーションはPost hasOne Tagじゃないかな?
ただ、どっちにしろアソシエーションを複数指定するのは避けられないので、
main_tagsテーブル(id, post_id, tag_id)を作って、Post hasOne MainTag、MainTag belongsTo Tagにすればいいんでない?
あとはtagsテーブルにmain_tag_flagを指定するとか?
0785nobodyさん
2010/10/10(日) 17:17:35ID:???混みいった質問は、フォーラムでするほうがいいんじゃないかな。
この場合は、『モデル』カテゴリかな…。
http://cakephp.jp/modules/newbb/viewforum.php?forum=6
0786nobodyさん
2010/10/11(月) 02:33:23ID:Gg2rGqpO'ModelA'=>array(
'fields'=>array(・,・)),
'ModelB'=>array(
'fields'=>array(・,・)))
てページネーションに複数モデルセットして出しても、なんか知らないがModelBの方のfieldsが効かないんですよ。
Aは効くんだけど。
誰かご存じの方いらっしゃらない?
0787nobodyさん
2010/10/11(月) 13:42:26ID:???$this->paginate('ModelA');
でデータ抽出してるんでしょ?
だったら、ModelA以下の設定しか使われない。
fieldの指定を、ModelA.field とか ModelB.field にしたらいいじゃないかと。
0788nobodyさん
2010/10/11(月) 17:47:31ID:???0789nobodyさん
2010/10/11(月) 17:54:41ID:???0790nobodyさん
2010/10/11(月) 18:07:16ID:???http://username.example.com/ とかできるの?
0791nobodyさん
2010/10/11(月) 18:16:27ID:???0792nobodyさん
2010/10/11(月) 19:17:19ID:???Windows
PHP5.3
cakephp1.3.4
http://localhost/~cakephp/って感じでapacheにuserdirを設定したのですが
cakephpが動かないためcakephpのトップに入っているhtaccessにrewrite base /~cakephp/って設定しました
そしたら動いたんですがこれで合ってますか?
あとサブディレクトリにhtaccessが2つも入ってますがそこにもrewrite base /~cakephp/を入力して何回かアクセスしたらエラーになりました
htaccessって全部修正するのでしょうか?
0793nobodyさん
2010/10/11(月) 20:01:30ID:???右下にCAKEPHP POWERって画像が表示されるんですけど
自分で一から書いたHTMLを読み込ますのはどうやるのでしょうか?
0795nobodyさん
2010/10/11(月) 20:53:57ID:???http://book.cakephp.org/ja
0796nobodyさん
2010/10/11(月) 20:54:30ID:???おすすめのCakePHPの本を教えてください
0797793
2010/10/11(月) 21:09:47ID:???解決できました
default.ctpっていうファイルを作ってlayoutフォルダに入れたらいいみたいでした
0798nobodyさん
2010/10/11(月) 21:18:50ID:???サブドメインは超余裕
>>792
apacheいじれるのなら/app/webrootをルートにするんだ
ルートに置かないと後々問題出やすい
>>793
チュートリアルやれ
>>796
1.3対応書籍は不作だから公式のbookがいいぞ
どうしても本が欲しいなら、ガイドブックの1.2版がおすすめ
>>797
素晴らしい、その調子だ
0799nobodyさん
2010/10/11(月) 21:27:09ID:???0800nobodyさん
2010/10/11(月) 21:30:01ID:???cakephpの場合はどれが出来るようになればいい雰囲気になれますか?
0801nobodyさん
2010/10/11(月) 21:36:57ID:???0802nobodyさん
2010/10/11(月) 21:43:31ID:???認証、フォーム使った入出力、モデルの読み書きとバリデーション、
複雑なSQLをModelクラスのメソッド使って組み立ててみる、
ぐらいが一通りできればあとは応用でなんとかなるような気がしないでもない。
ただ、単に「できる」のではなく内部的にどういう処理順序で
物事が進んでいくかを把握してないとダメだと思う。
フレームワークって何でもそうだと思うけど。
0803nobodyさん
2010/10/11(月) 21:51:05ID:???フレームワークは初めてなので頑張って覚えます
0804nobodyさん
2010/10/11(月) 22:00:17ID:Y80mjYyFclass HelloController extends AppController{
var $name = 'hello';
var $uses = null;
function index(){$this->set('sample_text', 'Hello World!!');}
}
■app/views/index.ctp
<p><?php echo $sample_text ?>
入門用でHello World!!を表示できる所まで出来ました。
この場合MVCのVCしか使ってないと思うのですが、
データベースを使わない条件の時にMはどうやってファイルに書くのでしょうか?
0805nobodyさん
2010/10/11(月) 22:09:17ID:???モデル内で
var $useTable = false;
データベースを使わないメールフォームの処理などでよくやる処理
0806nobodyさん
2010/10/11(月) 22:25:25ID:???<?php
class hello extends AppModel
{
public $name ='hello';
public $useTable = false;
}
hello_controller.phpの$this->set('sample_text', 'サンプル');というのを↑hello.phpに書くというのは
できないのでしょうか?
ModelなのでデータをModelのファイルに書きたいと思いました。
0808nobodyさん
2010/10/11(月) 23:25:25ID:???0809nobodyさん
2010/10/11(月) 23:29:49ID:???0810nobodyさん
2010/10/12(火) 00:07:31ID:???0813nobodyさん
2010/10/12(火) 11:18:49ID:???フレームワーク初心者でも分かりやすいやつをわかりや
0814nobodyさん
2010/10/12(火) 13:13:16ID:???0815nobodyさん
2010/10/12(火) 13:14:36ID:???0816nobodyさん
2010/10/12(火) 13:28:20ID:???PHP自体はどの程度できるの?関数とクラスはわかってる?
■ このスレッドは過去ログ倉庫に格納されています