У меня есть форма, которая представляет таблицу 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'
Мне нужно знать, как редактировать передаваемые данные для unlockedFields
чтобы они могли игнорировать эти поля, которые связаны с отношениями hasMany.
Благодарю.
У меня была аналогичная проблема. Я обнаружил, что добавление (эквивалент) этого в контроллер RewardModifier выполнило трюк:
public function beforeFilter(){ $this->Security->unlockedFields = array('RewardOption'); }
Добавление в код формы для меня работало
$this->Form->unlockField('User.id');
Разблокирование полей из файлов вида также помогает beforeFilter()
контроллер beforeFilter()
.
Источник: /core-libraries/helpers/form.html#FormHelper::unlockField