【问题标题】:Cakephp forms - Is there a way to make a field read only (in the view)Cakephp 表单 - 有没有办法使字段只读(在视图中)
【发布时间】:2016-09-14 18:30:49
【问题描述】:

我有一个允许用户编辑配置文件数据的 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));

【问题讨论】:

    标签: cakephp


    【解决方案1】:

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

    为防止保存不需要的更改,您需要在使用模型保存数据时指定一个“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.3 文档中没有提到 disabled 选项,但它可以工作。
    • 那是因为它不是 FormHelper 的直接功能。 FormHelper 会将任何“未知”选项视为 HTML 标记的属性。例如。添加'foo' => 'bar' 之类的内容,您将获得<input type=.... foo='bar' />
    【解决方案2】:

    禁用属性很好,但实际上,输入字段具有“只读”属性。听起来您希望该字段仍向用户显示,因此使用“隐藏”并不能真正解决您想要做的事情。

    所以另一种选择(实际上是专门解决您对“只读”的要求):

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

    我发现使用 disabled 会阻止 jquery 点击触发器触发,而 readonly 仍然会触发,例如使用引导日期选择器文本字段

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

    【讨论】:

    • 这个只读属性在很多情况下是更好的选择。 “已禁用”字段可能不会提交其包含的数据。
    【解决方案3】:

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

    【讨论】:

    • 没错,这应该得到更多的支持,只读和禁用会产生错误代码
    • 最有可能是美学。可以在客户端以任何他们想要的方式更改表单,并将他们想要的任何内容提交回服务器。因此,使用您想要显示的数据并始终验证表单提交。
    【解决方案4】:

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

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

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

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

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

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

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

    【讨论】:

      【解决方案5】:

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

      1. 隐藏字段

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-19
        • 1970-01-01
        • 1970-01-01
        • 2020-05-10
        • 2018-10-22
        相关资源
        最近更新 更多