またどこかでCTOっぽいことやってる人のブログ

フリーランスを経て、またどこかでCTOっぽいことをやってる人が書いてます。何か色々やってます。

CakePHP3でunlockFieldとやらを使ってみた。

実はJavaScriptも嫌いです。
嫌いなものばかりなのにエンジニアとか言ってていいんでしょうか。
いいとか悪いとかではなく、ここまで来てしまうと言い続けるしかありません。

さて、本題。
なんですが、今回のネタは合っているのかどうかよくわかりません。
「何かよくわかんないけどできちゃったぞ」的なものなので、その辺りご了承ください。

やりたかったこと

hidden項目として設定したフィールドに対して、AjaxとかJavaScriptとかでごにょごにょした結果を格納してSubmitする。

結果

Securityコンポーネントから怒られた。


困りました。非常に困りました。
困ったのですが、そりゃデフォルトの値が書き換えられてるわけなので怒るのも当たり前です。
だってSecurityコンポーネントですもの。
でも、どうにかしたい。

よくある対応方法

対象のActionが実行された時にSecurityコンポーネントをOFFにすれば動きます。
なんですが、Submitするってことは何かしらの編集処理なわけなので、そのActionをまるっとOFFにするのって引っかかります。
それが正しい処理なのかもしれませんが、個人的にはちょっとアレです。

なのでSecurityコンポーネントをOFFにする書き方は書かないことにします。
気になる方はGoogle先生にお申し立てを。

今回やってみた対応方法

「書き換え対象のフィールドだけSecurityコンポーネント対象外にする」というやり方です。
ここでやっとunlockFieldが登場します。

公式にはこんな風に書いてあります。

セキュリティ - 3.x

unlockedFields
POST バリデーションを解除したいフォームフィールドの一覧をセットします。 このコンポーネントの他にも、 FormHelper::unlockField() でも解除できます。制限が解除されたフィールドは、POST 時に必須ではなくなり、 hidden フィールドの値もチェックされません。

ナニソレ、イミワカンナイ。


この説明で他の方々わかるんですかね。
自分にはさっぱり理解できませんでした。


理解できない時はとりあえず色々アレコレ書いて試すタイプなので、色々試しました。
「あー。もうできないからPOSTする時にモデルからもう一回取得すっかな」などと邪なことも考えながら。

結局こんな風になりました

unlockedFieldsとやらをセットするのはView側です。
こんなソースにしてみました。

  <?php echo $this->Form->input('sample_id', ['type' => 'hidden']); ?>
  <?php echo $this->Form->unlockField('sample_id'); ?>

これだけです。
Ajaxで処理した時に上記ソースのsample_idに何か値がセットされます。
セットされてたら更新、されてなかったら新規登録みたいなことをやりたかったのです。
unlockFieldは何なんでしょうね。
無視しといて。よろしくみたいな感じなんでしょうか?
よくわかりません。

こんな書き方をすると、unlockFieldが有効になりSecurityコンポーネントさんも怒りません。
まぁとりあえずは結果オーライ、大勝利です。

合ってるのかなこれという不安は消えませんが、概ねいいでしょう。
正しい使い方を知ってる方いたら教えてください。