【PHP】フレームワーク CakePHP 11ホール目【v1.3】
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2011/02/16(水) 21:52:35ID:zCTGjUMqCakePHPから派生した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
0069nobodyさん
2011/02/21(月) 00:38:18.41ID:qx7ew/PUsaveをこういう使い方しますか?
結果としてはバリデーションも他の条件のエラーも一緒に表示されるようになりました。
ただsave関数なのにsaveしないところで記述するってのが少し解せないかんじもします。
if(他の条件判断){
if($this->User->save($this->data)){
echo "saved!";
}
}else{
$this->User->save($this->data);<<<<<<<<<<<<<<<<<<<<<<<<<<<<
echo " ERROR!! 他の条件が満たされていません!"
}
}
0070nobodyさん
2011/02/21(月) 00:46:05.47ID:qx7ew/PU「他の条件以外」を完全に満たしていて、「他の条件」を満たしていない時にsaveされてしまいますね。。。(当たり前か・・・)
0071nobodyさん
2011/02/21(月) 01:02:03.32ID:???0072nobodyさん
2011/02/21(月) 03:01:11.38ID:???CakePHPであることを隠蔽するってあったけど、どうしてもコントローラ名(URLの一部)が複数形の単語だったりで、特徴あるからすぐバレるよね?
かといって命名規則を無視出来んし
0073nobodyさん
2011/02/21(月) 04:13:38.11ID:???0074nobodyさん
2011/02/21(月) 04:29:12.00ID:???リレーション先のテーブルのモデルのphpファイルも用意してやらなきゃいけないの?
リレーション元のモデルからbelongsToとか使えば特に要らない?
0075nobodyさん
2011/02/21(月) 04:46:55.30ID:???なんでCakePHPはControllerにビジネスロジックを書いちゃうの?
MVCとかちゃんと理解して作ったとは思えないんだよね。
0076nobodyさん
2011/02/21(月) 05:56:25.75ID:???0077nobodyさん
2011/02/21(月) 08:20:26.21ID:???コントローラ名
モデル名(ただし単数系)
ビューのフォルダ名
DBのテーブル名
を統一しろ!的になってますが
UsersのDBテーブルに対して、同じ名前のコントローラー、モデル(単数系)、ビューのそれぞれを持っていたとします。
ただしhttp://www.hoge.com/registrations/として、
registrations_controller.phpとregistration.php上でメインでUsersテーブル(外部モデル)を扱うことって可能ですか?
もちろんregistrationsというテーブルは一切持たないものとして、usersテーブルのレコードを処理するためだけのコントローラーです。
0078nobodyさん
2011/02/21(月) 10:51:44.25ID:???ControlloerはあくまでModelを実行して結果をViewに渡す目的で使ってるけど。
0080nobodyさん
2011/02/21(月) 11:23:25.80ID:???0081nobodyさん
2011/02/21(月) 13:16:29.48ID:???テンプレートと入れ替える方法どこかに載ってないでしょうか
0082nobodyさん
2011/02/21(月) 13:22:14.73ID:???CakePHPの場合、どういうURLにしたいか考えずに、
テーブル/Modelから考えたほうがいいよ。
そうすると、良くある形として .com/users/registration みたいな感じになる。
で、こういう規約まんまのURLがまずいなら
routesで調節するんだ。
一応、これがセオリーだと思う。
まぁ、routesって使いこなすのに慣れが必要だから、
セオリーになりきれてないかも。
0083nobodyさん
2011/02/21(月) 13:53:20.59ID:???MVCに慣れていない最初はControllerに書いちゃいがち。Controllerは動きがわかりやすいからね。
そのうちああこんなのモデルに書いた方がいいだろ。って気がつく。
0085nobodyさん
2011/02/21(月) 18:41:10.45ID:???0086nobodyさん
2011/02/21(月) 19:09:17.15ID:???ReCaptchaは王道だけど会員にならないといかんし、
KCaptchaは地味過ぎる
Securimageが一番いいけど、他の人のブログ参考にしても、マトモに動かん
0087nobodyさん
2011/02/21(月) 20:13:42.08ID:???チェックボックスAが選択された場合テキストCが必須
チェックボックスBが選択された場合テキストDが必須
のようなvalidateはどうかけばええでしょう?
0088nobodyさん
2011/02/21(月) 20:48:44.56ID:???0090nobodyさん
2011/02/21(月) 22:51:13.06ID:???Controllerがテーブル名っておかしくね?
他のテーブル使う時どうすんのよ?
てゆーか、普通コントローラはユースケース毎に付けね?
0091nobodyさん
2011/02/21(月) 23:03:58.43ID:???ドキュメント読め
0092nobodyさん
2011/02/22(火) 01:12:43.84ID:???ControllerとModelが一対一であるとは限らないのに
Modelの名前をControllerに付けるというのが意味不明だって言ってんだよ。
意味分かる?
0093nobodyさん
2011/02/22(火) 01:56:19.29ID:???自分のやりやすい形でやればいいじゃん。
ビジネスロジックもコントローラに書くことはできるわけだし。
少なからず、コントローラとモデルの名前が一緒だったら、
このコントローラは、このモデルに関する物だなと直感的にわかる
0094nobodyさん
2011/02/22(火) 02:01:08.73ID:???無能な技術者が思いついたとしか思えんアホみたいな仕様だよな、あれ
10年後は誰も使ってなくて「昔あんなんあったよねーキャハハ」って笑われてるよ
0095nobodyさん
2011/02/22(火) 02:14:52.46ID:???0096nobodyさん
2011/02/22(火) 02:45:01.87ID:???0097nobodyさん
2011/02/22(火) 02:49:34.76ID:???select user_name from users;
から取得したデータをビューで出力する際、テンプレートで例えばですが、
<?php foreach (...): ?>
<?php echo h($data['user_name']) ?>
<?php endforeach; ?>
のような制御が必要ですよね。
Cakeって配列の命名はcamelCaps形式だと思うのですが、カラムがuser_name (アンダースコアを含む) の場合、
配列のキー名はsnakeCase形式になりますよね。
命名規則がバラけると思うのですが、その辺りどちらかに統一するとか指針はあるのでしょうか。
0098nobodyさん
2011/02/22(火) 03:14:21.97ID:???テーブル名をuser_nameじゃなくてusernameにするのがいいです。
HABTMの時に頭がごちゃごちゃになります。
無理ならInflectorを通してみて確認するといいよ。
どっかにそういうサイトもあったけど忘れた。
009998
2011/02/22(火) 03:20:23.25ID:???0100nobodyさん
2011/02/22(火) 04:00:42.68ID:???それぞれのユーザー同士で1対1の簡易メッセージの送受信をさせたい時、下記のような設計で問題無いでしょうか?
■モデルのアソシエーション
HogeUser hasOne Mailbox
MogeUser hasOne Mailbox
PogeUser hasOne Mailbox
Mailbox HATBM Message
■DB
mailboxes:
id
mailboxes_messages:
mailbox_id
message_id
sended (true=送信側, false=受信側)
opened(true=開封済, false=未開封)
messages:
id
title(件名)
body(本文)
created
*_usersテーブルはそれぞれmailbox_idフィールドを持っています。
*_usersはそれぞれ構造が全く異なるのでusersとして統一させることはできません。
0101nobodyさん
2011/02/22(火) 04:47:39.88ID:???CakePHPでキャメルケースになるのは、配列のキーじゃなくって、
モデル名だよ。
usersテーブルはUserModelが担当するんだ。
UserModel->find()したら、データは
$this->data['User'] = カラム名をキーとした連想配列 //1件の時(ってこうなるよね?)
$this->data = array(['User'] = カラム名をキーとした連想配列, ... ) //複数件のとき
こんな感じだったはず。
UserModel部分がUserという配列のキーになってる。
98の言うとおり、HABTMの中間テーブルがアンダーバーで繋ぐから、
テーブル名にアンダーバーを、それ以外で使うのはお勧めしない。
カラムには全然おk
0102nobodyさん
2011/02/22(火) 05:00:04.31ID:???設計についてはスレチだし、めんどうだから考えないけど、CakePHPとして一言。
HABTMの中間テーブルには、プライマリキーと外部キー以外はもてない。
別にカラムがあっても動くけど、その情報はきえてしまうんだ。
だからsended openedがだめ。
消えてしまうというのは、mailbox_id = 1にmessage_id = 1と2の2通のメッセージがある状態で、
新たなメッセージ message_id = 3がきた場合、
DELETE FROM mailboxes_messages WHERE mailbox_id = 1 してから、
INSERT文でmessage_id = 1と2と3を発行するんだ。
だからmessage_id = 1と2のsended openedはきれいさっぱり。
中間テーブルに何か情報を持たせたいなら、HABTMじゃなくって
hasManyとbelongsToで作るべき。
当然、HABTMじゃないからfind()の仕方も変わってくるけどね。
0103nobodyさん
2011/02/22(火) 07:55:59.50ID:???基本はキャメライズするんだけどDBテーブルは慣習的にアンダースコアだからフィールド名を配列キーとして使うときだけはそのまま
0104nobodyさん
2011/02/22(火) 12:23:15.78ID:???Userと言うモデルがあったとして、それぞれmodels、controllers、views
に入れないと行けない。viewsに関してはディレクトリを作成して。
一つのディレクトリ内にまとめて
/app
/user
└controller.php
└model.php
└index.ctp
└form.ctp
でもいい気がする。ビューが増えるならviewディレクトリ作って入れるとか。
こうすればFTPで転送する時、userディレクトリだけで良いし。
0105nobodyさん
2011/02/22(火) 13:15:54.00ID:???ドメイン下に/users/
ってつけたら、大抵ページが存在するから見破るのがラクすぎる
0106nobodyさん
2011/02/22(火) 13:17:18.37ID:???てかMVC毎にフォルダ分けるのってCakeだけじゃないというか、
その構成の方が主流じゃないのか?
むしろ他にある?
0107nobodyさん
2011/02/22(火) 13:21:44.92ID:???主流なんだけどさ、ファイル編集する時、あっちこっち見に行かないと
いけないというのが作りづらさを感じるんだよね。
ま、>>104だとファイル名が全部同じになって分かりづらいってのもあるけど。
0108nobodyさん
2011/02/22(火) 13:41:17.74ID:???0110nobodyさん
2011/02/22(火) 16:02:30.52ID:???モデルはないけどコントローラーだけ存在するとか、そういう場合にわかりづらくなる気がする
>>108
userモデルを使った場合routesで/users/usernameみたいにする人が多いってことじゃね?
cakeに限らない気がするけど。
0111nobodyさん
2011/02/22(火) 20:03:44.94ID:???belongsToとかで繋がってる先のレコードを編集できんの?
0114nobodyさん
2011/02/22(火) 21:05:25.69ID:???http://book.cakephp.org/ja
ここを全部読んでください。
何度読んでもわからなかったら、あなたにはCakePHPに向いていません
0116nobodyさん
2011/02/22(火) 21:12:51.08ID:???時間はかかりますが、全体を見ることをお勧めします
0117nobodyさん
2011/02/22(火) 21:52:12.81ID:???0119nobodyさん
2011/02/22(火) 22:39:56.66ID:???お前の稚拙な考えはmixiとかで発表してろ。
お前のようなど素人は秀丸とかでちまちまやってから
辛いかもしれんがプロはIDE使ってるんだよ。心配すんな。
0121nobodyさん
2011/02/22(火) 22:44:08.89ID:???0122nobodyさん
2011/02/22(火) 23:17:03.04ID:???0123nobodyさん
2011/02/22(火) 23:17:28.23ID:fDDX4hLaモデルのuser.php(usersテーブルを呼び出し)と
コントローラのregisters_controllers.phpと
ビューのregistersフォルダがあります。
registers_controllers.phpを下記のようにしてモデルのuser.phpを呼び出し
usersテーブルを読み込もうとするのですが
Error: The view for UserController::add() was not found. が出ます。
viewsにはregistersフォルダを用意してあり、index.ctpも配備されているのですが
なぜエラーが出るのでしょうか?
---registers_controller.php----------------------------------
<?php
class RegistersController extends AppController {
var $name = 'User';
以下略
------------------------------------------------------------
---user.php-------------------------------------------------
<?php
class User extends AppModel {
var $name = 'User';
以下略
0124nobodyさん
2011/02/22(火) 23:31:02.14ID:???var $name = 'Registers';
var $uses = array('User');
0125nobodyさん
2011/02/22(火) 23:32:12.94ID:???エラーメッセージ読めよ。
UserControllerはあるのか?
CakePHPはUserControllerがあるという認識で動いてるぞ。
0127nobodyさん
2011/02/22(火) 23:47:54.53ID:fDDX4hLaコントローラ(registers)で他モデル(user)を呼び出した後、
コントローラ内に他モデル(user)を扱う場合は
$this->User->ほにゃらら で使えますよね?
では、viewから下記のようにデータを受け取ったときはどのように
すればいいのでしょうか?純粋に
$this->register-> でOKですか?
echo $this->Form->create('Register');
echo $this->Form->input('email');
echo $this->Form->submit();
echo $this->Form->end();
0128nobodyさん
2011/02/22(火) 23:51:58.04ID:???いくら分かりにくくて間違いも多いといわれるCookbookとはいえ、
それくらいはちゃんと書いてあるぞ。
そのレベルの質問をするなら、
せめて
http://book.cakephp.org/ja/view/1528/CakePHP%E3%83%96%E3%83%AD%E3%82%B0%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB
この実務で使いそうなちょっと込み入った使い方には一切触れてないチュートリアルで
ブログ(笑 を作ってみれ
0129nobodyさん
2011/02/22(火) 23:55:07.65ID:fDDX4hLaすみません。一応このチュートリアルもACLもやったんですが、
いまだに理解できていないのが現状です。。。
0130nobodyさん
2011/02/23(水) 00:03:55.10ID:gK6lHkB0>>127でviewのForm->create()で実質ユーザーテーブルへ登録することになるけど
飛び先はそのままのページ(register.add)へ遷移させたいので
echo $this->Form->create('User',array('url'=>'.'))
としていますが、おかしいようです・・・・
0131nobodyさん
2011/02/23(水) 00:09:28.68ID:gK6lHkB0formで別モデル(User)を指定しているのでジャンプ先が必ず
hoge.com/users/registers/add になってしまいますねorz
0132nobodyさん
2011/02/23(水) 00:25:23.06ID:???うーん、やったとは思えんのだがなぁ。
> では、viewから下記のようにデータを受け取ったときはどのように
> すればいいのでしょうか?純粋に
> $this->register-> でOKですか?
http://book.cakephp.org/ja/view/1537/%E8%A8%98%E4%BA%8B%E3%81%AE%E8%BF%BD%E5%8A%A0
流石にチュートリアルやっといて$this->dataを忘れるとは思えぬ・・・
俺モデル名とコントローラー名は規約どおりにしかやったこと無いからなぁ。
初心者ならあまりトリッキーな事はしないほうが、無用なトラブルを避けられると思うよ。
0133nobodyさん
2011/02/23(水) 00:41:36.70ID:gK6lHkB0すみません。チュートリアルもやるにはやって本も400ページほど読んだのですが、
完全に把握できず、どういうものか良く分からないで何となくやってるのが現状です。
こういう理解でよいものでしょうか?
1.フォーム入力から受け取ったデータは、取り扱っているモデル名に関わらず
$this->dataという変数に連想配列形式で格納される
2.DBからのデータは $this->(モデル名)->(様々な関数コマンド)を利用して
必要な分だけを呼び出す。
もし、Modelでアソシエーションを組んでいた場合、その呼び出した際の
メインテーブルの対象レコードに紐づくアソシエーション先も自動的に呼び出される。
すなわち モデルTable1にTables2をアソシエーションで設定していたら
$str = $this->Table1->find('all');
この時点で$str[0][Table2][任意フィールド]の中に
Table1で絞られたレコードのTable2の関連レコードが格納されている
という認識でいいんですよね?
あと良く分からないのがアソシエーションを組んでるときに
$this->Table1->Table2->save()
みたいに複数のテーブルを跨いでいってる場合です。
普通に
$this->Table2->save()
じゃ駄目なのでしょうか?
0134nobodyさん
2011/02/23(水) 00:46:24.44ID:gK6lHkB0これもコントローラ名(URL)を複数形やテーブル名と同じにしなければいけないという
基本規約のせいなんです。
たとえば皆さんは会員登録もメンバーリスト参照も同じusersコントローラでするのですか?
http://hoge.com/users/register
http://hoge.com/users/view
のように
この場合、cakephpで作っているのがミエミエで攻撃されやすくなりません?
皆様のご意見も聞かせていただければ幸いです。
0135nobodyさん
2011/02/23(水) 01:09:41.82ID:???ふーむ、しょうがないのう。
> 1.
POSTに限りyes。モデルがどうなってるかは、コントローラーでdebug($this->data)とかして、
自分で見てみると良い。
あと、CakePHPでGETメソッドは上級者向けなのでなるべく使わないほうが良い。
> 2.
大体そんな感じ。このあたりは奥が深いので、
とても1レスで全てを伝えるのは無理、というか俺も把握しきれてない。
$this->Model->Model->save()はあまりしないな。
トリッキーな事をしてなければ、UsersコントローラーではUserモデルへのデータと、
アソシエーションで紐ついてるデータを保存するわけだからな。
$this->User->save()か$this->User->saveAll()で基本的には十分。
Userモデルに紐付く何かも、ViewをFormHelper使って無難に作っていれば、
$this->dataをsave()かsaveAll()すれば問題なく保存されるはず。
ただ、どういう場合にsave()かsaveAll()は俺もちょっと語れるほどじゃない。たまに試行錯誤する。
0136nobodyさん
2011/02/23(水) 01:20:15.27ID:???CakePHPではURLの見栄えはroutesで調節するのがセオリー。
ただ、これはちょっと難易度が高いのが難点。
ここでのやり取りから察するに、質問者はroutesにかなり時間をかけて取り組むことになるとは思う。
一応Cookbookはこのページだけど、なんかだらだらと書いてあって要点を得ない。
とても分かりにくい。が、しかたがない。
http://book.cakephp.org/ja/view/945/%E3%83%AB%E3%83%BC%E3%83%88%E3%81%AE%E8%A8%AD%E5%AE%9A
> 一般的な Router の他の使い方は、コントローラの別名(alias)を定義することです。通常の /users/someAction/5 という URL の代わりに、/cooks/someAction/5 でアクセスさせたいとしましょう。このようなルートの設定は、次のようにすることで簡単に実現できます。
> Router::connect(
'/cooks/:action/*', array('controller' => 'users', 'action' => 'index')
);
一応この方法でUserControllerのまま、URLを変える事が出来る。
ただ、これだと/cools/add みたいなのもUsersController->index()に行っちゃいそうな気がするけど・・・
Cookbookが間違ってるのか俺が間違ってるのか。面倒だから確認はしない。
0137nobodyさん
2011/02/23(水) 01:35:30.01ID:gK6lHkB0ありがとうございます!!!感謝感激です。
>>127の件は下記で解決できました!!!
echo $this->Form->create('Register');
echo $this->Form->input('User.email');←モデル名. をフィールド名の前へ追加
echo $this->Form->submit();
echo $this->Form->end();
>>134についてですが、皆さんは規約どおり
usersテーブルに関連するものであれば全てURLを
hoge.com/users/○○○○○
としてるのですか?
CakePHPで作ってるのを隠蔽したいのであれば、工夫などされていませんか?
0138nobodyさん
2011/02/23(水) 01:40:49.20ID:gK6lHkB0hoge.com/registers/と複数形になるのは諦めてますか?
それとも>>136さんが言うようにroutesで調整してます?
そうなれば、そもそもusersコントローラとregistersコントローラに分ける
必要はなくて最後にroutesで全て設定すればいいんでしょうか?
どういうやり方が標準なのか分からず、ごめんなさい。
0139nobodyさん
2011/02/23(水) 01:52:29.68ID:???0140nobodyさん
2011/02/23(水) 01:56:59.29ID:???そりゃたまにはコントローラーとモデルの規約に沿わない名前にすることもあるよ。
1モデルに大して2コントローラーなケースとか、その逆とかな。
ただ、それなりにCakePHPの中身を分かってるから出来るだけで、
初心者がURLに見栄え目的に規約に沿わない名前にすると、
今見たくトラブるだけさね。
CakePHPは規約に沿う事で色々と工数を省略できるようになってるわけで、なるべく沿ったほうが良い。
ただ、コントローラー名=URLだと困る事も想定はされる。
でも規約に沿わないとめんどくさくなる。
だからroutesで設定できるようになってるんだ。
別に規約に沿わなくても開発は出来るよ。
ただ、CakePHPの利点を使わないで作るから、めんどうになるし、
/register/addに遷移したいのに/users/addに遷移したりとトラブルになりやすいだけ。
FormHelperでいちいちModel.fieldにしないといけなくなったのも、規約に沿ってない弊害だな。
0141nobodyさん
2011/02/23(水) 02:06:04.37ID:gK6lHkB0懇切丁寧な解説ありがとうございます。
非常に説得力があります。
確かにこれではCakePHPのメリット(省略による開発速度)が損なわれてしまいますね
やはり、基本的には
関連するテーブルは一つのコントローラ、モデル、ビューに収めていく形式がいいのですね。
そうすると、一つのコントローラの中に多くメソッド(アクション)が入りすぎてゴチャゴチャになるという理由からもコントローラを二つにして、メソッドを分けようと思っていたのですが、そのやり方は一般的ではないんですね?
一つのコントローラ内にアクションが30個入るとか普通なのかなぁー(^_^;)
URLの見栄えの件はroutes設定で了解です。
ただ全てのコントローラ(URL)が複数形になっていますが、これを全部単数系にroutes内で弄っていくのが一般的なのでしょうか?
0142nobodyさん
2011/02/23(水) 02:06:45.51ID:???CakePHPは、元々CakePHPである特徴が多くて隠蔽しにくいフレームワークだからな。
そりゃなんのフレームワークを使っているか、隠せるなら隠したほうが良いけど、
手間対効果を考えれば、あまり気にするとこじゃないと思うんだけどな。
俺だったら、予算をくれるんならやらないこともないけどね。
予算が足りなきゃ、むりっすーって言ってつっぱねるだけだわ。
0143nobodyさん
2011/02/23(水) 02:14:02.29ID:???予算とかではないのですが海外で公開する予定なんで、
攻撃されまくりそうで怖いんですf^_^;)
Ruby on railsとかなら、こういうCakePHPの規約ならではの弊害みたいなの無いんですかねー?
0144nobodyさん
2011/02/23(水) 02:24:46.99ID:???どんなのを作ってるのか知らんからなんとも言えないとこではあるが、
1コントローラーに30アクションは多いかもね。
そんなにアクションが必要になるのを作った事が無いから、イメージわかないな。
むしろ何を作ろうとすればその数のアクションが必要になるのか、ちょっと興味があるな。
とりあえず単数形にしようと思ったことが無いからよく分からん。
複数形で別にいいじゃん。何か問題でもあるの?
それで機能しないわけでもあるまいし、意味不明なURLになるわけでもないし。
0145nobodyさん
2011/02/23(水) 02:59:23.91ID:???購入した初心者用の本の中では多用されてました。
単数系、複数形については
users/register(仮登録。ハッシュURL付きメール送信まで)
users/regcheck(仮登録後、ハッシュURLをクリックで本登録への動作)
users/list(メンバーリスト閲覧)
となるよりは
register
regcheck
list
となったほうが見た目もスッキリになるからです
0146nobodyさん
2011/02/23(水) 03:25:33.34ID:???一般的かと聞かれると、まぁなんとも言えないところはあるね。
俺自身、CakePHPの省略に悩まされる事もあったし。まぁ、好みにもよると思うよ。
例えば、UsersController で規約どおり UserModel がusesされてる場合。
/users/add.ctpにFormHelper->create()したら、
規約(これも規約って呼んで良いのかしらんが)によってcreate('User')と同じになる。
規約によってcreate()でもcreate('User')でも、
その時点で$this->Form->input('field')はinput('User.field')と同じ。
そこにアソシエーションで紐付いたUser以外のモデルのを書く場合は、input('Comment.field')と書かないならない。
これが前提として、省略はあくまで省略なので、逐一Model.fieldと書いてももちろん良い。
トラブルは避けやすいかもね。規約による楽さを捨ててるけど。
ただ、省略が出来る以上、ネット上の情報では省略されてることもあり、
規約に沿わない作り方をしてcreate()てかいて/register/addじゃなく/users/addに遷移して困るのは、
それはそれとしてって事かな。
0147nobodyさん
2011/02/23(水) 03:35:51.27ID:???まぁ、どうしても単数系にしたかったらroutesに沢山書くのがセオリーなんじゃないかな。
俺もCakePHPを完全に使いこなしてるわけじゃないから、他にも方法があるかしらんけど。
さっきも書いたけど、規約に沿うのを特に進めたのは、
質問のレベル的に、そこに手を出すのは早いんじゃないかと思ったのがあるからね。
流石に$this->dataを知らない風な質問をされたら、ね。
使いこなしてる人は色々と自分なりの使い方でやってると思うよ。
例えばコントローラじゃなくてモデルだけど、これの「4. アクション毎にModelを作る」とか
http://www.1x1.jp/blog/2010/12/thinking_abount_cakephp_mode.html
あとCakePHPの隠蔽について。後半はネタっぽいが。
http://d.hatena.ne.jp/k1LoW/20101202/1291262612
この2つはCakePHP Advent Calendar 2010でのだけど、
このイベントの記事はそこそこ良い記事ばかりだし一通り読んでみるのも良いかもね。
http://cakephp.jp/modules/newbb/viewtopic.php?topic_id=2510&forum=16
0148nobodyさん
2011/02/23(水) 09:43:30.81ID:???テンプレートと入れ替える方法どこかに載ってないでしょうか
0150nobodyさん
2011/02/23(水) 16:34:55.81ID:???0151nobodyさん
2011/02/23(水) 18:09:23.62ID:???こうするのも
{$test}
こうするのも一緒なんだけど、
後者の方がデザイナーとかには分かりやすいんじゃない?
0152nobodyさん
2011/02/23(水) 18:18:28.09ID:???囲い文字がどっちでも一緒だと思うけどね。
まぁ確かに<?php echoはちょっとめんどくさいけど。
でもSmartyはオワコン感が強いな俺の中で。
0153nobodyさん
2011/02/23(水) 21:46:12.22ID:???Smarty使わないって仕事でCakePHPを使ってない人ですよね?www
0154nobodyさん
2011/02/23(水) 22:15:58.50ID:???0155nobodyさん
2011/02/23(水) 23:02:33.16ID:???PHP自体が所謂テンプレート言語の類なのに、
その上にテンプレートエンジン構築してどうする
0156nobodyさん
2011/02/23(水) 23:19:25.45ID:???というのも繰り返し言われてきた
俺もテンプレートエンジン不要派だけど、必要だという人がいるのなら使うのもしょうがないんじゃないかなー
0157nobodyさん
2011/02/24(木) 13:43:09.42ID:???あとデザイナにPHPのコード壊されたりもしたから、基本いじらせたくないな。
0158nobodyさん
2011/02/24(木) 14:52:21.15ID:???今日日サーバーサイドに何らかのプログラムが絡む案件なんて珍しくないし、
phpに理解が無くても、HTML構造の特定のまとまりを崩さなければ、
phpコードを崩す事なんてそうそうないわけで。
それを崩しちゃう人って、
もうHTMLレベルで平気で閉じの無いタグを量産する可能性があるって事だろ。
webデザイナーとしてそれってどうなの?
0159nobodyさん
2011/02/24(木) 15:24:05.68ID:???cakeの場合はcakeの動きを知らなきゃviewを作るのは難しいと思うよ。
0160nobodyさん
2011/02/24(木) 17:03:24.16ID:???function verify($urlparam = null) {
$data = $this->Regurl->findAllByRandomUrl($urlparam);
if (!$data) {
$this->flash('Invalid URL!!','index');
}else{
if ($data[0]['User']['activated'] == 0) {
//print_r($this->data);
$this->User->id = $data[0]['Regurl']['user_id'];
$this->User->saveField('activated', 1);
$this->flash('Now activated!!','index');
}elseif($data[0]['User']['activated'] == 1){
$this->flash('Already activated!!','index');
}
}
}
コントローラUserから、外部モデルRegurlの中のrandom_urlフィールドと照合して、
一致するものがあればアソシエーション先のUserテーブルのactivatedフィールド(フラグ)を
1へ書きかえる処理です。
UserモデルではRegurlのuser_idに対しhasOneで、RegurlモデルではUserのidに対してbelongsToで
アソシエーションを設定してあります。
0161nobodyさん
2011/02/24(木) 18:06:12.76ID:???まあこの程度ならどっちでもいいって言えばどっちでもいいけど、
randomurlのチェックやらsaveFieldなんかの処理は
モデルに書くとすっきりすると思うのねん。
コントローラーは
if($this->User->checkRandomUrl()){
$this->User->activate();
$this->Session->setFlash('どったらこったら', true));
}else{
....
}
こんな感じで何やってるかわかりやすくなるっしょ。
0162nobodyさん
2011/02/24(木) 18:18:50.60ID:???0164nobodyさん
2011/02/24(木) 18:35:27.29ID:???ありがとうございます。
コントローラ内でするとしたら
どういう書き方がスマートになりますでしょうか?
0166nobodyさん
2011/02/24(木) 22:04:42.87ID:???1.3で、bootstrap.php内に
App::import('Vendor', 'ecw/Lib3gkCarrier');
$carrier = Lib3gkCarrier::get_instance();
if($carrier->is_ktai()) {
App::build(array(
'views' => array(ROOT . DS . APP_DIR . DS . 'views' . DS . 'm' . DS)
));
}
って記載したのですが、振り分け出来ないです。
他にすることってあるんですか?
0167nobodyさん
2011/02/24(木) 22:42:35.95ID:???モデルにコーディングするしたら、どのように書けばスマートかを、コントローラへの記述とのセットで見せていただければ幸いです。
初心者ながらに試行錯誤して最終的に出来たの結果が、あのコードでした。
経験豊富の方のコーディングの仕方を見てみたいです。
0168nobodyさん
2011/02/25(金) 03:38:33.94ID:???経験豊富じゃないけど、
ロジックはモデルに書けるならモデルに書くべきってだけなんだよね。
そのままモデルに持っていけば良いと思うんだ。
以下つっこみどころ豊富なコード。動かして無いから間違いはたぶんある。
UserModel extends AppModel{
function activate($url){
$data = $this->Regurl->findByRandomUrl($url);
if(empty($data))
return false;
if($data['User']['activated'])
return 'already';
$this->id = $data['User']['id'];
$this->saveField('activated', 1);
return 'activated';
}
}
SomeController extends AppController{
function index(){
if(!$result = $this->User->activate($this->data['url'])) {
$this->Session->setFlash('Invalid URL!!','index');
return;
if($result === 'activated'){
$this->Session->setFlash('Now activated!!','index');
return;
}
if($result === 'already'){
$this->Session->setFlash('Already activated!!','index');
}
}
}
0169nobodyさん
2011/02/25(金) 10:26:28.95ID:???---MODEL-------------------------------------------------------
Class RegurlModel extends AppModel{
var $name = 'Regurl';
function activate($url){
$data = $this->Regurl->findByRandomUrl($url);
if(empty($data)){
return false;
}
if($data['User']['activated']==1){
return 'already';
}else {
$this->id = $data['User']['id'];
$this->saveField('activated', 1);
return 'activated';
}
}
}
---CONTROLLER------------------------------------------------
Class UsersController extends AppController{
function index($this->data['url'] == null){
if(!$result = $this->User->activate($this->data['url'])) {
$this->Session->setFlash('Invalid URL!!','index');
}
elseif($result === 'activated'){
$this->Session->setFlash('Now activated!!','index');
}
else($result === 'already'){
$this->Session->setFlash('Already activated!!','index');
}
$this->Session->setFlash('Invalid URL!!','index');
}
■ このスレッドは過去ログ倉庫に格納されています