トップページ⇒php
1002コメント356KB

【PHP】フレームワーク CakePHP 17ホール目【v3α】

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2014/08/02(土) 21:57:41.01ID:LI0DdohH
CakePHPは、Ruby on Railsの概念の多くを取り入れた、高速開発とPHPの機動性を兼ね備えたフレームワーク
質問するときはCakePHPのバージョンを書きましょう

※他フレームワークとの比較等はスレ違いです

■本家
http://www.cakephp.org/
APIドキュメント
http://api.cakephp.org/
github - cakephp
http://github.com/cakephp
the Bakery
http://bakery.cakephp.org/
cookbook(マニュアル)
[3.x] http://book.cakephp.org/3.0/
[2.x] http://book.cakephp.org/2.0/ja/
[1.3] http://book.cakephp.org/1.3/ja/
Twitter
https://twitter.com/cakephp
Facebook
https://www.facebook.com/CakePHP

■日本語公式
http://cakephp.jp/
フォーラム
http://cakephp.jp/modules/newbb/


※前スレ
http://kanae.2ch.net/test/read.cgi/php/1393661004/
02022002015/01/16(金) 15:28:30.64ID:???
>201
199の例文に合わせただけだよ
モデル名も入れた君の例なら取得側が
$this->request->data['model_name']['field_name']
になるってだけ
0203nobodyさん2015/01/17(土) 19:58:26.44ID:???
なゆあかか
0204nobodyさん2015/01/18(日) 01:38:43.72ID:YMMCDK0S
すいませんが相談させてください。
wordpressでとあるポータルサイト(1日のPVは1,000程度)を運営しているのですが、
今後、数十万件以上(WPのカスタム投稿で)のデータを登録する予定となったので、
wordpressで構築するのは負荷的に耐えられないのかと思い、
CakePHPで構築しなおそうと思っています。

という状況なのですが、CakePHPにしたからwordpressよりも早くなるとは限らず、
むしろ遅くなる可能性もあるのでしょうか?
(フレームワークとしてCakeにこだわってはいないので、採用するのは他のフレームでも構いませんが)
ググってみたりはしたのですが、この比較対象がおかしいということもあるのか、
比較記事は見当たらず、私自身がCakeの事を本質的に理解出来ていないこともあり、困ってしまっています。
WPの中で生のSQL文を書いて、直接データ登録・取得・表示するのが良いのかなと
アホみたいな事も思い始めていますが・・・・

ちなみに私自身のスキルとしては、以下の感じです。
DB:基本的に大抵のことは出来て問題無い、テーブル結合とか検索とかの事は生のSQL文を書ける
PHP:wordpressのテーマを自分でガリガリとカスタマイズして外部からの入力フォーム・表示フォームとかは自分で作成しているが、難しい事は分からない
HTML・CSS:他サイトを見よう見まねで学んでいる状態で、ちゃんと理解出来ていない事が多い
0205nobodyさん2015/01/18(日) 01:53:17.52ID:???
>>204
お前は「そんな可能性はない」と言われたらCakePHPにするのか?
そうじゃないだろう?

だったらなぜまず試さない?
試してみて遅かったら、その原因を聞きにくるというのがやり方じゃないか?
もちろん、聞きにくるときは、それなりの情報を出しながらだが
0206nobodyさん2015/01/18(日) 13:36:16.56ID:???
>>204
CMSとフレームワークの違いがわかってないのかな?
wordpressはCMSの部類でコンテンツ管理する仕組みが既に入っているけど
cakephpみたいなフレームワークは言ってみりゃ単なる便利ライブラリ集だから
コンテンツ管理する仕組みとかは全部自分で実装しなきゃいけないよ
0207nobodyさん2015/01/18(日) 17:42:38.18ID:???
脆弱性作り込んでそう

そんなあやふやな知識で博打を打つくらいなら
DBのチューニングやPHPアクセラレータの導入などしてWordPressの高速化をはかるほうがマシだと思う
翻訳止めるだけでも結構速くなるしな

DBからの読み出しメインのサイトなら、
前段にvarnishやnginxを置いてリバースプロキシキャッシュでも使えば?
0208nobodyさん2015/01/19(月) 00:27:11.87ID:???
>>204
そもそもPHPで作るのが間違い
0209nobodyさん2015/01/19(月) 18:10:55.81ID:oaFQh/MS
2015/02/02
⇒OK

cakePHPの正規表現でこの日付型文字列の入力のみOKとするには
どういうコードを書けば良いでしょうか?


2015/2/2
⇒NG
0210nobodyさん2015/01/19(月) 19:25:44.90ID:???
>>209
cake関係ないじゃん
0211nobodyさん2015/01/19(月) 19:59:44.14ID:oaFQh/MS
>>210
どうやって判定すれば良いのでしょうか?
0212nobodyさん2015/01/19(月) 20:18:16.07ID:???
>>211
validationの方法は一通り知った上での質問なんすか?
0213nobodyさん2015/01/19(月) 21:40:22.05ID:oaFQh/MS
>>212
はい、教えてください。
0214nobodyさん2015/01/19(月) 23:55:25.95ID:???
じゃあカスタムバリデーションルール作って
public $validate = array(
 'myDatetimeCheck' => array(
  'rule' => '^[0-9]{4}\/[0-9]{2}\/[0-9]{2}$',
 )
);
みたいにすればいいのでは
このパターンはケタ数しかチェックしてないから日付には使えないけど
0215nobodyさん2015/01/20(火) 00:39:05.11ID:MQEJ/fBy
>>214
サンクス


正規表現が苦手なんだよね
0216nobodyさん2015/01/20(火) 00:56:53.90ID:???
>>215
俺も得意ではないけど頭の体操がてらやってみては

ただ実際には4/31は?とか閏年じゃ無い年の02/29は?とか言う問題が出てくるから
正規表現でもできるとは思うけど
cakePHPのVaridation::dateと二段構えにするとか
カスタムバリデーションでphpのcheckdateを通すとか工夫は必要になるかも
0217nobodyさん2015/01/20(火) 13:50:15.77ID:???
お、ひさしぶりにおもしろそうな質問発見!
Validation.php見ればわかるけど日付のチェックは閏年を考慮した正規表現一発でやってるよ
適当に改造してみるとこんな感じ

$separator = '(/)';
$regex['ymd'] = '%^(?:(?:(?:(?:(?:1[6-9]|[2-9]\\d)(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))' .
$separator . '(?:02\\1(?:29)))|(?:(?:(?:1[6-9]|[2-9]\\d)\\d{2})' .
$separator . '(?:(?:(?:0[13578]|1[02])\\2(?:31))|(?:(?:0[1,3-9]|1[0-2])\\2(29|30))|(?:(?:0[1-9])|(?:1[0-2]))\\2(?:0[1-9]|1\\d|2[0-8]))))$%';

改造ポイント
・セパレータは/しか認めない
・西暦2桁表記をNGに変更
・月の1桁表記をNGに変更
・日の1桁表記をNGに変更

書いといてなんだけど、理解できないようなら素直に文字列分解して
4年は〜100年は〜400年は〜のロジック入れればいいよ
0218nobodyさん2015/01/20(火) 22:12:54.49ID:uK/q/RsU
管理画面を AdminController.php として定義してガリガリコードを
書いているのですが、ソースコードの行数が増えてきて
Eclipseで編集する際にフリーズを感じます。

この様にコードが増えて来た場合には
コントローラ名を分けるしかないのでしょうか?
0219nobodyさん2015/01/20(火) 22:23:48.18ID:???
アクションの数が増えたっていう話なら
機能ないし利用するモデルごとに分ける
プリフィックスルーティングでも使えばいい

メソッド一つ一つが長くなっているなら
コンポーネントやモデルや独自のサービスクラスに処理を移すことを考える
0220nobodyさん2015/01/20(火) 22:51:22.09ID:uK/q/RsU
>アクションの数が増えたっていう話なら
>機能ないし利用するモデルごとに分ける
>プリフィックスルーティングでも使えばいい
こっちの事象です。

プリフィックスルーティングとか初めて聞きました。
こちらを探して試してみます。
0221nobodyさん2015/01/25(日) 13:55:32.77ID:???
eclipseが重いところにルーティングいじっても何も解決しないと思うのは俺だけ?
URLが変わってもいいなら、普通にコントローラ分割すればいいし、
URL変えるわけにはいかないなら、"修正中だけ"別コントローラで作って
完成したら1つに戻せばいい
大きなライブラリを使ってるならeclipseから見えない場所に移動させるとか
コーディング以外にも工夫のしようはあるだろう
0222nobodyさん2015/01/25(日) 18:50:35.80ID:???
プリフィックスルーティングの話は
複数のコントローラに分割した上でhttp://example.com/admin/から始まるURLを使いたかったらってこと
AdminControllerなんて名前をつけてるのはURLの都合だろうと思ってね

eclipseが重くなるほど1つのファイルのソースコードが増えてるってのが本当なら
1つのコントローラに管理画面の全てを詰め込む設計はまずいだろうし
0223nobodyさん2015/01/26(月) 11:10:30.59ID:ZT64LJ1C
以下のページを参考に画像のアップロード機能を試しています。
なぜかファイルをアップロードしようとすると「save」ファンクション
が認識されずにエラーになってしまいます。

http://www.tailtension.com/cakephp/1512/

【エラーの出るコントローラの中のコード】
//画像の保存
if($this->Post->save($this->request->data))
⇒ここでエラー

【エラー内容】
Fatal error: Call to a member function save() on a non-object in

【捕捉】
コントローラ名は、 TestController.phpで
定義したアクション名は、 update_image です。
0224nobodyさん2015/01/26(月) 13:32:11.28ID:???
>>223
CakeというよりPHPのエラー通りだと思うけど

そのコントローラでPostモデル呼んでないだけじゃない?
0225nobodyさん2015/01/26(月) 18:47:51.81ID:/y+cf3Fd
cake2.5.8でプロシージャをコールし、out変数を受け取りたいんだけど、
query使ってバインド変数で受け取れますか?

Oracleでやったことのある方がいたら教えていただきたく……
Oracle以外でも、ヒントになるやもしれませんので、教えてくださったら助かります

なんでOracleなのにcakeにしてしまったのか……
0226nobodyさん2015/01/26(月) 20:09:16.40ID:OoDGdBhC
>>224
サンクス

結局プレーンなPHPを使ってアップローダを作る事にしました。
0227nobodyさん2015/01/29(木) 00:13:39.62ID:rYg0zKsM
設計について相談です。
会員登録ページやログインページのURLが
/users/add
/users/login
だとします。

会員情報の変更は、会員専用ページにログインして行えるとします。
その場合、会員情報の変更はどういうURLが適切なんでしょうか?

通常は/users/editだと思いますが、少し違和感があります。(ログイン中に操作するので)
mypagesを作ってプラグイン化して/mypages/users/editみたいにする事も出来るでしょうが、
その場合は、会員用のコントローラー(UsersController.php)がだぶる気がします。

ログイン前のページ・ログイン後のページと分ける設計の場合、
どういうコントローラーとアクション構成にすれば良いと思いますか?
0228nobodyさん2015/01/29(木) 20:58:50.89ID:???
2.xでSQLServerで使用している方いますか?

NULL許可、デフォルトNULLと設定したカラムでデータを省略してinsertした際の
挙動で困っております(当方2.6.1)。

CREATE TABLE [dbo].[items] (
[id] int NOT NULL IDENTITY(1,1) ,
[name] nvarchar(200) NOT NULL DEFAULT (N'') ,
[type1] int NOT DEFAULT ((0)) ,
[type2] int NULL DEFAULT NULL ,
PRIMARY KEY ([id])
)

こんな感じのテーブルがあったとして、
$data['Item']['name'] = 'test';
$this->create();
$this->save($data);
とした場合、MySQLだとtype1,type2ともにDBに設定したデフォルト値でInsertが行われます。
SQLServerの場合、「Conversion failed when converting the varchar value 'NULL' to data type int.」
という理由でエラーとなります。
発行されるSQL文で、SQLServerの場合はNULLをシングルコーテーションで囲む必要が無いのに
囲んでしまっているというのが原因のように見えますが、これを回避する方法はありますでしょうか?
0229nobodyさん2015/01/31(土) 21:52:23.62ID:r0T1vu8n
バリデーションについてです。
バリデーションエラー時のメッセージにフォーム入力の値を使いたいのでですが
以下$valueの部分はどのように書けばいいのでしょうか?

public $validate = array(
'name' => array(
'isUnique' => array(
'rule' => array('isUnique'),
'message' => $value . 'は挿入済みです。',
'required' => true,
)
)
);
0230nobodyさん2015/02/02(月) 22:50:58.85ID:???
>>229
そういうのは出来ない。view側で分岐すべし
0231nobodyさん2015/02/03(火) 15:50:31.15ID:???
>>229
コールバックbeforeValidateで処理するか、
独自のバリデーションメソッド作るか、お好きな方で。
02322292015/02/04(水) 18:25:08.07ID:???
>>230
>>231

ありがとう。
ビューで$this->validationErrors['モデル名']のループまわすことで対応しました。
0233nobodyさん2015/02/04(水) 22:31:45.65ID:HkYqZDdt
現在、cakePHPで入力内容を保存する際にどうすれば良いか悩んでいます。
普通の文字は問題無いのですが

「"」や「>」はサニタイズしてDBに保存するのか
それとも、エスケープしてDBに保存するのか


どちらが一般的なのでしょうか?
0234nobodyさん2015/02/04(水) 23:47:57.07ID:???
>>233
HTMLエスケープのことを言ってるなら
HTML出力時にエスケープするのが定石
DB保存時にHTMLエスケープしたりはしない
0235nobodyさん2015/02/04(水) 23:58:09.18ID:???
入力内容をHTMLタグを含まないテキストとして出力する場合はそのまま保存して出力時にエスケープするべき
入力時のチェック・処理だけだとその後の処理によってスクリプトの文字列が生成される可能性があるので根本的な対策にならない
入力値サニタイジング後の値を逆手に取るセカンドオーダー攻撃なんてものもある

HTMLタグを許可する場合に根本的な対策をするには構文解析して必要な要素を抜き出す必要がある

https://www.ipa.go.jp/security/vuln/websecurity.html
ここにIPAが出してる安全なウェブサイトの作り方というPDF資料がある
クロスサイトスクリプティングの項目が参考になる
0236nobodyさん2015/02/05(木) 00:01:18.00ID:???
cakeの作法通りにコーディングしているなら、
そういった処理は特に意識しなくても勝手にやってくれる
嘘だと思うなら、ブログチュートリアルの記事追加で
君の思いつく限りの変な文字を入力して保存、表示をしてみるといい
どんな入力をしようと問題なく動作するはず

自動でやってくれないのは
・DBがEUC-JPなのに入力に�@を使うとかの特殊なケース
・SQLを文字列で直接書いている
・ヘルパーを使わずに変数を出力
こういったときは自分でサニタイズ、エスケープ等が必要になる
0237nobodyさん2015/02/05(木) 00:10:53.62ID:kXXlZufE
>>234 >>235 >>236
皆さん詳しくどうもありがとうございます。

入力 > 確認 > 登録 or 戻る

の処理の一連の流を作っているのですがユーザが 「"」を入力した場合に
文字列が途中で端折られる為に、どうしようか悩んでいました。
0238nobodyさん2015/02/05(木) 00:11:24.20ID:???
ブログチュートリアルも出力時にエスケープしてるな
htmlspecialchars()のラッパーがあるから楽でいいね
http://book.cakephp.org/2.0/ja/getting-started.html#id7
0239nobodyさん2015/02/05(木) 00:13:20.68ID:???
あー、229の内容はちょっと興味があったんだけどもう解決してるのか・・・
$thisを使うためにコンストラクタで$validate定義したら一応うまくいったとだけ言っておく

てきとーに回答のなかったものにも答えておく

>>225
記事内容はMySQLだけど参考になると思う
http://blog.xole.net/article.php?id=711

>>227
正解も間違いもないような話題はリアルのチームメンバーと話し合ったほうがいいと思うよ

>>228
SQLServerは環境がないから試せないけどDBのデフォルト値を設定したくなければ
create()の代わりにclear()を使うといいかも
バージョンが古くてメソッドがない場合はcreate(false)で
0240nobodyさん2015/02/05(木) 00:52:32.89ID:mACTgUNt
$message_hoge に

「彼は"おはよう"と言った」

という文字列が含まれていたとして
確認画面で<span></span>の中に確認メッセージを表示させて

「戻る」が押された場合に、最初の画面のメッセージ入力エリア(textarea)に
ままの「"」が表示された形で

「彼は"おはよう"と言った」

を出すには、�Aを使う事によりうまくいきました。
ここで疑問なのですがそもそも�@と�Aの違いは何なのでしょうか?

�@ Sanitize::clean($message_hoge);
�A h($message_hoge);


うーん、文字列で事象の説明が難しいです。。。
0241nobodyさん2015/02/05(木) 01:06:39.73ID:???
サニタイズとかいう単語フワフワしすぎてるからもう使うのやめたらいいのになってよく思う

h()の実体はhtmlspecialchars()
http://php.net/manual/ja/function.htmlspecialchars.php
https://github.com/cakephp/cakephp/blob/master/lib/Cake/basics.php#L202-L234

Sanitize:クラスはCookbookに説明あり
http://book.cakephp.org/2.0/ja/core-utility-libraries/sanitize.html#Sanitize::clean
0242nobodyさん2015/02/05(木) 01:12:45.87ID:???
ていうか迷うとしたらh()とSanitize::html()だと思うのだけれど
Sanitize::clean()は全く用途が違うメソッドでしょう

http://book.cakephp.org/2.0/ja/core-utility-libraries/sanitize.html#Sanitize::html

>このメソッドは、ユーザが送信したデータをHTMLの中に表示する準備をします。
>これは、ユーザがレイアウトを壊したり画像やスクリプトを挿入することを防ぐ上で特に便利な機能です。
>もし「$remove」オプションを true にセットした場合、データに含まれるHTMLのタグ等は全て削除されます。
>false にセットした場合は HTML エンティティとして表示されます。:
>文字をエスケープすることはエラーの可能性が低く、知られていない新しいタイプの攻撃に対して強いので、文字を取り除くよりもよい方法です。
0243nobodyさん2015/02/05(木) 01:26:53.54ID:???
というか、みんなViewでの出力時は<?php echo h($data); ?> みたいにしてるの?
echoするときにh()も書くなら、いっその事、DBに保存する前にサニタイズした方が良いと思うんだが。
beforeSave()で一括サニタイズできるし。それにエスケープさせたくない場合は復元すればいいだけだし。
0244nobodyさん2015/02/05(木) 01:30:01.34ID:???
また馬鹿が増えた……
0245nobodyさん2015/02/05(木) 01:34:06.94ID:???
サニタイズ脳の恐怖
0246nobodyさん2015/02/05(木) 01:34:15.37ID:???
”また”って事は最低二人の馬鹿がいるわけだな
0247nobodyさん2015/02/05(木) 01:54:17.98ID:???
{{ data }}
0248nobodyさん2015/02/05(木) 10:48:48.93ID:???
エスケープは必要なときにかけるのが基本だぞ
DBのデータをCSV出力したいとき、逆変換するのか
DBに入れないデータを表示するときは、表示のときにエスケープするのか

デートの前、家から出るときにコンドームしてるようなもんだぞ
途中でトイレいくときどうするんだ
やる前にまたゴムするのか、2重になっちゃうぞ
ってこと
0249nobodyさん2015/02/05(木) 11:04:33.13ID:MaFLMZhc
>>248
分かり易い!サンキュー

取り敢えず、 h() で要件を満たせました。

anonymosuに狙われたら一発アウトそうなセキュリティだけどw
0250nobodyさん2015/02/05(木) 17:00:36.25ID:???
2重コンドームワロタw
0251nobodyさん2015/02/05(木) 18:27:25.06ID:???
>>248
いつ生でしても良いようにピル飲んだらいいじゃない。

ってな感覚で事前エスケープしておくのは駄目ですか?
0252nobodyさん2015/02/05(木) 19:14:43.36ID:???
>>251
その辺は過去にさんざん議論されてて、結局アウトプットのときに
対処するのがベストプラクティスだねって結論が出てるんだよ。
0253nobodyさん2015/02/05(木) 20:06:21.10ID:???
>>252
でも、うっかり忘れて妊娠しちゃう可能性もあるよ!
0254nobodyさん2015/02/06(金) 00:02:00.29ID:???
わかったわかった
挿入直前自動コンドーム装着機能を持つ
テンプレートエンジンを使えばいいだろ
0255nobodyさん2015/02/06(金) 02:02:30.97ID:???
そしたら口に入れようとしたときもゴムがついて不便だよ
0256nobodyさん2015/02/06(金) 09:13:12.13ID:???
口からでも性病感染するから付けとけよ
0257nobodyさん2015/02/06(金) 21:09:55.08ID:XFfNnVZS
パイプカットすれば?
0258nobodyさん2015/02/07(土) 06:03:05.10ID:???
なんのスレだよ
0259nobodyさん2015/02/07(土) 14:20:33.66ID:???
セーフセックスでしょ?
0260nobodyさん2015/02/12(木) 19:19:14.90ID:+z/qvGfu
cakePHPで以下の様に検索ワードが複数あったとしても
自動で or and 検索する事は出来ますか?

参考になるサイトがあれば教えてください。

name = 'A' or name = 'B'

name = 'A' and name = 'B'
0261nobodyさん2015/02/13(金) 09:25:45.69ID:???
>>260
サーチプラグインで検索
0262nobodyさん2015/02/13(金) 11:24:53.34ID:???
>>259
相手がいないんだがこのスレに女の人いる?
Cake合コンとかできないかね
0263nobodyさん2015/02/13(金) 12:47:36.01ID:trE+wwbV
>>261
cakePHPオリジナルでは出来ないですか?
0264nobodyさん2015/02/13(金) 13:27:08.47ID:???
公式ドキュメントくらい読まな
http://book.cakephp.org/2.0/ja/models/retrieving-your-data.html#id5

あと、
name = 'A' and name = 'B'
は常にfalse
0265nobodyさん2015/02/13(金) 16:25:24.50ID:???
>>262
俺女だけどしても良いわよ。
0266nobodyさん2015/02/13(金) 20:17:11.72ID:hnonnNdg
>>264
OK
0267nobodyさん2015/02/14(土) 12:22:29.76ID:riWWWAwO
ユーザーテーブル(users)の設計で相談です。cakephp2系です。
ログインする時、「ユーザー名+パスワード」と「メールアドレス+パスワード」の2パターンが主に使われると思います。
管理人は前者の方法でログインし、一般ユーザーは後者でログインします。

usersテーブルが
id|username|password|email|role|created|modified
だとして、ユーザー名を使わないログインの場合は単純にusernameをNULLにして登録すれば良いんですかね?
それか、usernameにemailの値を代入するべきですかね?
でもその場合、文字数制限のバリデーションエラーが起きる気がします。
(それはroleの分類で回避すればいいことですが)

それか、usersテーブルひとつにまとめるのではなく、分けるべきでしょうか。
どのようにするのが良いかご意見お願いします。
0268nobodyさん2015/02/14(土) 12:58:10.84ID:???
>>267
ACLとかの権限関係をきっちり作るなら
あえて管理人だけ特別扱いする必要は無いのでは
02692672015/02/14(土) 14:04:25.83ID:???
>>268
ACLできっちりじゃなくて、単純にログイン方法を分けたいだけなんです。
0270nobodyさん2015/02/14(土) 17:22:20.07ID:???
>>269
俺ならメールアドレスパスワードに統一。
別に管理人ログインフォーム作成。
管理人フォームにはユーザー名とパスワード。
って感じにする。
02712672015/02/14(土) 17:33:06.70ID:???
>>270
はい。自分もそのような画面設計なのですが、>>267でも質問しました通り、
テーブルをどういう構造にしたらいいか教えてほしいと思いまして・・。
0272nobodyさん2015/02/14(土) 18:20:44.22ID:???
>>271
ヌルでいいよ。
名前のところにメールアドレスなんて入ってたら
次触る人がナンジャコリヤァアってなる。
02732672015/02/14(土) 20:15:38.73ID:???
>>272
分かりました。ではテーブル設計自体は問題無さそうですね。ありがとうございます
0274nobodyさん2015/02/14(土) 21:07:46.13ID:???
こいつのテーブル もうヌルヌルだぜ
0275nobodyさん2015/02/14(土) 21:59:10.14ID:???
フォーム分けるんだったら、テーブルも分けちゃえばいい、ってのはなしか?
0276nobodyさん2015/02/15(日) 00:53:41.16ID:???
ありだと思うよ。そもそも管理用と一般用では用途が違うからね。
0277nobodyさん2015/02/15(日) 14:50:48.71ID:1brRf+Il
cakePHP2を使っています。
ヘルパーを使ってボタンを出力しようと以下のコードを書いたところ
なぜかエラーが出てしまいます。

array() の部分を省いてボタン名だけの指定であれば動きます。
cakePHP2ではボタンにID、NAME属性を付ける事が出来ないのでしょうか?

[コード]
echo $this->Form->button("Edit",
array(
"id" => "id_hoge",
"name" => "name_hoge",
),
);

[エラー内容]
Parse error: syntax error, unexpected ')'
0278nobodyさん2015/02/15(日) 16:24:05.11ID:???
モデルとルールの違うGETパラメーターのバリデーションってどうしてる?
例えばモデル的には日付がdateカラムに入ってるんだけど
ユーザーが検索するときはyear:2014とか年号だけ指定して検索できなくて
yearが1970から2015までの値以外ならバリデーションエラーをだしたい時とか
ルールが同じならコントローラー側で動的にバリデーター呼び出すだけで楽なんだけど

>>277
配列なら最後に余計なカンマ入れられるけど
引数は最後に余計なカンマ入れるとエラーになる
02792772015/02/16(月) 02:27:00.96ID:vJjLQ3Jt
>>278
ありがとうございます!出来ました!!
0280nobodyさん2015/02/18(水) 19:23:06.50ID:4aEt4KO0
初心者なんだけど、公式ドキュメントのここ(http://book.cakephp.org/3.0/en/controllers.html)のこのコード

// src/Controller/RecipesController.php

class RecipesController extends AppController
{
public function popular()
{
$popular = $this->Recipes->find('popular');
if (!$this->request->is('requested')) {
$this->response->body(json_encode($popular));
return $this->response;
}
$this->set('popular', $popular);
}
}
の、if (!$this->request->is('requested'))って条件の「!」いらなくない?動かしてみたらやっぱりない方がちゃんと動くし。
ここで言ってもしょうがないんだろうけど、自分の考え方が正しいのか不安だから聞きたかった
0281nobodyさん2015/02/18(水) 22:49:27.06ID:???
バージョン3ってRC2にもなってたんだ
0282nobodyさん2015/02/19(木) 00:34:03.06ID:???
次で正式版みたいだね
0283nobodyさん2015/02/19(木) 01:12:24.31ID:???
根本的に変わってるから3.1までは様子みたい
0284nobodyさん2015/02/19(木) 04:45:09.33ID:???
>>283
ここまで変わると、他の言語に乗り換えるのもありだよなあ
0285nobodyさん2015/02/19(木) 17:29:51.85ID:???
cakePHP2を使っています。
コントローラでpaginateを使いたいのですが、
ビューに引き継ぐと、なぜか「order」が効いていません…SQLにも「ORDER BY」が出ていません
インターネットでいろいろ調べて試してみたのですが、結局うまく動かなかったです…
下記名前はダミーですが、こんな感じで書いているのですが、どこがおかしいのでしょうか?
どなたかおわかりの人教えてください><
もし下記だけじゃ情報が足りなかったらご指摘ください

≪コントローラ部分≫
$this->employee->virtualFields['group_age'] = 0;
$this->paginate = array('employee' => array(
'group' => array('employee_age','gender'),
'fields' => array('employee_name','gender','count(employee_name) as employee__group_age'),
'order' => array('employee__name' => 'desc'),
'limit' => 20 ,
));

$data = array('paginate' => $this->paginate('employee') );

$this->set("data",$data);
0286nobodyさん2015/02/19(木) 20:21:28.79ID:???
>>285
ごめんなさい
'order' => array('employee__name' => 'desc'),
この部分が、
'order' => array('employee__group_age' => 'desc'),
でした

よろしくお願いします
0287nobodyさん2015/02/19(木) 22:14:32.35ID:???
なんでgenderだけプレフィックスなしなんだろう……紛らわしいな
原因を断定はできないがとりあえず目についたところとしてはバーチャルフィールドの名前あってなくね?
1行目group_age、4,5行目がemployee__group_ageで揺れてんじゃん


あとこの4行目の配列の一要素目 'employee_age'じゃねーの?
Group Byに指定してない列は集計関数かませずにSELECT句にそのまま使えないでしょう
名前ダミーにすんのはいいけど正確に変換してくれよ
0288nobodyさん2015/02/20(金) 10:08:11.20ID:???
>>287
正確じゃなくてすみません

ありがとうございます、試してみます
0289nobodyさん2015/02/20(金) 19:16:31.11ID:mKx/fp25
PHPで検索した結果を元にHTMLファイルを作成しています。
生成したHTMLのコード上ではしっかりと

【test.html】
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type">

と記述しているのですが、ローカルにダウンロードして
サクラエディタで test.html を開くと右下に「SJIS」と表示されてしまいます。


【php側】
$html = {htmlコード;
file_put_contents("test.html", $html);


HTMLを生成しているPHP自体の文字コードも UTF-8 です。
なぜSJISになるのでしょうか?
0290nobodyさん2015/02/20(金) 22:35:03.17ID:???
CakePHP 2.6.1でCakeDCのSearch Plugin使おうとしてて
readmeに従ってつくったけど検索が機能しないです
parsedParams()をvar_dumpしてみると空だし
urlの引数が/id:10/user:hoge/とかの形式じゃなくて
?id=10&user=hogeとかになっちゃってるみたい
バグかなぁ… 英語でググったり何度かソース見返すけどわからないです…
この現象の原因わかる方いますか?
0291nobodyさん2015/02/21(土) 09:54:25.08ID:???
>>290
namedからqueryにデホルトの仕様が変わったんだよ
0292nobodyさん2015/02/21(土) 14:39:47.92ID:???
>>291
そうなんだ!動かない原因は別なのか…
もう少し探ってみます
ありがとうございまつ
02932892015/02/21(土) 14:53:33.16ID:gR4qq4TK
誰か教えてください。
0294nobodyさん2015/02/21(土) 15:38:23.20ID:???
エディタの問題じゃねえの?
02952892015/02/21(土) 15:44:22.51ID:gR4qq4TK
>>294
ありがとうございます。
解決しました。
0296nobodyさん2015/02/22(日) 17:44:38.17ID:???
composer 使ってる人ってこまめにアップデートしてるの?
下手にバージョン上げてもバグる原因増えるだけだと思いやってないんだけど。
0297nobodyさん2015/02/22(日) 19:27:47.08ID:???
何の為のバージョン指定だ
0298nobodyさん2015/02/22(日) 21:39:50.80ID:???
投稿フォームと投稿一覧が同じページ内にある掲示版的なものを作成しています。
入力欄が問題なく埋められていた場合、投稿フォームの「投稿」ボタンを押すと、コントローラーのaddが呼ばれてその投稿が追加されindexにリダイレクト、という動きはなんとかできたのですが、
入力欄の入力をバリデーションして不正なものがあった際に、indexのページ内の投稿欄にそのことを示すメッセージを表示するようにする方法がわかりません。
唯一思いついたのは、addのビューを投稿欄のみにしておいて、indexのビュー内からiframeで呼ぶことくらいです。
どなたかご教示頂けると幸いです。
0299nobodyさん2015/02/23(月) 00:25:29.64ID:???
>>298
投稿欄部分をajaxで書き換え
0300nobodyさん2015/02/23(月) 01:14:35.54ID:???
>>299
ありがとうございます。調べるうちに、バリデーションエラーの内容をセッションに書き込んでリダイレクト先でセッションから読み出して代入、という方法も見かけたんですがこっちの方がずっとスマートですね。
というか結果的にcakephp関係ない質問になってしまって申し訳ないです。
0301nobodyさん2015/02/23(月) 08:49:31.17ID:???
>>300
俺はいつもindexに書き込み処理をつけるね。
そういう場合。
0302nobodyさん2015/02/23(月) 12:35:39.33ID:???
MVCについてイマイチ自分が理解してないのもあって、てっきりcrudの4機能は別のメソッドに書かなきゃならないものなのかと思っていましたが、そうすれば全部解決なんですよね。
実は今回やってるものが非常に特殊なケースで、IE6対応も切り捨てられないため、ajaxでやろうとして困っているところでした。
■ このスレッドは過去ログ倉庫に格納されています