【问题标题】:CakePHP Unfilled radio button changed to an unwanted value on submitCakePHP 未填充单选按钮在提交时更改为不需要的值
【发布时间】:2011-09-21 12:53:12
【问题描述】:

我有这个表单元素:

$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 自动填充该元素的值?

【问题讨论】:

    标签: php validation forms cakephp


    【解决方案1】:

    在自己寻找答案时偶然发现了这个问题。

    这个讨厌的 hack 为我修复了它(在 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'];
      }
    }
    

    呃。

    【讨论】:

      【解决方案2】:

      您设置单选按钮的方式实际上有 3 个选择:

      1. 未选择任何内容
      2. 选择了“否”
      3. 已选择“是”

      单选按钮应该never have no choice selected(见第9点); (1) 以上不应该发生。因此,与其直接回答您的问题,不如说您应该考虑使用复选框。复选框很适合布尔值,在这种情况下可能更有用。

      如果数据库字段是 tinyint(1),Cake 会假设您需要一个复选框,因此您可以在 FormHelper 调用中去掉选项数组。

      【讨论】:

        【解决方案3】:

        编辑:好的,我不认为 Cake 会自动用 0 填充该值,很可能是浏览器行为。当保存失败时,您可以通过 debug($this->data) 进行测试。 (以防万一,您可以在那里取消设置该值)

        【讨论】:

        • 我不想要复选框,因为默认情况下,复选框是打开或关闭的,具体取决于 HTML 属性集。我希望用户强制选择“是”或“否”,并且如果他们忽略该选项,则不提交默认值。
        【解决方案4】:

        所以我在问卷调查中遇到了类似的问题,单选按钮保持为空在语义上是正确的 - 当一个是或否问题仍未得到回答时。在这种情况下,它看起来不像这样:

        你抽烟吗? [是吗?]

        这样更好:

        你抽烟吗? (是)(否)

        我解决这个问题的方法是'options'=>array(1 => 'No', 2 => 'Yes')

        【讨论】:

        • 对,但我希望 Cake 将此值存储为布尔值,而不是我必须手动来回转换为布尔值的其他值。
        猜你喜欢
        • 2011-12-25
        • 1970-01-01
        • 1970-01-01
        • 2011-04-20
        • 1970-01-01
        • 2021-02-02
        • 2019-02-18
        • 1970-01-01
        • 2015-09-19
        相关资源
        最近更新 更多