【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/
0652nobodyさん
2008/04/12(土) 22:14:35ID:???0653nobodyさん
2008/04/12(土) 22:22:03ID:???0654nobodyさん
2008/04/12(土) 23:15:20ID:???割り切った設計で可能な限り使いやすさと速度の両立を目指すという
0655nobodyさん
2008/04/12(土) 23:24:15ID:???Zendに至ってはプレースホルダのSQL直発行がメイン
findごときで収まるクエリだけなら世話ねーの
0656nobodyさん
2008/04/13(日) 00:28:23ID:???Zendの場合、O/Rマッパーそのものがない。
あれはフレームワークというよりライブラリだから。
0657nobodyさん
2008/04/13(日) 11:48:16ID:???前々スレ744を参考に、$html->formTagでformタグを実装しようとしています。
ただ、検索文字列(this.search.valueの部分)に全角文字が入るため、エンコード(?)する必要が
あると思うのですが、その方法が分かりません。
やり方、もしくは、この単語でググればよい、というのを教えて下さい。
744 :nobodyさん:2007/09/15(土) 12:14:57 ID:???
> >>740
> こうですか?わかりません><
>
> $html->formTag('/post','get',array('onsubmit'=>'location.href=\'/post/\'+this.search.value;return false;'));
0658nobodyさん
2008/04/13(日) 13:07:44ID:???<input type="submit" value="検索">
入力欄は$html->inputなどを使う事
0659658
2008/04/13(日) 13:18:37ID:???だった。すいません
0660657
2008/04/13(日) 14:18:45ID:???ありがとうございます。
ただ、method=getなので、やりたかった事とはちょっと違うようで・・・。
いろいろ試したのですが、けっきょく、VIEW側は
<?php echo $html->formTag('/post/', 'get'); ?>
<input type="text" name="search" size="15">
<?php echo $html->submit('検索'); ?>
として、コントローラー側で
function search()
{
$keyword = $this->params['url']['search'];
(以下略)
として対処する事にしました。
0661nobodyさん
2008/04/13(日) 19:11:09ID:???同じコードで、いろんなデータベースに対応できるから極力queryを使わないほうがいいって言ってんだろ。馬鹿か。
0662nobodyさん
2008/04/14(月) 02:08:03ID:???それで、$formがまだよくわかっていないのですが、$form->radioで
1つ目にcheckedをつける場合、どのように指定すればいいのでしょうか?
<?php echo $form->radio('Bookmark.access',
array(1=>'公開','非公開'),
array('legend'=>false, 'separator'=>' ')); ?>
0663nobodyさん
2008/04/14(月) 11:45:13ID:???inputだとこんな感じ
<?php echo $form->input('Bookmark.access', array(
'options'=>array('1'=>'public','2'=>'private','3'=>'text'),
'type'=>'radio',
'legend'=>false,
'separator'=>' ',
'value'=>'3')); ?>
たぶん、radioでもvalueをつけるといけると思う。
0664nobodyさん
2008/04/14(月) 17:25:15ID:???入力エラーで戻ってきたときに、
また一つ目がチェックされるのよね。
0665nobodyさん
2008/04/15(火) 00:36:29ID:kB0aZEdAもし可能であれば、ACLのうまい活用の仕方もわかると嬉しいです
ペコリ
0666662
2008/04/15(火) 01:18:18ID:???inputの例を参考に、2つ目のarrayに'value'=>'1'を追加して、うまく行きました。
ありがとうございます。
0667nobodyさん
2008/04/16(水) 13:10:23ID:???0668nobodyさん
2008/04/16(水) 16:28:26ID:???そもそもshellsの中でコンポーネントを使うのが問題ではないのか?
コンポーネント = コントローラの汎用的処理、
つまり処理の内容はコントローラそのものなわけで、
シェルの中からコントローラを呼び出すというのがちょっと疑問な処理。
コントローラの処理にリダイレクトするという考えでrequestActionを
呼び出すという考えもありとは思うが、
そもそもそれはモデルにおくべき処理なのかも知れないぞ。
ちなみにシェルからモデルを扱うには、usesプロパティを使用するだけでOKだ!
0669nobodyさん
2008/04/17(木) 18:54:40ID:YR2rN8Sk俺の場合は、定期的にcronで叩いて、指定ディレクトリに生成された大量の一次データをDBに取り込む作業、とか。
0670nobodyさん
2008/04/17(木) 19:48:58ID:???オワタ
0671nobodyさん
2008/04/17(木) 21:32:22ID:???0672nobodyさん
2008/04/17(木) 21:35:44ID:???旧システム(フレームワーク未使用)から新システム(CakePHP)への
データコンバートに使った。
あとは簡易なツールかな。たとえば入力した単語の単数形⇔複数形 などをするツール。
0673nobodyさん
2008/04/17(木) 21:42:54ID:???これが釣りに見えるとは・・
おまえの知識がよくわかるわ
#sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
0674nobodyさん
2008/04/17(木) 22:03:43ID:???セキュリティを下げるというだけで、それ以外のまともな情報が何もない。
だから馬鹿にされるんだよ。
で、それのどこがセキュリティ下げてることになると思ってんの?w
互換性とセキュリティの違い、理解しようね。
0677nobodyさん
2008/04/18(金) 00:13:14ID:???これをコメントアウトすることによってセキュリティを甘くせざるを得ないわけよ
このモードをはずさないとcakeのコードからワーニングがでる。
cakeに潜んでるバグで作者は修正予定らしい
0678nobodyさん
2008/04/18(金) 00:16:50ID:???横レスですまんが、すっげぇ要するにMySQL5系の設定で
STRICT_TRANS_TABLESを指定していると、SQLの構文チェックを
厳密にするんだけど、このままだとCakePHPの吐くSQL自体でエラーが出るんよ。
んだから今の所は構文チェックを緩くしないとCakePHPが動作しないって事。
>>670の説明で分かった奴はエスパー。
0680nobodyさん
2008/04/18(金) 00:33:10ID:???0681nobodyさん
2008/04/18(金) 00:34:11ID:???2.リアルではおとなしいのにネット上では態度がでかい。
3.自分の意見で地球が動いてると思ってる。自分の意見はみんなの意見。
4.自分に非があってもスグ言い訳、逆切れ。他人を攻撃する。威嚇することで自分の弱さを隠している。
0684nobodyさん
2008/04/18(金) 01:18:11ID:???CakePHPのバグでもセキュリティの問題でもない。
0685nobodyさん
2008/04/18(金) 01:27:47ID:UgH30Z6mCakePHPとはスレ違いだし
0687nobodyさん
2008/04/18(金) 01:46:12ID:???Windows板でインストーラーを使ってインストールした場合のみ。
本当のデフォルトの値は厳密モードじゃありません。
いい加減Windowsは卒業しろよw
0688nobodyさん
2008/04/18(金) 02:46:06ID:???んーと、SQLインジェクションとか攻撃者が故意に行うものとは違うんだけど、
まぁ広義の意味でセキュリティの問題だとは思うよ。
つーのも、MySQL4系ってあれなのよ、予め決めたカラムの型よりデカいデータ食わせると
勝手に型に合わせてデータ削って無理やり挿入してくれちゃうのよ。
例えばvarchar(4)でカラム作ってそこに"unkotintin"ってデータ突っ込んでも、うんこしか保存されないわけ。
他にも''をNULLと解釈してくれたり、2008-02-31を許容してくれたりと
入力データに対して大変大らかな実装なんよね。
で、それってちょっとマズいだろ、入力データが型に合ってない=異常事態なんだから
強制保存すんな!ロールバックしろヴォケ!と思う人も当然いる訳で
そんな感じの背景があってMySQL5系から型チェックを厳しくするモードが実装されたと。
CakePHPの場合だと、INSERTする時にidの数字をauto_incrementに任せる訳だけど、
そこで発行されるSQLがid = ''って指定されてるから「そこ文字列入れる所じゃねーよ!」って怒られる。
んだからセキュリティホールよろしく第三者に直接叩かれるって心配はないよ。
余談だけど、STRICT_TRANS_TABLESはInnoDBとかトランザクションをサポートしてねーと使えねーべ。
MyISAMで構文チェックさせる時はSTRICT_ALL_TABLESなー。
0689nobodyさん
2008/04/18(金) 04:25:34ID:???0690nobodyさん
2008/04/18(金) 04:45:08ID:???今でもぼくは
.thtml 派。
0691nobodyさん
2008/04/18(金) 08:30:04ID:???1.1系から乗り換えた当初は.thtmlにこだわってたけど(てか気づかなかった…)
.ctpに切り替えたら1日で慣れた
やっぱり5文字の拡張子は長すぎるよね
0692nobodyさん
2008/04/18(金) 08:37:15ID:???だから広義の意味っつってんじゃん。日本語理解できてる?
Perlでコードの安全性を高めるためにuse strict;するのと一緒だよ
0696nobodyさん
2008/04/18(金) 15:39:38ID:???//入力画面
function form(){
}
//確認画面
function confirm(){
//バリデーションでエラーの場合、フォームに戻す
if(!$this->Form->validates($this->data)){
$this->set('data',$this->data);
$this->render('form');
}
}
//完了画面
function send(){
}
form.thtml
<?php echo $html->input('Form/name',array('value' => $data['Form']['name'])); ?>
の構成の場合、最初に form にアクセスすると $data['Form']['name'] がない!
とNoticeエラーが出てしまいます。
これって、 form() で初期化した $data を与えるしかないのでしょうか?
入力項目がいっぱいあるとめちゃくちゃ大変な気がするのですが…。
0697nobodyさん
2008/04/18(金) 16:19:29ID:???どのようにすればよいのでしょうか?
0698nobodyさん
2008/04/18(金) 18:21:08ID:???class Post extends AppModel {
protected $order = "Post.created DESC";
とかでfindしても駄目なんです。
0699698
2008/04/18(金) 18:21:29ID:???0700698
2008/04/18(金) 19:03:12ID:???0701nobodyさん
2008/04/18(金) 19:27:37ID:???0702nobodyさん
2008/04/18(金) 19:50:15ID:???function find_name_only($cond = "name like '%tarou%'"){
return $this->findAll($cond);
}
を書いてごまかしてみました。
ほかにいい方法があるのでしょうか?
0703nobodyさん
2008/04/18(金) 20:00:26ID:???まだ始めて2週間しかたってないけど。
form.thtml
<?php echo $html->input('Form/name'); ?>
で、どう?
あと、$this->set('data',$this->data); は、要らないとおも
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:CCA4AGBq■ このスレッドは過去ログ倉庫に格納されています