【PHP】フレームワーク CakePHP 3ホール目【本命】 at PHP
[2ch|▼Menu]
[前50を表示]
550:nobodyさん
08/04/02 18:06:46
>>547
それは見た目を変えるだけだからビューの仕事だろうね。

モデルから戻ってきたデータとは、汎用的なfind関数の場合、

$data => array(
 モデル名 => array(
  フィールド名1 => 値1,
  フィールド名2 => 値2,
  フィールド名3 => 値3,
 )
)

こんな値が返ってくる。もちろん、これをそのまま
ビューに渡してもいいんだけど、これじゃあビューで使いにくい!
って言う場合加工する。

そんな場合あるのかって? 余り無いだろう。
そう、だからコントローラの仕事は少ない。

モデルから取得した値をビューに渡す$this->set(・・・) は
コントローラの仕事ね。

551:nobodyさん
08/04/02 18:07:42
>>549
必要なときにつけたりはずしたりする方法は、何度も既出

552:nobodyさん
08/04/02 18:11:37
>>548

だめなのか?

553:nobodyさん
08/04/02 18:12:12
>>546
なんでモデルでやるの?そのメリットは?

554:nobodyさん
08/04/02 18:21:49
>>553
もちろん、直接関係が無いモデルは別々に
アクセスするよ。

モデルというか処理の内容から考えて
一つであるべきと思う場合は一つのモデルでやる。

あと、トランザクションの為のメソッドが
モデルにあることも興味深いよね。

一連関係ある処理は一つのモデル内で完結させるものと
考えると、なるほどと思わない?

555:nobodyさん
08/04/02 18:23:17
>>546
モデルは複雑にすべきじゃないよ。な中規模設計したとき
アソシエーションで必ず問題起きそう



556:nobodyさん
08/04/02 18:27:56
>>555
その意見はわからないでもないが、

普通にRDBMSを正規化したとき
そういう関連(リレーション)は出来るもんなんだが・・・

RDMSを正規化すると複雑になってしまう。それがいやだから
それを解決する為に、O/Rがあるんだと思うぞ!

557:nobodyさん
08/04/02 18:28:26
×RDBMSを正規化したとき
○RDBMSでテーブルを正規化したとき

558:nobodyさん
08/04/02 18:32:44
>>546
ページ数が増えたとき、コントローラを増やすことができるけど
コントローラが増えた分モデルを増やすこと出来ないよ。
ひとつのモデルに書くコードが恐ろしく増えるね


559:nobodyさん
08/04/02 18:34:17
また例の馬鹿か?

560:nobodyさん
08/04/02 18:35:56
> コントローラが増えた分モデルを増やすこと出来ないよ。

言っている意味が、よくわからないんだが・・・

例えコントローラが無くてもモデルは作れるし、
一つのコントローラで複数モデルを扱うことも出来るんだが?

561:nobodyさん
08/04/02 18:43:36
全てはコントローラに処理を詰め込み過ぎたscaffoldが悪い。
あれがアフォに勘違いを植え込む。

562:nobodyさん
08/04/02 18:49:12
うーん、自動生成のコードとしては、これしかやりようがない所もあるのだろうけど、
コントローラに処理を詰め込みすぎというか、モデルに処理が何も無いのが
いけないんじゃないかな?

あれじゃ、単にテーブルに直接アクセスするネイティブな関数の
代わりのクラスにしか見えない。

一番、プログラマがいろいろ書くべきなのはモデルなのに。
逆に言えば、いろいろ書かないといけないものだからこそ
自動生成ではモデルに何もないんだろうね。
でもサンプル程度はほしいかも。

563:nobodyさん
08/04/02 18:53:30 KzinrGTW
debugを1以上にするとHTMLの一番最後に
<!-- 0.0012s -->
みたいに、生成時間?のコメントがつくんですけど
これを付けないようにするにはどうすれば良いんでしょうか?
debugは1にしておきたいです。

564:563
08/04/02 18:58:51
あ、webroot/index.php にありました。

565:nobodyさん
08/04/02 19:00:37
cakephpで作られたオープンソースみても
モデルで書かれてる処理はバリデータ関係の関数しかないんだけど

URLリンク(code.google.com)

566:nobodyさん
08/04/02 19:00:38
>>564
Do not changeって書いてあるけどねw

567:516,522
08/04/02 19:01:23 Ldo05SB7
ん?なんかいろいろゴチャゴチャしてきたけど、結局俺が主張してたことは正しかったのか・

「複雑な一連の処理」とかビジネスロジックとかって、たとえば俺の場合は
 ・@日足の株価を取得してRSIを計算する
 ・A与えられた条件引数に該当する銘柄の証券コード配列を取得(スクリーニング)
 ・B現在の株価を受け取り、あらかじめ計算しておいた目標価格の条件を満たすか判別
   ⇒・更に条件を満たしていれば、買い/売り注文をWEBサービスに投げる処理も「証券会社モデル」(仮称)というDBと連携しないモデルを作成して、HTTP(S)で注文するメソッドを書いてる。
 ・C現在の株価を取得する(楽天証券のRSSをDDE接続経由で呼び出すモジュールを別途使用)
みたいなアプリが持つほとんどの主要処理を言ってて、これらをモデル(またはビヘイビア)に記述するべきと思うのです。

逆に言えばコントローラは、
 ・Cの「現在の株価を取得する」メソッドからの返し値をそのままB「株価と目標を評価し、注文する」メソッドに引渡し仲介する
 ・ビューからリクエストがあった@などの計算処理をモデルメソッド@に引き渡す
 ・スクリーニング対象銘柄の証券コードリストを取得し、そのままAのスクリーニングメソッドに引き渡す。
くらいのことしかしていない。人間の世界でいうと「仲介人」かと。


568:nobodyさん
08/04/02 19:06:54
>>565
お前の目は節穴か・・・

ってかこのソースあまりいいとは思えないな

569:nobodyさん
08/04/02 19:08:08
OpenFLP
Rails 製のオープンソース版 Fastladder

モデル 382steps
コントローラー 910steps

コントローラーに処理書きまくってるんですが。。。


570:nobodyさん
08/04/02 19:09:00
じゃあ本家railsのソースコードみせてやる

571:nobodyさん
08/04/02 19:11:13
コントローラに処理を詰め込みが正論か非か
オープンソース見れば、すぐわかることだからな

572:nobodyさん
08/04/02 19:15:29
オープンソースといってもその質はピンキリだから

> じゃあ本家railsのソースコードみせてやる
おいっ! railsはフレームワークだ。
もともとビジネスロジックは含まれてない!

573:nobodyさん
08/04/02 19:18:52
>>567
全部コントローラで出来るし
それをCakePHPでやる意味がわからんw

574:516,522
08/04/02 19:46:05 Ldo05SB7
>>573
あー、「全部コントローラで出来るし」って言ってる時点でプロフェッショなるじゃないことが確定www
議論しても理解できないんだろうな、「できる/できない」ということと「(プロとして)やるべき/べからず」
といった本質的な点をwww

コントローラでも全部やろうと思えばできることくらいわかっとるわいwww

575:nobodyさん
08/04/02 19:58:32
>>574
CakePHPでやることじゃないことは確かwww

576:nobodyさん
08/04/02 21:14:45
ビジネスロジックはモデルに集約すべき
議論としては面白い
俺もその辺気になってた


まあ俺はbakeしたコードの拡張から入ったクチだから全部controllerに書いちゃうけどなwww

577:nobodyさん
08/04/02 21:37:43
>>576
俺もコントローラに書いてしまったけど、
作り続けていくうちに、なんか無理が出てくるんだよ。

なんでこんなに作りづらいんだ?って思っていたときに
このスレにあった、ケーキの絵。あれで悟りを開けた気がする。
あぁモデル中心でやればいいんだって。

578:nobodyさん
08/04/02 21:58:22
>>577
その絵ってどれ?

579:nobodyさん
08/04/02 21:58:46
>>562
モデルに書けって言うけど、何を書くの?
関数で書けばいいの?モデル内のメソッドとして?

>>565
の言うとおり、実例も無いし具体的なメリットが分からない。
今のところテストが楽って事はなんとなく分かった。

580:nobodyさん
08/04/02 22:16:06
>>578
これの3ページ目
URLリンク(cakephp.org)

581:nobodyさん
08/04/02 22:19:41
> 関数で書けばいいの?モデル内のメソッドとして?

モデル = ビジネスロジック用のクラス
なんだから、言うまでも無くメソッドだろ

582:nobodyさん
08/04/02 22:22:03
>>580
ありがとう,でもコントローラーよりモデルに重点おけよという一言で済む話かw

583:nobodyさん
08/04/02 22:26:19
>>581
そうすると、どう幸せになれるわけ?

584:nobodyさん
08/04/02 22:27:49
>>583
どう幸せになるかではなく、
どう幸せになりたいか。

貴方はプログラミングする上で、どうなったら幸せだと感じる?

585:nobodyさん
08/04/02 22:57:59
railsはコントローラーに重点を置くようになってるのではなぜ?

586:nobodyさん
08/04/02 23:14:04
>>574
自分の安価間違ってね?516と522で筋が通ってない

587:nobodyさん
08/04/02 23:53:19
>>585
railsでもモデルが一番重要なものですよ。

588:nobodyさん
08/04/03 00:17:09
モデルが一番重要なんてCakePHPだけの話
松本に話したら鼻で笑われたよ

589:nobodyさん
08/04/03 00:38:13
松本といっても鼻の長いゾウをキャラクターにしている会社の松本だけどなw

590:nobodyさん
08/04/03 00:48:42
でもキリンさんも好きなんだろ?

591:nobodyさん
08/04/03 10:10:52 Z1Ohe4yI
ビヘイバ話はおわったのか?

592:nobodyさん
08/04/03 11:26:08
Model は特定の環境に依存しない処理を行う部分である。

593:nobodyさん
08/04/03 12:10:16
たとえばの話なんですが、
1.フォームから画像ファイルをアップロード
2.アップロード結果・画像ファイルの不正検知
3.2が成功時、元画像名をmd5したものをuploadsフォルダに保存
4.3のファイル名をimage_fileカラムに格納
という一連の処理があったばあい、
今現在はコントロールとコンポーネントに書いてますが、
モデルとビヘイビアに書くとしたら、
2->バリデータに記述
3->ビヘイビア
4->モデル
という感じなんでしょうか?


594:nobodyさん
08/04/03 12:26:23
ビヘイビアて1.2からだろ、
最初から無いってことは必要性が薄いてことだよな


595:nobodyさん
08/04/03 12:32:04
ソースが読みやすければコントローラーで全部書いてもいいし
モデルに書いて読みにくくなるなら、書かない方がいい
結局はソースを読みやすくするために分けてるだけの話


596:nobodyさん
08/04/03 12:32:23
画像アップロードできるビヘイビアあるよ。
正確には画像を保存できるビヘイビアだけどね
URLリンク(bakery.cakephp.org)

597:nobodyさん
08/04/03 12:50:28
結局はソースを見やすくする為にある。
一番見やすいソースとは、なるべく何も書かないこと。

画像をアップロードして保存というのは、本質的には
テーブルに画像フィールドを作ってそこに格納することと変わらない。

だからフィールド追加作業以外は、一切処理を変更しないで
作れるというのが一番理想的。

ビヘイビアを使えば、>>596のようにActsAsにわずかなフィールド情報を
設定して終わりだけど、その他の方法でここまでスマートに作れるかな?

598:593
08/04/03 13:32:44
>>596-597
ありがとうございます。
こりゃ1.2にチャレンジしなきゃだな

599:nobodyさん
08/04/03 13:49:15 Z1Ohe4yI
>ビヘイビアて1.2からだろ、
>最初から無いってことは必要性が薄いてことだよな

正確には1.1の頃からビヘイビアのディレクトリは用意されてたんだよな。
おそらく必要性はあったのだけど、1.1.xのステイブル版までに実装できなかっただけなのでは?


600:nobodyさん
08/04/03 14:22:02
railsにはビヘイビア相当になるものが無いんだが、どうして

601:nobodyさん
08/04/03 15:14:18
ビヘイビアてベネズエラにいる俺の愛人と同じ名前だ

602:nobodyさん
08/04/03 15:38:42
>>600
Rubyではmixinという言語機能でビヘイビア相当のことが出来るから。

603:nobodyさん
08/04/03 17:41:48
マニュアル»CakePHPによる開発»Models»Introduction
URLリンク(book.cakephp.org)

> Model behaviors provide a way to mix in functionality

へぇ、behaviorsはmix-in的な機能を提供するものだったんだ。なるほど。

604:nobodyさん
08/04/03 18:10:28
>>603
きちんとした日本語訳サイトあるのに。。。

605:nobodyさん
08/04/03 18:23:11
>>604
どこに?



606:nobodyさん
08/04/04 20:03:22 GG6uDHIa
わっふるわっふる

607:nobodyさん
08/04/05 04:54:50
cakeでのMC棲み分け例としては以下がありますよね。
個人的にはいい感じだと思いましたが、どうでしょう?

CakePHPを使ったMVC設計のベストプラクティス
URLリンク(www.sooey.com)

608:nobodyさん
08/04/05 05:21:49
MVCモデルのMが重要なのはデータ加工の多いWEBだけのはなしであって
MVCモデル全般的な考えではない


609:nobodyさん
08/04/05 05:24:58
データをあまり使う必要のないWINアプリを
MVCモデルでわけた場合はCが中心となる

610:nobodyさん
08/04/05 09:45:41
Web用のフレームワークのスレで何言ってんだこいつw

611:nobodyさん
08/04/05 15:00:48
MVCのVが重点となるソフトをあげてみよ

612:nobodyさん
08/04/05 15:07:51
rails発のMVCモデルはMがDBと密接な関係であるが
最強のモデルとは思っていない。
最適なモデル構造というには、まだまだ完成度が低いとrails作者は言っている


613:nobodyさん
08/04/05 15:49:00
>>607
面白いけど
これ通りに書いたら一覧性下がりそうだな
大規模なら修正には強くなりそうだね

まずは体に叩き込んでみるのがいいのか

614:nobodyさん
08/04/05 20:57:16
>>611
> MVCのVが重点となるソフトをあげてみよ

静的なウェブページ

615:nobodyさん
08/04/07 17:32:08
ゆくゆくはcake使いたいけどあと8時間くらいしか時間ないし
今は勉強してる暇も無いからとりあえず平で書く
ってときに、最低限これだけ守ってコード書いとけば
あとでcakephpを使いたくなってもまあなんとかなるよ という
ポイントを教えて

616:nobodyさん
08/04/07 17:50:23
Cake同様のライブラリが揃ってるってなら、そんな事も可能だと思うが・・。
無理じゃね

617:nobodyさん
08/04/07 18:06:48
データベースの主キーはIDだけにしておく

618:nobodyさん
08/04/07 18:28:13
それはコードなんだろうか
とにかく規約ぐらい把握しないと無理だよね
結局出来るのはDBの設計ぐらいじゃないかと

コードも処理部分は多少使いまわせるだろうけど

619:nobodyさん
08/04/09 22:36:27 0zi6cM/k
CakePHP内でfindAll、findAllByを使っていますが、重いのでチューニングできないかと
考えています。

それで、実際に発行されているSQLと、可能であればアクセスパスを確認したいの
ですが、なにか方法がありますでしょうか。

620:nobodyさん
08/04/09 23:44:43
デバッグモードを2に変更。実行したsqlが見れます

621:619
08/04/10 00:04:23 ysAxvq3P
>>620
確認できました! ありがとうございます。

622:nobodyさん
08/04/10 10:23:53
Model->query()で以下のようなSQLを発行すると
$sql = <<<EOF
  SELECT
    `Foo`.`id`,
    SUM(`Bar`.`hoge`)
  FROM `bars` AS `Bar`
  LEFT JOIN `foos` AS `Foo` ON (`Bar`.`foo_id` = `Foo`.`id`)
  WHERE `Foo`.`id` IN (1, 2, 3, 4, 5)
  GROUP BY `Foo`.`id`
EOF;

連想配列の添字がおかしくなるのですが、回避はできないのでしょうか

array(
  '0' => array(
    'Foo' => array('id' => ***)
    '0' => array('SUM(`Bar`.`hoge`)' => ***) ←ここ
  )
  .
  .
  .
)

623:nobodyさん
08/04/10 10:42:01
>>622
なんかqueryなんか使わないで、find()で出来そうな気がするんだが?
queryだとRDBMSごとの違いを吸収できないことがあるのでお勧めしない。

んで、試してないんで間違っている可能性が高いんだが
$sql = <<<EOF
  SELECT
    `Foo`.`id`,
    SUM(`Bar`.`hoge`) as `Bar`.`hoge`
以下同じ

じゃだめかな?

内部的には帰ってくるデータのフィールド名がどうなっているかを判断して
連想配列に入れているようだから、SUM関数とか使うとフィールド名が
CakePHP的に想定外になる。それが原因じゃないかな?

ちなみに、この、 as `Bar`.`hoge`の文字列の部分がRDBMSによって違うので
考えなしに使ってしまうと、RDBMSごとの違いを吸収できなくなる。
(たしかPostgreSQLだとas Model__Field)
もちろん、MySQLにだけ対応していればいいのなら、問題ないけどね。

624:nobodyさん
08/04/10 11:29:33
>>623
レスありがとうございます
alias噛ませる方法は私も試してみたのですが
FROM `bars` AS `Bar`の宣言と被っているためエラーが返ってきます。

hasManyで繋がっている集計先テーブルの条件指定なども追加したい場合
CakePHPの作法だとどのようにするべきなのでしょうか?

625:nobodyさん
08/04/10 11:53:32 BE:39571564-2BP(2)
参照の参照がうまくいかない。
たとえば、PostのViewにユーザ名だけでなく、そのユーザが所属するグループ名を表示したい場合、どうすればいいんだろう?
Post.id
Post.user_id−参照→User.id
      ←取得−User.username
          User.group_id−参照→Group.id
      ←取得−−−−−−−−−−− Group.groupname

User.usernameを表示する場合は、$post['User']['username']でいけるっぽいけど、
じゃあ、そのユーザのグループ名はどうやって取得すればいいんだろう?

他にも、グループ名のリンクをクリックしたときに、そのグループに所属するユーザ
(User.group_idの値がGroup.idの値と等しいユーザ)User.usernameの一覧を作成するときとか
どのように書けば良いんだろうか?

MVCにしろ、SQLにしろ始めたばっかで全然わからないや。

626:nobodyさん
08/04/10 15:04:31
>>625
Post -> User -> Group という順番に適切なアソシエーションが設定されていれば、芋づる式にデータは取ってこれる。

やってるけど分からないなら>>620が書いているように、デバッグモードをonにしたほうがいい。

その質問の仕方だと、何をどこまでやって分からないのか分からない。

627:nobodyさん
08/04/10 22:22:07
>>624
とりあえず、
SUM(`Bar`.`hoge`) as `sumhoge`
これだと、
Array([0] => Array([0] => Array([sumhoge] => 6)))
となるよ。


まとめて書くなら、
$query = array(
'conditions'=>array(
'Foo.id'=>array(1,2,3,4,5),
'1=1 GROUP BY Foo.id'
),
'fields'=>array('Foo.id','SUM(Bar.hoge) as sumhoge')
)

$this->Bar->find('all',$query);

って感じかな

628:nobodyさん
08/04/10 22:25:44
まあ、SUMつかったせいで、
どこのモデルのデータかという情報が消えてしまい、
0という名前のモデル名になるってだけで
おかしいわけじゃないんだけどな。

今回はBar.hogeのSUMだからモデル名はBarになるべきだと
思うかもしれないけど、SUM(`Foo`.`hoge` + `Bar`.`hoge`) という
書き方だって出来るわけだし。


629:nobodyさん
08/04/11 00:29:36
なるほどなんで0になるんだとか悩んでた
しかし、扱いにくいのはたしかなんだよね

630:nobodyさん
08/04/11 01:18:44
BakeとかBakeryとかCheeseCakeなんていう、楽しげな製菓製パン用語の中にあって、
Scaffoldなんていう土建屋みたいなネーミングはいかがなものかねぇ。
いくらRoRのパクリとはいえ、違う名前でもよかったんじゃないかな。
なぁんて、チラシの裏w。

631:nobodyさん
08/04/11 01:32:12
じゃあスポンジケーキ?

632:nobodyさん
08/04/11 01:40:16
>>625

私も初心者ですが、私の場合はVIEWの最後に、

<?php print_r($post); ?>

というデバッグ出力を出して確認しながらやってます。

あ、確認は「ソースの表示」をした方が分かり易いかも。
秀丸など、UTF8等のキャラクタセットに対応するエディタが必要ですが。

633:nobodyさん
08/04/11 02:27:45
Vista以降はもう
NET Framework 3.0がWEBサイト最強のフレームワークになるな
PCのWEBサイトはC#じゃないと追いつけないわ
そしてPHPなどの下級言語は携帯サイトでしか使用されなくなる

634:nobodyさん
08/04/11 02:39:04
Windows Server 2008の発売で
asp.netの注目度がかなり上がってる
どう考えてもPHPから3Dにも強いasp.net(C#)に移行するだろうな

635:nobodyさん
08/04/11 02:40:09
CakePHPなんてやってる場合じゃないぞ
時代遅れ君たち

636:nobodyさん
08/04/11 04:43:59
なんだ? いきなりこいつは? 話ズレまくりで滑ってるな。

637:nobodyさん
08/04/11 04:57:27 OBoZ/5C8
>>635
代わりに、なにがいま時代の最先端なの?

638:nobodyさん
08/04/11 13:47:57
世間で何が流行ろうと、CakePHPはCakePHPでいいじゃん。

別に、すでにCakePHPで作ったものをC#に置き換える必要は
ないんだし。

639:nobodyさん
08/04/11 15:17:40
C#で作ったって動かないサーバーが多いしな。

640:nobodyさん
08/04/11 17:09:12
先輩がた教えて下さい。

mysql の max 関数を使うには cakephp ではどのようにすればよいでしょうか。
よろしくお願いします。

641:nobodyさん
08/04/11 22:44:28
$this->モデル名->クエリ(SQL文、false);

642:nobodyさん
08/04/11 23:41:35
queryは普通使わないだろw
findといえ

643:nobodyさん
08/04/12 13:37:27
>>642
自分も、するんだったらクエリ発行するしかないと思ってたんだけど、
使った事がないので書かなかった。

findでmax関数ってできるの?

644:nobodyさん
08/04/12 14:39:58
>>632

<?php echo pr($post) ?> がおすすめ

645:nobodyさん
08/04/12 15:57:22
>>643
$this->Model->find('all',array('fields'=>array('MAX(id)')));


>>644
<?php pr($post) ?>でいいよ

646:nobodyさん
08/04/12 16:42:32
cakeって、queryを使ったら死刑!くらいの気持ちが無いと駄目なの?

647:nobodyさん
08/04/12 19:44:31
だってqueryってSQL直で発行だよ?
せっかく、CakePHPのデータベース用ドライバが、
RDBMS間の差を吸収しているのに
フレームワーク使っている意味半減するじゃん。

648:nobodyさん
08/04/12 21:28:23
>>635
ある意味正解!だがまだ時代が追いついてきていない。

やっぱO/Rマッピングでは無理があるということだ
C#も3.0の言語仕様拡張で突き抜けた感があるしね
LINQとかラムダ式とかJavaの真似っこでない次元に到達した。

でも現状は糞言語PHPで本当に馬鹿みたいなコーディングするしかないけどな。

649:nobodyさん
08/04/12 21:50:24
>>648
中身がまったくない。知っている用語を羅列しただけ
自作自演の可能盛大。0点。出直しましょう。

650:nobodyさん
08/04/12 21:53:16
>>647
>> RDBMS間の差を吸収しているのに

一つのシステムに複数のRDBMSを跨ぐ様な事なんて殆どないけどな。
まぁ、極力queryを使わないほうがいいのは同意。


651:nobodyさん
08/04/12 21:55:24
同じコードで、いろんなデータベースに
対応できるってことを言っているんだろ。馬鹿か。

652:nobodyさん
08/04/12 22:14:35
素直にRailsつかったらいいのに

653:nobodyさん
08/04/12 22:22:03
railsかぁ。二年ぐらい前なら、それだけの価値はあったかもしれないが。

654:nobodyさん
08/04/12 23:15:20
DBにべったりガッツリ依存しまくってるフレームワークってないのかな
割り切った設計で可能な限り使いやすさと速度の両立を目指すという

655:nobodyさん
08/04/12 23:24:15
そのRailsだって難しい事はSQL直発行しろってスタンスだろ
Zendに至ってはプレースホルダのSQL直発行がメイン

findごときで収まるクエリだけなら世話ねーの

656:nobodyさん
08/04/13 00:28:23
だからむずかしいことだけSQL発行すればいいんだよ。

Zendの場合、O/Rマッパーそのものがない。
あれはフレームワークというよりライブラリだから。

657:nobodyさん
08/04/13 11:48:16
なんかCakePHP以前の事をお聞きするのですが・・・。

前々スレ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;'));


658:nobodyさん
08/04/13 13:07:44
<form action="/コントロール名/アクション名/" method="POST">

<input type="submit" value="検索">

入力欄は$html->inputなどを使う事

659:658
08/04/13 13:18:37
action="<?= $html->url('/コントローラ名/コントローラメソッド名')"

だった。すいません

660:657
08/04/13 14:18:45
>>659

ありがとうございます。
ただ、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'];
(以下略)


として対処する事にしました。


661:nobodyさん
08/04/13 19:11:09
>>651
同じコードで、いろんなデータベースに対応できるから極力queryを使わないほうがいいって言ってんだろ。馬鹿か。


662:nobodyさん
08/04/14 02:08:03
CakePHP1.2を昨日から使い始めました。
それで、$formがまだよくわかっていないのですが、$form->radioで
1つ目にcheckedをつける場合、どのように指定すればいいのでしょうか?


<?php echo $form->radio('Bookmark.access',
array(1=>'公開','非公開'),
array('legend'=>false, 'separator'=>' ')); ?>


663:nobodyさん
08/04/14 11:45:13
>>662
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をつけるといけると思う。

664:nobodyさん
08/04/14 17:25:15
radioでvalueつけると、二つ目にチェック入れて
入力エラーで戻ってきたときに、
また一つ目がチェックされるのよね。

665:nobodyさん
08/04/15 00:36:29 kB0aZEdA
Cake1.2でのAuthComponentの使い方などで、なにか良いチュートリアルがあれば教えていただけませんかー?
もし可能であれば、ACLのうまい活用の仕方もわかると嬉しいです
ペコリ

666:662
08/04/15 01:18:18
>>663
inputの例を参考に、2つ目のarrayに'value'=>'1'を追加して、うまく行きました。
ありがとうございます。

667:nobodyさん
08/04/16 13:10:23
Ver1.2でshellsの中でコンポーネント使うにはどすればいいの?

668:nobodyさん
08/04/16 16:28:26
App::importでなんでもござれだが、
そもそもshellsの中でコンポーネントを使うのが問題ではないのか?

コンポーネント = コントローラの汎用的処理、
つまり処理の内容はコントローラそのものなわけで、
シェルの中からコントローラを呼び出すというのがちょっと疑問な処理。

コントローラの処理にリダイレクトするという考えでrequestActionを
呼び出すという考えもありとは思うが、
そもそもそれはモデルにおくべき処理なのかも知れないぞ。
ちなみにシェルからモデルを扱うには、usesプロパティを使用するだけでOKだ!

669:nobodyさん
08/04/17 18:54:40 YR2rN8Sk
ところでみんなはShellsはどんな使い方してるの?
俺の場合は、定期的にcronで叩いて、指定ディレクトリに生成された大量の一次データをDBに取り込む作業、とか。



670:nobodyさん
08/04/17 19:48:58
今日はじめてcakeつかったけどさ、mysqlのセキュリティを下げないとつかえないじゃん
オワタ

671:nobodyさん
08/04/17 21:32:22
釣りに嘲笑レスだが、セキュリティを下げるって何したの?w

672:nobodyさん
08/04/17 21:35:44
>>669
旧システム(フレームワーク未使用)から新システム(CakePHP)への
データコンバートに使った。

あとは簡易なツールかな。たとえば入力した単語の単数形⇔複数形 などをするツール。

673:nobodyさん
08/04/17 21:42:54
>>671
これが釣りに見えるとは・・
おまえの知識がよくわかるわ
#sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

674:nobodyさん
08/04/17 22:03:43
知識うんぬん以前に、お前何も言ってないじゃん。
セキュリティを下げるというだけで、それ以外のまともな情報が何もない。
だから馬鹿にされるんだよ。

で、それのどこがセキュリティ下げてることになると思ってんの?w
互換性とセキュリティの違い、理解しようね。

675:nobodyさん
08/04/17 22:25:09
>>674
( ゚д゚)ポカーン


676:nobodyさん
08/04/17 23:10:06
>>673

どういう意味?
sql-modeをこれに設定したって事?

677:nobodyさん
08/04/18 00:13:14
>>676に書いてあることがコメントされずに初期設定されている
これをコメントアウトすることによってセキュリティを甘くせざるを得ないわけよ
このモードをはずさないとcakeのコードからワーニングがでる。
cakeに潜んでるバグで作者は修正予定らしい

678:nobodyさん
08/04/18 00:16:50
>>676
横レスですまんが、すっげぇ要するにMySQL5系の設定で
STRICT_TRANS_TABLESを指定していると、SQLの構文チェックを
厳密にするんだけど、このままだとCakePHPの吐くSQL自体でエラーが出るんよ。

んだから今の所は構文チェックを緩くしないとCakePHPが動作しないって事。

>>670の説明で分かった奴はエスパー。

679:676
08/04/18 00:24:11
>>678
の説明でようやく分かったw

680:nobodyさん
08/04/18 00:33:10
名無しのままでいいからもっといじったほうがいいよ676さんは

681:nobodyさん
08/04/18 00:34:11
1.挨拶を自分からしない・できない・やろうと思わない
2.リアルではおとなしいのにネット上では態度がでかい。
3.自分の意見で地球が動いてると思ってる。自分の意見はみんなの意見。
4.自分に非があってもスグ言い訳、逆切れ。他人を攻撃する。威嚇することで自分の弱さを隠している。

682:nobodyさん
08/04/18 01:17:05
>>678
つまり、セキュリティの問題じゃないってこと?

683:nobodyさん
08/04/18 01:18:01
>>682
つまり、日本語わかるか?

684:nobodyさん
08/04/18 01:18:11
っていうか、MySQLの仕様変更だし。
CakePHPのバグでもセキュリティの問題でもない。

685:nobodyさん
08/04/18 01:27:47 UgH30Z6m
アホが大量発生しとりますな。
CakePHPとはスレ違いだし

686:nobodyさん
08/04/18 01:28:35
まあ、>>670がアフォってことでいいじゃんかw

687:nobodyさん
08/04/18 01:46:12
>>673のsql-modeの値がデフォルトになっているのは、
Windows板でインストーラーを使ってインストールした場合のみ。
本当のデフォルトの値は厳密モードじゃありません。

いい加減Windowsは卒業しろよw

688:nobodyさん
08/04/18 02:46:06
>>682
んーと、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なー。

689:nobodyさん
08/04/18 04:25:34
それってセキュリティとは言わないと思う

690:nobodyさん
08/04/18 04:45:08
.thtml 派? .ctp派?

今でもぼくは

.thtml 派。

691:nobodyさん
08/04/18 08:30:04
>>690
1.1系から乗り換えた当初は.thtmlにこだわってたけど(てか気づかなかった…)
.ctpに切り替えたら1日で慣れた

やっぱり5文字の拡張子は長すぎるよね

692:nobodyさん
08/04/18 08:37:15
>>689
だから広義の意味っつってんじゃん。日本語理解できてる?
Perlでコードの安全性を高めるためにuse strict;するのと一緒だよ

693:nobodyさん
08/04/18 09:07:33
>>691
レスまんくす!

では、僕も次のサイト作りから ctp 派 になります♪

694:nobodyさん
08/04/18 09:12:53
>>692
広義の意味でもセキュリティの問題じゃない。
俺俺定義すんなw

695:nobodyさん
08/04/18 09:15:03
>>692
広義といえばどんな主張でも通ると思ってる厨房発見。

696:nobodyさん
08/04/18 15:39:38
メールフォームとかで

//入力画面
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 を与えるしかないのでしょうか?
入力項目がいっぱいあるとめちゃくちゃ大変な気がするのですが…。

697:nobodyさん
08/04/18 16:19:29
findByなどで、hasManyでくっついてきたレコード数をカウントしたい場合、
どのようにすればよいのでしょうか?

698:nobodyさん
08/04/18 18:21:08
1.1系でmode内でorderとかconditionを設定できないの?

class Post extends AppModel {

protected $order = "Post.created DESC";

とかでfindしても駄目なんです。

699:698
08/04/18 18:21:29
すいませんmodel内でです

700:698
08/04/18 19:03:12
もう少し分かりやすく言うと、モデル内でSQLの検索条件(where句)に縛りを入れたいです。

701:nobodyさん
08/04/18 19:27:37
うっ・・・だめ。もう・・もう・・・もうでる。 モデル

702:nobodyさん
08/04/18 19:50:15
モデル内に

function find_name_only($cond = "name like '%tarou%'"){
return $this->findAll($cond);
}
を書いてごまかしてみました。
ほかにいい方法があるのでしょうか?

703:nobodyさん
08/04/18 20:00:26
>>696
まだ始めて2週間しかたってないけど。

form.thtml
<?php echo $html->input('Form/name'); ?>
で、どう?

あと、$this->set('data',$this->data); は、要らないとおも


704:nobodyさん
08/04/18 20:05:29
>>697
count( $model['Model']['HasManyModel'] )
かな?

705:697
08/04/18 21:22:22
>>704
これは取り出した後で、PHPのcount関数で配列の要素数をカウント、ということでしょうか?

そうではなくて、
たとえばfindAllするときに取得順などにHasManyModelのカウント数を使いたいのですが。
質問の文章がわかりづらくて申し訳ありません;
よろしくお願いします。

706:nobodyさん
08/04/18 21:42:58
>>705

おそらく、自分でクエリを書かないといけないでしょうね。


707:697
08/04/18 21:47:07
>>705
やはりそうですか;
せっかくフレームワークを使っているのでできればクエリは書きたくないですね・・・

UsersをPostsの多い順に並べ替える、など、結構よく登場すると思うのですが;

708:nobodyさん
08/04/19 01:00:18
> UsersをPostsの多い順に並べ替える、

やってないけど、これは、findAllの条件にexistsなんたらって書いて
countだせばいいとだろうから、一応findAllは使えるな。
半分ぐらいしか意味ないけど。

709:nobodyさん
08/04/19 01:16:45
>>707

それか、1回データを取り出した後で件数をキーにした連想配列に入れかえるのはどうでしょうか。
配列の添え字を、

$array[$count .' - ' .$id]

こんな感じにして配列をソートしたら出来そうですが。


710:nobodyさん
08/04/19 10:26:43
>>707
> UsersをPostsの多い順に並べ替える、など、結構よく登場すると思うのですが;

ちょうど同じような事例を考えていた。

顧客とその顧客の取引データが一対多でつながっている場合に
取引が多い顧客を見たいと。

で、いろいろ考えたんだが、顧客数や取引が多くなると重くなりそうなので、
(だって内部的には顧客ごとにデータ数えて、その数でソートするんだろう!?)
非正規化することになるが、顧客データの中に取引数フィールドを作ることにした。

あとは取引データ保存時、つまりモデルのafterSave時に、
顧客テーブルの取引数フィールドをいじればいいと。

フレームワークを使っているとこういうトリガー的なことを
データベースに依存せずにやれるから良いね。

711:697
08/04/19 11:37:16
>>ちょうど同じような事例を考えていた。

奇遇です!

なるほど・・・あえて非正規化する、と。
手元にある参考書に
「処理効率を考えて、あえて非正規化することもある」
と書いてあった意味がわかりました。

たしかに、毎回自分でクエリ書くのに比べたら、
冗長なデータを持っておくくらい、なんてことないですね!
目からウロコでした!

712:nobodyさん
08/04/19 11:39:14
DB使ってる意味ねぇw

713:697
08/04/19 11:50:08
>>712
では、他に何かいいアイデアがあるのですか?

714:nobodyさん
08/04/19 12:22:29
俺は自分でクエリを書いたほうが断然面白い。


715:nobodyさん
08/04/19 12:31:41
1.2を入れてみたのですが、

function index() {
$data = "テスト";
$this->set('data', $data);
}

とやっただけで

Allowed memory size of xxx bytes exhausted ...

が出てしまいます;

CakePHP叩きではなく、本当に困っています。
対処法を教えてください。

716:nobodyさん
08/04/19 12:38:01
>>715
その程度のコードで、そのエラーが出るときは、
基本的にバグだと思ったほうが良い。

まあ環境のせいもあるからとりあえず聞くけど、
OSとPHPのバージョンと、php.iniの設定(もしくはini_get('memory_limit'))の値)

function index() {
echo 'aaa';exit;
}
とやるとどうなるか。

index()以外のコードはどうなっているか。

717:nobodyさん
08/04/19 12:42:21
>>712
> DB使ってる意味ねぇw

DB使うことが目的じゃないからね。
DBは所詮データの保存先に過ぎないし。



718:715
08/04/19 12:47:34
>>716
レスありがとうございます。

どうやらbakeで生成したビューをそのまま使っていたことが原因だったようです;
スレを汚してしまってすみません;;

719:nobodyさん
08/04/19 13:08:09
>>717
じゃファイルベースでやりゃいいじゃん。やらない理由は?

720:nobodyさん
08/04/19 14:35:19
CakePHP でPEARを使うとき
依存PEARがうまく発見できないのですが、
どうすればよいのでしょうか?
php.iniのinclude_pathには
app/vendorsを追加してあります。

721:nobodyさん
08/04/19 17:44:54
>>719
> じゃファイルベースでやりゃいいじゃん。やらない理由は?

フレームワークがファイルベースに対応していないから。
(読み書きできないということではなく、モデルが対応していないということ)

722:720
08/04/19 18:05:22
すんません;
事故解決しました。

723:nobodyさん
08/04/19 19:37:01
>フレームワークがファイルベースに対応していないから。
ユーザが自由に選択することもできないってこと?
強制的にDB使用?
CakePHP糞FWすぎるwwwww

724:nobodyさん
08/04/19 20:20:16
流れ読まずにすみません。

CakePHPで作られてるサイトで有名なところを見てみたいのですが、
教えていただけませんか?
たしかNiftyのなんかがCakeだと聞きましたが・・・

725:nobodyさん
08/04/19 21:00:48
mozillaのサイトとか

726:nobodyさん
08/04/19 23:46:04
>>723

君頭大丈夫かね?

CakePHPは別にデータベースを使用する必要は無い。
ただデータベースを使ったほうが効率がいいだけだ。
それがファイルベースでやらない理由。

どうやら君は素人なのだろう。


727:nobodyさん
08/04/20 00:01:18
>>711
非正規化は、一般的な業務システムでもよくやるな。

ただ、明らかに正規化をさぼってて、テーブルのカラム数が100個超えているのを
「性能を考えて非正規化している」と言い張る人はカンベンしてほしい。
あぁごめん。cakePHPの話から逸脱した。

>>723
どこか忘れたけど、コントローラあたりの設定で、DBを使わないようにもできたはず。
だれか補足頼むw
特殊な使い方でもしない限り、あんましメリットはなさそうだね。

728:nobodyさん
08/04/20 00:32:54
>>726
相手を見下さないと精神を保てない糞FWユーザ涙目www

729:nobodyさん
08/04/20 00:33:33
図星だったのか? その反応は。

730:nobodyさん
08/04/20 00:34:22
モデルが貧弱なCodeIgnitorよりは
CakePHPの方が実用的に見て優れているな。

731:nobodyさん
08/04/20 00:46:44
>>728
フレームワークに問題が無い話をしているのに
糞FWとか言っているようじゃ
説得力皆無だゾ

732:nobodyさん
08/04/20 01:31:23
>>723
だからDB使わない事もできるって。
デフォルト設定がDB使用になってるだけで、全然強制じゃない。

URLリンク(www.1x1.jp)

ファイルベースの設定方法は、わざわざ書かなくてもいいよね?


>730
CodeIgnitorを使いたい人は使えばいいし、CakePHPを使いたい人は
使えばいいし、それだけの事。
CodeIgnitorは機能が少ない分、実装がシンプルで軽いのが特徴なんだから、
機能的に足りていれば、そっちでもいいでしょ。

733:nobodyさん
08/04/20 01:35:00
ちいたん最強

734:nobodyさん
08/04/21 16:11:05 Hc1e0Bqc
追加の検証が必要な不確実な情報
俺のコードに問題がある可能性もあり。

1.2.0.6311-beta のデフォルトのセッション管理(ファイルベース?)

Configure::write('Session.save', 'cake');

のとき、同時に複数のアクセスがあるとロックされるかもしれない。
つまり、一つの目のアクセスで長い処理を行っていると
二つ目のアクセスがロックされ一つ目が終わるまで実行されない。

Session->read()で待たされる。

Configure::write('Session.save', 'database');にして
DBベースのセッションにするととりあえず回避できる。

関係ないとは思うがPostgreSQLの場合。


735:nobodyさん
08/04/21 16:34:17
PhpNutいなくなっちゃったの?

736:734
08/04/21 19:37:53
よく考えたら、ロックされるほうが正しいのか。

アクセスしたユーザーはロックされるが
他の人(ようするにセッションファイルが違う人)は
ロックされないようだ

737:nobodyさん
08/04/22 13:08:38
初歩的な質問で申し訳ありません。

bakeで作ったコントローラをみると

$this->Session->setFlash(__('hogehoge.', true));

のようなコードがありますが

この__() や後ろのtrueは何を意味しているのでしょうか?
もしかするとcakePHPに限ったことではないかもしれませんが、
よろしくお願いします。

738:nobodyさん
08/04/22 15:52:58
>>737
多言語化機能。

/app/locale/jpn/LC_MESSAGE とその周辺あたりに言語ファイル
.po や .mo を置くと、hogehogeが翻訳される。

多くはビューで使われるため、<?php __('hogehoge') ?> と簡便に書くことが出来るようになっている。
この場合、言語ファイルがあると、hogehogeが翻訳されて”出力”される。
第二引数にtrueを指定すると出力せずに戻り値として返すという意味。

これと似たやり方は、CakePHPだけでなく、PHP以外でも良く使われ
多くは _('hogehoge')という書き方をする。

PHPではgettext関数の別名として_()関数が使用できる。
URLリンク(jp.php.net)

CakePHPではこのやり方を独自に拡張しており、
関数名がアンダーバー二つになっている。


739:nobodyさん
08/04/22 15:54:09
おまけ。翻訳手順。poeditを使った場合。

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 を直接翻訳ファイルとして使える。

740:nobodyさん
08/04/22 18:29:42
>>737

いい質問。俺も初めてしった。

>>738,739

素敵だわぁ

741:737
08/04/22 18:43:22
>>738-9

丁寧なレスをありがとうございます。

CakePHPにはまだまだ知らない機能があるんですね。
いろいろ楽しみです。

742:737
08/04/22 18:44:53
アンカーの付け方間違えました・・・
マウスオーバーしないようにお願いします;;

743:739
08/04/22 18:56:32
一つ言い忘れた。.pot .po .mo とかの .で始まるやつは
ドットで始まるファイルではなく、拡張子という意味で書いた。

デフォルトではdefault.poやdefault.mo になる。
それぞれのファイルのdefaultの部分を変更することも可能。

abc.mo の場合、その場合、__d('abc', 'hogehoge') という書き方で
出来ると思うがやったこと無いので/cake/basics.phpでもよんどくれ。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4327日前に更新/213 KB
担当:undef