我有一个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));
答案 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)
你可以做以下两件事之一:
(例如echo $this->Form->input ('username, array ('type' => 'hidden'));