如何使用hook_form_alter将字段设为只读


12

我试图使某些Drupal配置文件表单字段在编辑模式下为只读。我在hook_alter中使用以下代码

$form[field_organisation_company_name][und][0]['#after_build'][]='_build_element_readonly';

function _build_element_readonly($element, &$form_state) {  
    $element['value']['#attributes']['readonly'] = 'readonly';
    return $element;
}

在用户界面中,字段显示为只读,但仍然可以使用firebug更改值并保存。有什么办法可以防止这种行为?

Answers:


6

听起来您可以通过Field Permissions完成所需的工作。您可以逐个字段将权限设置为:

  • 为该字段创建自己的值
  • 编辑该字段的自身值
  • 编辑该字段的任何人的值
  • 查看该字段的自身价值
  • 查看任何人对该字段的价值

因此,您可以轻松地允许用户最初为该字段创建值,但是一旦他们拥有该值,则只能由管理员对其进行编辑。


+1。由于OP希望允许管理员编辑值,field_permissions因此比以肮脏的方式进行工作要容易。
AyeshK 2013年

是的,这是比我更好的答案了:)
Alfred Armstrong

6

将字段设置为时readonly,浏览器将锁定该字段,并在提交后将数据发送回服务器。其他属性是disabled锁定字段并且不将数据发送回服务器。

对于这两种情况,您都可以在提交后将值强制设置为相同。因此,即使将字段设置为readonlydisabled,并且用户修改了HTML并发送了不同的数据,它们$form_state['values']也将保持不变。

function _build_element_readonly($element, &$form_state) {  
    $element['value']['#attributes']['readonly'] = 'readonly';
    $element['value']['#value'] = isset($element['value']['#default_value']) 
       ?  $element['value']['#default_value']
       :  ''; 
    return $element;
}

请注意,我们#value 从#default_value 设置。#default_value是设置默认值的常用方法,该默认值在构建表单时加载,$form_state['values']并将包含default_value或用户输入。#value显式设置时,#value将忽略用户输入,并将使用它。

无论如何,我建议'#access' => FALSE,在隐藏表单元素时使用。它将完全删除该元素,同时允许您使用其值。


1

您不能阻止Firebug更改只读字段。但是,如果文本字段为只读,则其唯一目的是显示数据。那么,为什么不将输入元素更改为文本元素呢?

您可以改用“ disabled”属性,因为禁用的输入字段不会被发送到服务器。

您也可以使用firebug删除“ disabled”属性,但是drupal核心不会对禁用的输入字段做出反应!


感谢larrydahooster的帮助。我的要求是在注册时锁定用户填写的某些字段。虽然在概要文件编辑模式下要向用户显示此信息,但要阻止用户更新这些字段。只有超级用户可以编辑这些字段
Jayesh何塞


1

您可以使用Field Permissions + Field Readonly

字段权限将允许您使某些用户无法访问某些字段。

“字段只读”将使您可以将不可访问的字段显示为编辑表单上的只读项目(而不是隐藏它们)。


1

我认为使用#disabled = true;是实现此目的的最简单方法,而不是在内核中添加一些繁重的模块,例如,当用户之前填充过user_profile_form时,我禁止对其自定义图像字段进行编辑。

function MY_CUSTOM_MODULE_form_alter(&$form, $form_state, $form_id){

        if($form_id == 'user_profile_form'){
            if($form['field_national_front']['und'][0]['#default_value']['fid']){
                $form['field_national_front']['und']['#disabled'] = true;
             }
          //ym($form);
        }
}

另外,您可以检查用户的角色,仅对非管理员用户禁用(只读字段)。

    function MY_CUSTOM_MODULE_form_alter(&$form, $form_state, $form_id){
       global $user;
       if($form_id == 'user_profile_form'){
           if($form['field_national_front']['und'][0]['#default_value']['fid'] && !in_array('webadmin', $user->roles)){
              $form['field_national_front']['und']['#disabled'] = true;
         }
//ym($form);
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.