hook_field_access在hook_form_alter中的VS ['#access']

时间:2014-11-04 20:49:20

标签: forms drupal-7 field

"设置字段访问"有什么区别?在标题中提到的两个不同的钩子之间?

关于它的任何文档在哪里? (在两个钩子页面上没有找到任何方法来得到答案。)

我重新解释一个问题:一个或另一个钩子的HTML结果是什么?

感谢。

1 个答案:

答案 0 :(得分:2)

#access 是一种表单API属性(您可以使用hook_form_alter()将其添加到表单元素中。

当设置为FALSE时,不呈现元素(Drupal不会在表单中呈现字段HTML),并且不考虑用户提交的值。

示例:

function MYMODULE_form_node_form_alter(&$form, $form_state) {
  $form['some_field']['#access'] = FALSE; // this field will not be rendered in node edit form
}

hook_field_access() 是一个钩子,用于确定用户是否有权访问给定字段。使用此挂钩,您可以禁止某些用户访问(查看和编辑)某些字段:

function MYMODULE_field_access($op, $field, $entity_type, $entity, $account) {
  if ($entity_type == 'node') {
    if ($field['field_name'] == 'SOME_FIELD') {
      if ($account->uid == 100) {
        return FALSE;
      }
    }
  }
}

这意味着当编辑和查看节点时,uid = 100的用户将无法呈现SOME FIELD。

...或者禁止所有人编辑某个字段:

function MYMODULE_field_access($op, $field, $entity_type, $entity, $account) {
  if ($entity_type == 'node') {
    if ($field['field_name'] == 'SOME_FIELD') {
      if ($op == 'edit') {
        return FALSE;
      }
    }
  }
}

上面的代码实际上将节点编辑表单中元素'SOME_FIELD'的'#access'属性设置为FALSE,所以没有人会在节点编辑窗体中看到这个字段。

所以'#access'属性只有一个用例 - 设置对给定表单字段的访问权。

hook_field_access()有更广泛的应用程序区域,包括<#em>操纵'#access'属性。