如何提交禁用表单字段的值?

3

这个页面实际上是一个预览页面,用户无法更改之前提供的任何信息。我已经尝试了以下代码:

echo $this->Form->input('exchange_type', array(
        'disabled' => 'disabled',
        'empty'   => '--Please Select--',
        'options' => array(
            '6' => 'POINT_TO_PRODUCT',
            '7' => 'POINT_TO_GIFT',
            '2' => 'POINT_TO_GAME'
        )
    ));

这里的字段已经被禁用了,但它仍然向数据库发送null值。我想要发送用户实际选择的值。我该怎么做?

1个回答

2
这就是HTML的工作原理,禁用元素的值不会被发送。你可以使用一个隐藏字段,这就是表单助手在使用复选框时自动执行的操作,以确保始终发送一个值,因为未选中的复选框不会提交任何值,就像禁用的输入一样。隐藏字段应该与实际字段具有相同的名称,并且应该放置在实际字段之前,这样只有在以下元素被禁用时才会发送隐藏值。
echo $this->Form->hidden('exchange_type');
echo $this->Form->input('exchange_type', array(
    'disabled' => true,
    // ...
));

这将获取先前POST的隐藏输入和选择输入的值,并且隐藏输入将可提交。

另请参见Cookbook > Helpers > FormHelper > FormHelper::hidden()


这不会破坏只读/禁用状态吗?我认为这非常容易出错,并且可以轻松地通过浏览器开发工具绕过。相反,人们应该专注于根本不发布该值,并在通信层中使用/保留现有值。 - mark
@mark 取决于是否被视为威胁,可能值得解释一下,但那不是真正的问题。如果这不仅仅是 UI 问题,那么如果更改值的可能性被认为是有问题的,可以启用安全组件,但如果实际情况确实如此,那么对我来说听起来像是一个需要解决的概念性问题,也就是说,无论在哪个步骤定义,端点都应该只接受有效数据。 - ndm
我的观点是:如果这一切都可以“正确地”完成,为什么要这样做呢?他想要的完全是不必要的,因此这种技巧也是如此。 - mark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接