Forms 如何在Drupal中隐藏用户编辑表单上的某些字段?
所以我有三种类型的用户-管理员,LA管理员和用户。我正在尝试设置它,以便管理员和LA管理员不能编辑用户的用户名、密码和时区。我说的是管理员的默认用户编辑表单,表单ID是“用户配置文件表单” 我已经创建了一个自定义模块,但它似乎不起作用。知道我做错了什么吗 甚至var_转储似乎也没有输出。我已清除缓存并验证模块是否已启用Forms 如何在Drupal中隐藏用户编辑表单上的某些字段?,forms,drupal,hook,hook-form-alter,Forms,Drupal,Hook,Hook Form Alter,所以我有三种类型的用户-管理员,LA管理员和用户。我正在尝试设置它,以便管理员和LA管理员不能编辑用户的用户名、密码和时区。我说的是管理员的默认用户编辑表单,表单ID是“用户配置文件表单” 我已经创建了一个自定义模块,但它似乎不起作用。知道我做错了什么吗 甚至var_转储似乎也没有输出。我已清除缓存并验证模块是否已启用 function profile_change_form_alter(&$form, $form_state, $form_id) { if ($form_id
function profile_change_form_alter(&$form, $form_state, $form_id) {
if ($form_id === 'user-profile-form') {
var_dump ($form);
hide($form['account']['pass']);
hide($form['account']['current_pass_required_values']);
hide($form['account']['current_pass']);
}
}
我假设您的模块名为PROFILE\u CHANGE,因此您以
hook\u form\u alter()
的格式使用它,在这里您用模块名PROFILE\u CHANGE
替换了hook
您已将3'='符号放在您为检查表单id提供条件的位置,即用户配置文件表单
。我放了简单的等号,它是“==”&它起作用了
function profile_change_form_alter(&$form, $form_state, $form_id) {
if ($form_id == 'user-profile-form') {
hide($form['account']['pass']);
hide($form['account']['current_pass_required_values']);
hide($form['account']['current_pass']);
}
}
不要使用var\u dump()
,您应该始终在窗体alter的hook函数之后使用并检查$form
的输出,如dpm($form)
。这将为您提供有关表单的所有信息,无论您在页面上的哪个位置有表单
function profile_change_form_alter(&$form, $form_state, $form_id) {
dpm($form);
}
实际上,我只需将代码中的
用户配置文件表单
更改为用户配置文件表单
,它就可以工作了。由于某些原因,drupal需要下划线。如果使用hide()
您将删除字段,但hide更多的是用于“延迟”字段呈现。。。就像隐藏它一样,但是(在模板文件中)在其他地方打印它。
因为,如果您以后不打印它,它将不会在页面中呈现,不会保存,如果它是强制性的,您将得到验证错误等等
如果您想隐藏它,这样用户就看不到它,但您想让表单保留字段的上一个值,请使用如下内容:
$form['field_yourfield']['#access'] = FALSE;
如果您希望它可见但被禁用(用户无法更改其值),则:
$form\u id
是表单的id,取自其PHP函数名,而不是HTML id(不保证一致)。这就是为什么在“出于某种原因”更改表单时它包含下划线而不是连字符的原因,因为破折号和下划线不是等效的字符串。标记Drupal输出包含破折号,但在内部使用下划线。您可以通过查看源代码,查找input[name=“Form_ID”]
并使用该精确值来查找表单ID。尝试在浏览器控制台的任何Drupal管理表单页面上运行此jQuery代码段:jQuery('input[name=“form_id”]”)。val()
将其禁用,这很有意义!
$form['field_yourfield']['#disabled'] = TRUE;