Переключатель CakePHP Незаполненный изменен на нежелательное значение при отправке - PullRequest
4 голосов
/ 23 июня 2011

У меня есть этот элемент формы:

$form->input('ChecklistResponseGovernmentInfo.driversLicenseIsOnline', array('type'=>'radio', 'empty'=> true, 'options'=>array(0 => 'No', 1 => 'Yes')))

Это правило проверки:

'driversLicenseIsOnline' => array(
    'boolean' => array(
        'rule' => array('boolean'),
        'allowEmpty' => false,
    ),
),

И это поле базы данных для него (MySQL):

`driversLicenseIsOnline` tinyint(1) unsigned NOT NULL

Когда я впервые загружаю свежую копию своей формы, набор переключателей не выбран. Если я отправляю форму, ничего не делая, когда она перезагружается, радиокнопка заполняется как «Нет», а подтверждающее флэш-сообщение говорит: «Это поле нельзя оставить пустым».

Проблема исчезает, когда я прекращаю использовать ноль (0) в качестве значения для «Нет», но я хочу, чтобы Cake сохранял это значение как логическое значение, а не как какое-то другое значение, которое мне пришлось бы переводить вручную назад и вперед логическое значение.

Как остановить автоматическое заполнение Cake значения для этого элемента, когда оно отправлено, а радио не выбрано?

Ответы [ 4 ]

1 голос
/ 26 марта 2012

Наткнулся на этот вопрос, когда сам искал ответ.

Этот неприятный хак исправил это для меня (в CakePHP 2.1 - должно работать в 1.3):

После неудачной проверки сбросьте значение в $ this-> request-> data, если оно пустое:

if ($this->Model->save($this->request->data) {
  // data saved
}
else {
  // data failed to save
  // unset radio if empty
  if ($this->request->data['Model']['radio_field'] == "") {
    unset($this->request->data['Model']['radio_field'];
  }
}

Тьфу.

0 голосов
/ 09 августа 2011

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

Вы курите? [Да?]

А это лучше:

Ты куришь? (Да) (нет)

Я решил эту проблему следующим образом: 'options'=>array(1 => 'No', 2 => 'Yes')

0 голосов
/ 09 августа 2011

Редактировать: хорошо, я не думаю, что Cake автоматически заполняет это значение 0, скорее всего, это поведение браузера.Это можно проверить с помощью отладки ($ this-> data), когда сохранение не удается.(На всякий случай, вы можете сбросить это значение)

0 голосов
/ 01 июля 2011

То, как вы настроили свои радиокнопки, на самом деле есть 3 варианта:

  1. Ничего не выбрано
  2. «Нет» выбрано
  3. выбрано «Да»

Радиокнопки не должны никогда не иметь выбора (см. Пункт № 9); (1) выше не должно происходить. Поэтому вместо того, чтобы прямо отвечать на ваш вопрос, я хочу сказать, что вы должны рассмотреть возможность использования флажка. Флажки естественным образом подходят для логических значений и, вероятно, более пригодны для использования в этом случае.

И Cake предположит, что вы хотите установить флажок, если поле базы данных имеет значение tinyint (1), чтобы вы могли затем избавиться от массива параметров в вызове FormHelper.

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