3

RewardModifierデータベース内のテーブルを表すフォームがあります。それRewardModifier hasMany RewardOption

私のフォームは次のように構成されています(画像):

ここに画像の説明を入力

そのため、RewardModifierはページ上に多くの要素を持つことができ、それぞれに多くのRewardOptionアイテムがあります。

問題

問題は、ユーザーが Javascript を使用してこのフォームのセクションを削除できることです。これにより、基本的にフォームが DOM から削除されます。これを行うと、POST されたフィールドがページの生成時に提供されたトークンと一致しないため、セキュリティ コンポーネントが壊れます。

今、私はunlockedFields以前にこれを処理するために使用していました:

$this->Security->disabledFields = array(
   'PrjRewardModifier.reward_id',
   'PrjRewardModifier.title',
   'PrjRewardModifier.option_type',
   'PrjRewardOption.description',
   'PrjRewardOption.modifier',
   'PrjRewardOption.amount'
);

非推奨であることは承知していdisabledFieldsますが、当面はそれを使用しています。

で投稿されたフォーム データをデバッグするとSecurityComponent、次のように表示されます。

(int) 8 => 'PrjRewardModifier.0.reward_id',
(int) 9 => 'PrjRewardModifier.0.title',
(int) 10 => 'PrjRewardModifier.0.option_type',
(int) 11 => 'PrjRewardModifier.0.PrjRewardOption.0.description',
(int) 12 => 'PrjRewardModifier.0.PrjRewardOption.0.modifier',
(int) 13 => 'PrjRewardModifier.0.PrjRewardOption.0.amount'

unlockedFieldshasMany 関係のキーになっているこれらのフィールドを無視できるように、渡されるデータを編集する方法を知る必要があります。

ありがとう。

4

2 に答える 2

4

同様の問題がありました。これを RewardModifier コントローラーに追加すると(同等の)、うまくいくことがわかりました:

public function beforeFilter(){
     $this->Security->unlockedFields = array('RewardOption');
}
于 2013-04-13T10:25:21.383 に答える
3

フォームコードに以下を追加するとうまくいきました

$this->Form->unlockField('User.id');

ビュー ファイル内からフィールドのロックを解除すると、コントローラーのbeforeFilter().

ソース: /core-libraries/helpers/form.html#FormHelper::unlockField

于 2016-03-30T19:23:52.993 に答える