hook_form_alter根据用户的角色取消设置字段

时间:2018-05-08 04:41:49

标签: php drupal

当我尝试使用hook_form_alter根据用户的角色隐藏字段时,我遇到了问题。我使用了unset()并从$form数组中删除了该字段,但在呈现表单时它仍然显示。

这是我的代码:

function mymodule_form_alter($form, $form_state, $form_id){
  global $user;
  if($form_id == 'my_content_type'){
    if(array_key_exists(5,$user->roles) && !array_key_exists(3,$user->roles)){
      if(empty($form_state['field']['args'][0]->title)){
        unset($form['field_body']);
      }
    }
  }
}

3 个答案:

答案 0 :(得分:2)

您应该将unset()属性设置为#access,而不是使用FALSE来隐藏表单元素。这样可以保持表单构建树的完整性,从而避免在其他模块尝试访问或更改该信息时出现问题。 Source

function MYMODULE_form_alter($form, $form_state, $form_id) {

  global $user;
  $account = $user;

  if ($form_id == 'MYCONTENTTYPE_node_form') {

    if (user_has_role(5, $account) && !user_has_role(3, $account)) {

      if (empty($form_state['field']['args'][0]->title)) {

        $form['field_body']['#access'] = FALSE;
      }
    }
  }
}

如果仍然无效,请仔细检查您的if-requests。他们真的在做什么吗?您目前是否以相应的用户身份登录?

答案 1 :(得分:0)

我找到了解决方案。我需要添加&在hook_form_alter参数中使用$ form和$ form_state。像hook_form_alter(& $ form,& $ form_state,$ form_id)

答案 2 :(得分:0)

它存在一个允许隐藏字段的模块。对于 Drupal 9,它处理每个角色、隐藏或禁用异常(例如不在创建时……)。 看:https://www.drupal.org/project/jammer