Cakephp表单 - 有没有办法让字段只读(在视图中)

时间:2013-03-17 13:52:33

标签: cakephp

我有一个Cakephp 1.3表单,允许用户编辑配置文件数据。但是表格中的一些信息需要只读(有时)。

我唯一的选择是在只读的情况下回显和格式化字段内容,或者在Cake表单中是否有允许只读字段的标志。理想情况下,只读字段将与其他接口类似地显示为灰色。

    echo $this->Form->create('User', array('url' => array('controller' => 'User', 'action'=>'editUser')));

    echo $this->Form->input('id', array('type'=>'hidden'));

If (!isset($IsAdmin)) {
    // Only display username - read only! Add code here
    echo $this->Form->input('username', array('label' => __d('users', 'User',true)));
} else {
    // Admins can edit user names
    echo $this->Form->input('username', array('label' => __d('users', 'User',true)));
}           

 ... more fields here

    echo $this->Form->end(__d('users', 'Submit',true));

5 个答案:

答案 0 :(得分:22)

您可以在选项数组中添加“禁用”键,然而意识到这只是表单的前端/表示,人们将能够覆盖“禁用”属性输入字段并修改其值。

为防止意外更改被保存,您需要在使用模型保存数据时指定'fieldList'

输出已停用的表单字段;

echo $this->Form->input('fieldname', array('type'=>'hidden', 'disabled' => 'disabled'));

然后,在保存数据时,请指定一个字段列表(文档:http://book.cakephp.org/1.3/en/The-Manual/Developing-with-CakePHP/Models.html#saving-your-data

$this->MyModel->save($this->data, true, array('field1', 'field2'));

字段列表应包括允许用户更新的所有字段

答案 1 :(得分:17)

disabled属性很好但实际上,输入字段具有'readonly'属性。并且听起来你希望该字段仍然显示给用户,因此使用“隐藏”并不能真正解决你想做的事情。

这是另一种选择(实际上特别针对'只读'的要求):

echo $this->Form->input('fieldname', array('readonly' => 'readonly'));

我发现使用禁用可防止jquery点击触发器触发,而readonly仍会触发,例如使用bootstrap datepicker文本字段

以下是WC3的链接:http://www.w3schools.com/tags/att_input_readonly.asp

答案 2 :(得分:5)

如果你真的想让字段只读为什么要使用表单字段,只需回显该值,就可以用简单的javascript或firebug轻松更改表单字段的disable或readonly属性。

答案 3 :(得分:3)

好的,在尝试了几种方法后,我喜欢这里。

1)使用readonly(当你处于更新模式时,禁用会在点击“保存”后删除该值,这很糟糕):

echo $this->Form->input('email', array('readonly' => 'readonly'));

2)为防止在通过浏览器插件删除“readonly”时更新,您可以将其添加到模型的beforeSave中:

if(isset($this->data[$this->alias]['id'])) // id is only set if we update
{
    unset($this->data[$this->alias]['email']);
}

字段列表不舒服。当我实际上只想排除一个字段时,为什么要添加所有字段?

取消设置将阻止CakePHP在数据库中更新它。当然,在使用(无效)更新的电子邮件地址进行保存后,此更新将在表单中显示一次。但是,由于用户操作了HTML表单,并且由于数据库字段保持不变,因此这无关紧要。

答案 4 :(得分:1)

你可以做以下两件事之一:

  1. 隐藏字段
  2. (例如echo $this->Form->input ('username, array ('type' => 'hidden'));

    1. 在提交表单之前或可能在beforeSave之前,将用户名的值重置为原始值。