【PHP】フレームワーク CakePHP 5ホール目【v1.2】at PHP
【PHP】フレームワーク CakePHP 5ホール目【v1.2】 - 暇つぶし2ch591:nobodyさん
09/02/05 18:29:43
>>590
ありがとう!
その前にMYSQLが日本語ひっかからないという。。。
なんでだろ。
参考になりました。ありがとうございます。

592:589
09/02/05 18:34:16
cakephp とは関係ないと思いますけど
$option = array('Faqlist.name LIKE BINARY' => $str);

ってBINARY ってのをつけると 日本語もうまくひっかかるようになります。
今まではちゃんとひっかかってたのに。MYSQLの仕様がかわったのかなー

593:nobodyさん
09/02/05 18:52:42
>>590
"or"とか入れなくても良いんでしたっけ?

594:nobodyさん
09/02/05 18:55:11
db側の文字コードがLatin1とかだとBinaryで処理するしかないってことだと思うけどね。

595:nobodyさん
09/02/06 03:00:32
Model::save()の際に、複製を残したいと思って、
idが空になれば新規保存されるのかな?と思って、
モデルに
function beforeSave() {
unset ($this->data[$this->name]['id']);
return true;
}
と書いてみたが、UPDATEされてしまった。

かといって、
function beforeSave() {
$d = $this->data;
unset ($d[$this->name]['id']);
$this->create();
$this->set($d);
return true;
}
ってしたら、createdの日付が0になってしまった。

何か良い方法無い?


596:nobodyさん
09/02/06 08:05:18 OIEK7Rhk
複製を残したいなら二回saveする必要があるんじゃねーか?

597:nobodyさん
09/02/06 09:38:20
>>595
どのように複製したいのだろうか?
updateだろうがinsertだろうが、同じデータをinsertするということなら
afterSaveで、create後saveすれば良いと思われ
別のDBに保存したいというのならuseDbConfigを変更してsaveかな?

いずれにせよafterSaveじゃないと、validationErrorのときにもsaveされちゃうんじゃないかな

598:nobodyさん
09/02/06 10:28:16
>>596,597
複製って表現が違ったかもしれん。すまん
「バックアップを残す」って感じ。
既存のデータの編集の際、既存のデータは
そのまま(削除のフラグを立てる)で、
新しいidで保存したい。

すると、afterSaveでは上書きされた後だから
ダメでしょ? そこで、beforeSaveでidを
空にすれば新しいidで保存されるかなと思ったが、
なぜか上書きされてしまった(前者)。
コピーしたデータで書き込んだら、createの
情報が抜けてしまった(後者)。という次第であります。

599:nobodyさん
09/02/06 10:42:52
>>599
履歴を残すってことね。理解した。
でも、それでもafterSaveだろう
新規のデータをinsertして、afterSaveで既存のデータをupdateする感じじゃないかな
URLリンク(book.cakephp.org)
beforeSaveはあくまで保存するデータをいじったりするときに使うものだと思うよ
>>597のvalidationErrorのときにもsaveされるは間違いのようだ

600:nobodyさん
09/02/06 10:53:08
>>599
>新規のデータをinsertして、afterSaveで既存のデータをupdateする
 ↑
この処理はコントローラに書くことになるよね?
どこかで、「ビジネスロジックはモデルに」なんて書いてあったので、
モデルに書く方法を考えてた。(コントローラからは普通にsaveしてる
ように見えるけど、モデルの方でバックアップを残してる、って感じ)
もしくは、モデルに上記の処理をするメソッドを作る方法もある?
Model::save()を上書きしたら・・・さすがにややこしいことになるよな。

601:nobodyさん
09/02/06 11:04:42
>>600
afterSaveと言ってるくらいだから、Modelでしょーが
おまいさんのいうように、自動的に履歴が残るぞ。
まずは、マニュアル読んでコールバックメソッドを理解するべし

602:nobodyさん
09/02/06 11:08:14
あ。そうか。ちょっと勉強して、試してみる。

603:nobodyさん
09/02/06 11:16:38
>>602 Have a nice cooking !

604:nobodyさん
09/02/06 12:54:05
>>601
「新規のデータをinsertして」もModel??
その後、afterSaveの中でgetIDできるのは
新しい方のデータで、既存のデータのidは
取得できないのでは?


605:nobodyさん
09/02/06 12:58:50 Fuxx6e9Y
バリデーションが効かない。助けて下さい。

モデルに追加するだけで動作するよね?

var $validate = array(
'xxx' => array(
'rule' => VALID_NOT_EMPTY,
'message' => '必須項目です。'
)

606:nobodyさん
09/02/06 13:12:45
>>604
それは、Controller
既存のidについては、自分で工夫してみてくれ。getIDする必要があるとは思えんから

607:nobodyさん
09/02/06 13:51:55
>>606
ありがとう。わかりました。

いくつかのモデルで同様の処理が有るので、
メソッド作って、AppModelに書いてみました。

608:nobodyさん
09/02/06 14:27:27
CakePHPってXSSとかSQLINJECTIONに対応してますか?
自分で処理するしかないですあk?

609:nobodyさん
09/02/06 14:49:58
基本的に処理はされるが、知らずに穴を作ることはできるので、
自分で意識する必要はある。当然だが。

610:nobodyさん
09/02/06 16:08:24
>>608
XSSやSQLインジェクションの仕組みと対策方法を知っていれば、
おのずと分かる話だと思うが?

611:nobodyさん
09/02/06 16:17:31
Cakeのセキュリティ関係はあまり信用出来ないけど


612:nobodyさん
09/02/06 16:32:25
さすがにXSSについては、Helper使わない限りは、自分でh()に通すしかないわな

613:nobodyさん
09/02/06 16:44:06
Ajaxしてると見落とすこともあるかも。

614:nobodyさん
09/02/06 22:15:58 OIEK7Rhk
これってDBにロックかけることってできないの?
BEGINでトランザクション開始
SELECT FOR UPDATEで更新用データ取得と同時にロック
UPDATEでデータ更新
COMMITでトランザクション終了

みたいな感じにしたいんだけど、SELECT FOR UPDATEって
どうやって設定してやったらいいんだ?

615:nobodyさん
09/02/07 09:27:29 u7AiZVmn
webrootの.phpファイルからcakeのコントローラを読んで
表示したいのですが、
includeでコントローラが読めませんでした。

viewにすれば解決するのはわかるのですが、
外部からcakeの結果を受けとることって無理なんですかね?

616:nobodyさん
09/02/07 10:22:18
>>615
(今考えている解決方法がどうやったらできるかじゃなくて)
具体的に今抱えている問題を書き込んだほうが、解決につながりやすいと思うよ

webrootにphpファイルを置くというのは、方向性が間違っている可能性が高い

617:nobodyさん
09/02/07 18:26:40
複数のモデルデータを保存したい時ってどうやってる?
条件としてはどちらもバリデーション通ったら保存。

バリデーションチェックとその表示との両立が上手くできない。

618:nobodyさん
09/02/07 18:37:09
>>617
'validate' => 'first' でsaveAll()

URLリンク(book.cakephp.org)


619:nobodyさん
09/02/07 19:28:59
>>618
明確な答えをありがとう。
フォームのバリデーションエラー表示も少してこずりましたが試して見ます。
saveAllをネット上の情報で試したんですが、エラー表示がきちんと出なかったんですよね。
フォームヘルパーの指定方法の問題じゃないかと思っていましたが。

taskモデルと、アソシエーションしたTimelineモデル(hasMany)のフォームはこんな感じで書いてます。
echo $form->input('task');
echo $form->input('Timeline.progress');

ちょっと前見たときはsaveAllの説明なかった気がするのは気のせいかな・・。
履歴を見ると気のせいじゃない気もする、今月に入って誰か訳してくれたんだねありがとう訳者さん。

620:nobodyさん
09/02/07 23:38:50 K4fXwaLQ
「マニュアル/開発例/ACLを制御するシンプルなアプリケーション」で
User自身が書いたPostのみ編集できて、他人のPostは編集できないようにしたいのですが、
どうしたらいいのかわかりません。><

isAuthorized()とかbeforeFilter()になんかちまちま書くしかないんでしょうか?

例えば、ACL使ってないけど、

function isAuthorized() {
if ($this->Auth->user('username') == 'admin') {
return true;
}

if (!empty($this->params['pass'][0])){ // ユーザー名
if ($this->Auth->user('username') != $this->params['pass'][0]) {
return false;
}
}

return true;
}

こんな感じとか?


621:nobodyさん
09/02/07 23:48:49
URLリンク(book.cakephp.org)

622:nobodyさん
09/02/08 00:16:52 XBcxfvCP
TRPGオタしか喜ばなそうな上記説明を熟読すれば、
「マニュアル/開発例/ACL~」のサンプルで
id:1のUserのみがuser_id:1のPostを編集できるようにできるんですか?

623:nobodyさん
09/02/08 01:12:57
>>622
「TRPGオタしか喜ばなそうな上記説明を熟読すれば、」ってことは、
ちゃんと読んでないのか。
マニュアルくらい読めよw

それとも読めないくらい馬鹿なの?ww
もしそうだったらごめんねwww


624:nobodyさん
09/02/08 02:18:10
>>622
マニュアルの更なる理解のために「指輪物語」を読破するんだw

625:nobodyさん
09/02/08 02:30:48
formヘルパーで、複数のテキスト入力boxを
1行に並べるのって、どうするの?


626:nobodyさん
09/02/08 04:45:10
>>625
自分でフォームを書く

627:nobodyさん
09/02/08 04:56:26
>>626
えっ、マジ?

628:nobodyさん
09/02/08 11:29:47 XBcxfvCP
いや、読んだ上で言ってるんだが。。。

これだとテーブル単位では大丈夫だけど、レコード単位での権限の設定が
できないんじゃないかと思うんだが、違うのか?

なんか、ここはレベル低いなぁ。

629:nobodyさん
09/02/08 11:49:57
その処理は、自分で書くんだよ。
自分が投稿したやつだけ編集できるって。
当たり前だろ。

管理者は全員のものを編集できるかもしれないし、
別に編集者という人を作るかもしれない。

誰が何を編集できるかを決めるのはお前。
よってお前がそういうコードを書く。OK?

レベルが低いのはお前。

630:nobodyさん
09/02/08 12:03:59
>>625
tableタグ使うと$form->text()を1行に並べること出来るよ。
後は、app/webroot/css/cake.generic.cssの内容を自分の好みに編集するだな。
(でも、なんでCakePHP1.2のdefaultのcssはこんなに変態なのだろ?)

631:nobodyさん
09/02/08 12:10:49
'div' => 'false' とかで横に並べられた気もするが・・・

> (でも、なんでCakePHP1.2のdefaultのcssはこんなに変態なのだろ?)
同意。デフォルトのフォントの大きさとかマージンとか
各ブラウザの間での違いを吸収する程度にしておけばいいのに。


632:nobodyさん
09/02/08 12:17:33 XBcxfvCP
>>629

> その処理は、自分で書くんだよ。

いや、書かなきゃならないのは、最初からわかってるよ。
でも、どこに書けばいいのかがわからない。

isAuthorized()やbeforeFilter()に書くのか?

633:nobodyさん
09/02/08 12:21:23
チケットを投げるんだ。

Summary: "cake.generic.css" looks like hentai
Type: RFC

634:nobodyさん
09/02/08 12:23:13
>>632
ご飯から食べるか味噌汁から食べるか。
好きにしろw

635:nobodyさん
09/02/08 13:06:23
>>631
<?php
echo $form->text('hoge0', array('div' => 'false'));
echo $form->text('hoge1', array('div' => 'false'));
echo $form->text('hoge2', array('div' => 'false'));
?>
これでは縦に3つ並んでしまったが、こんな書き方ではないのかな??

636:nobodyさん
09/02/08 13:29:45
>>628
レベルが低いのはお前の頭

637:622
09/02/08 13:32:48 ByGZ6/FB
>>632
教えてやるから土下座して「自分の頭の程度が悪うございました」とPCの前で言え

単にACOにmodel,foreign_keyを目的のレコードのものに設定して登録して、
AROとACOの関係を定義するだけ
ACO登録位置は種類考えて適宜選べ

関係の定義とチェック関数については>>622に書かれてる

638:621
09/02/08 13:33:26 ByGZ6/FB
622じゃなくて621だった

639:nobodyさん
09/02/08 14:40:18
CakePHPで掲示板作れます?

640:nobodyさん
09/02/08 14:43:20
>>639
お前は何を言っているんだ?

641:nobodyさん
09/02/08 14:45:17
>>640
質問しているのです。

642:nobodyさん
09/02/08 15:03:43
>>641
はいはい、ソーデスネ。
次のネタが思いつかないので、マジレスする。
作れます。
以上。



643:nobodyさん
09/02/08 15:04:30
>>639
ベタのPHPで作るより、短時間で、高機能(Ajaxなど)な掲示板が作れますよ。
がんばってください。

644:nobodyさん
09/02/08 16:07:39
>>642-643
がんばります!

645:nobodyさん
09/02/08 16:20:11
自分の頭の程度が悪うございました

646:nobodyさん
09/02/08 16:26:13 SHT1by4H
バリデーションで、一つのフィールドに対して、
複数のルールを設定していた場合に、
一つのエラーが検知した場合以降の
バリデーションはおこわないことは、出来ますか?

例えば、期間の入力があった場合、入力値が正しく
なかった場合、その後の妥当な期間であるかどうかの
チェックはいらないのですが。

647:nobodyさん
09/02/08 16:41:27
>>644
これから始めるなら、この本お勧め。
「CakePHP徹底入門」 CakePHP1.2で説明してあるから、とても楽に入門できた。
URLリンク(www.amazon.co.jp)徹底入門-イージーゲート/dp/479811717X
↓このページも入門者にお勧めかな。
URLリンク(kuri6005.sakura.ne.jp)

648:nobodyさん
09/02/08 16:53:37
>>646
URLリンク(book.cakephp.org)
'last' => true

649:nobodyさん
09/02/08 17:20:04
>>648
ありがとうございます。
すみません。
しっかりと説明されていますね。
もっとちゃんと読まないといけませんね。

650:nobodyさん
09/02/08 17:46:55 srWubjja
携帯対応ページを作ろうと思って、/m/でリクエストされたら携帯ページを表示ってやろうとしていて
表示はうまくできたんですけど、PC用ページのフォームで、
$form->create('post', array('action' => 'view'));
ってやったときに、$this->dataにデータが入っているときは、
action="/post/view/1"とかになるんだけど、データが入ってないと
action="/m/post/view"って/m/が先頭につけられてしまいます。
プログラム中で/m/をつけてるのはroutes.phpで
Router::connect('/m/:controller/:action/*", array('prefix' => 'mobile'));
としているとこだけなんだけど、$form->createってここを見てURLを
自動生成してるんでしょうか?
だとしたらどうやったらうまく解決できるんでしょうか?

651:nobodyさん
09/02/08 18:01:22 srWubjja
すんません、Router::Connectをコメントにしたらちゃんとうごきました。
ということは$form->createではこれをみてURLを生成してるんですね。
携帯、PCの両用サイト作ってる人はどうやって解決してるんでしょうか?

652:nobodyさん
09/02/08 21:16:52
>>647
ご丁寧にありがとうございます。
明日の夜にでも本屋に行ってこようと思います!

653:nobodyさん
09/02/08 21:59:25
URLリンク(cakephp.jp)

654:nobodyさん
09/02/08 22:39:55
>>635
うちもそれ試した。3行になっちゃった。
やっぱ、>626の言う通り、自分で
フォームを書かないといけないのか・・・マンドクセ

生年月日を入力させるのに、セレクトメニューでは
不便なので、直接「年」「月」「日」の数字を
入力させたいのね。
何か、簡単な方法ある?

できれば、年号(MTSH)が付いてると西暦に直して
欲しいんだけど・・・(そこまで求めるのは無理か。)


655:nobodyさん
09/02/08 22:49:40
素のhtmlのタグを、cake流に変換するようなフィルタとかあればいいなー

656:nobodyさん
09/02/08 23:14:43
>>654
'div' => false にして、出てくるフォームが改行されるのは、FormHelperの問題と違う。
CSSでそう指定してあるから改行される。

input {
clear: both;
}

みたいな感じで。

いっぺん、読み込んでるCSSファイルを移動するなりして、読み込めないようにしてみろ。


657:nobodyさん
09/02/09 00:07:57
>>656
CakePHP1.2の変態cssをとっぱらったら、'div' => 'false'を付けなくてもtextBoxが1行に
ちゃんと3つ並ぶ。質問者はCakePHP1.2の変態cssを突破してtextBoxを1行に並べる方法を
質問しているのだと思う。
<?php
echo $form->text('hoge0');
echo $form->text('hoge1');
echo $form->text('hoge2');
?>
<br>
<br>
<?php
echo $form->text('hoge0', array('div' => 'false'));
echo $form->text('hoge1', array('div' => 'false'));
echo $form->text('hoge2', array('div' => 'false'));
?>

>>654
自分でフォームを直接書いたとしても、CakePHP1.2の変態cssの壁に阻まれると思う。
敵はCakePHP1.2の変態cssだと思う。変態cssを攻略するのが近道。

tableタグを使うと変態cssの中でもtextBoxを1行で表示できる。が詳細なレイアウトを
調整しようとすると変態cssと戦わざるを得ない。
<table>
<tr>
<td><?php echo $form->text('hoge0'); ?></td>
<td><?php echo $form->text('hoge1'); ?></td>
<td><?php echo $form->text('hoge2'); ?></td>
</tr>
</table>

658:nobodyさん
09/02/09 00:13:00
何で変態CSSのために
無駄な労力使ってるんだw

659:nobodyさん
09/02/09 00:18:41
>>658
暇で他にやる事もないので、チョットやってみただけ。

660:nobodyさん
09/02/09 01:19:15
てことはCSSを、YUIとかのリセットに変えればいいだけか

661:nobodyさん
09/02/09 02:53:29
>>659
じゃあ僕のサイト作るの手伝ってくれません?


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch