Отключение элементов ввода в форме CakePHP, использующей компонент Security и jQuery - PullRequest
3 голосов
/ 13 июля 2011

У меня есть форма в CakePHP, которая имеет два ввода текста в режиме реального времени.Каждый из них обновляет значение скрытого поля, когда пользователь выбирает результат.Модель называется Record, и задействованы следующие атрибуты:

  • budget_id
  • program_id
  • concept_id

Я создал форму , используя FormHelper следующим образом:

...
<?php echo $this->Form->create('Record') ?>
<h1>Create a record</h1>

<?php echo $this->Form->hidden('Record.budget_id', array('value' => $budget['Budget']['id'])) ?>

<?php echo $this->Form->hidden('Record.program_id') ?>
<?php echo $this->Form->input('Record.program_id_search', array(...)) ?>

<?php echo $this->Form->hidden('Record.concept_id') ?>
<?php echo $this->Form->input('Record.concept_id_search', array(...)) ?>

<?php echo $this->Form->submit('Send') ?>
<?php echo $this->Form->end(); ?>
...

Как видите, поля ввода, в которых хранятся атрибуты модели, скрыты.Окна реального поиска настраиваются с помощью плагина автозаполнения jQuery.

Следуя рекомендациям руководства CakePHP, я отключил два дополнительных поля в методе beforeFilter, так что компонент Security игнорирует их, и форма проходит проверку:

public function beforeFilter() {
  $this->Security->disabledFields = array(
    'Record.program_id_search',
    'Record.concept_id_search',
  );
}

Кажется, что CakePHP злится всякий раз, когда я изменяю значение скрытых входных данных из Javascript, и он отправляет меня в метод blackhole .Это нормально, согласно документации.

Но меня удивляет то, что компонент Security продолжает игнорировать мои disabledFields настройки.

Я искал в нескольких веб-источниках, и все указывают на disabledFields варианты.Но это не работает для меня.

Есть предложения?

Спасибо !!

ОБНОВЛЕНИЕ

Я нашел обходной путьно это действительно ужасноЯ заменил скрытые поля ввода обычными полями выбора, но установив свойство отображения CSS как none.

Таким образом, компонент безопасности больше не жалуется, и пользователь продолжает просматривать пару live-поискаящики.

Я не понимаю, почему изменение выбора с помощью Javascript это нормально, но изменение скрытого ввода - нет.

Ответы [ 2 ]

8 голосов
/ 22 сентября 2011

Это происходит потому, что Компонент безопасности блокирует скрытые поля, сохраняя в хэше не только их имя, но и их значение.Поэтому, когда вы изменяете их значение, вы делаете всю форму недействительной.Единственное решение состоит в том, чтобы переключить эти поля из скрытого в обычное поле, заключенное в display:none; div.

Другим способом было бы отключение проверок для этого поля, но отправленный вами код неправильныйспособ сделать это.Вместо этого вы должны указать поля во время настройки компонента, например:

var $components = array('Security' => array(
    'blackHoleCallback' => 'callback',
    'requireAuth' => array('action1', 'action2'),
    'allowedControllers' => array('controller'),
    'allowedActions' => array('action1', 'action2'),
    'disabledFields' => array('Record.program_id_search', 'Record.concept_id_search')
    )
);
5 голосов
/ 29 февраля 2012

Более простой способ решить эту проблему, который я только что обнаружил, - добавить 'secure' => false в массив атрибутов вашего ввода. Это предотвращает их добавление в список безопасных полей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...