如何根据角色隐藏视图的字段?


10

在/ admin / people中,我想隐藏显示名称(即,显示名称一定不能出现在用户列表中),而只是针对特定角色。

在我的.module文件中,我尝试了以下挂钩:

function hook_views_data_alter(array &$data) {
  kint($data['users']);die;
}

function hook_views_pre_render(\Drupal\views\ViewExecutable $view) {
  if($view->id() == 'myview'){
    print_r($view->result);die;
      // kint($value->_entity->get('title')->value);
  }
}

function hook_views_post_render(\Drupal\views\ViewExecutable $view) {
   if ($view->id() == 'viewid') {
    // Set the view title.
    $field_name = $view->getFields();
  }
}

function hook_field_views_data_views_data_alter(array &$data, \Drupal\field\FieldStorageConfigInterface $field) {
  $field_name = $field->getName();
  echo 'hjsjhwd';
  print_r($field_name);die;
  }

他们都没有帮助我。我想到要获取“用户”视图的字段,然后我将其取消设置为特定角色。但是在视图列表中,“名称”字段仍会出现。如何为特定角色隐藏它?

有什么办法可以做到这一点?


您是否只想在您的视图中隐藏该字段,还是想将其隐藏在任何地方?
Alireza Tabatabaeian

仅在/ admin / people列表页面上。display name / admin / page中有一个列,我实际上想隐藏该特定列。可能是“如果我隐藏字段”,则该列也会因我的特定角色而隐藏。
Sugandh Khanna

Answers:


17

最有效的方法是使用hook_views_pre_view(),它使您可以在过程的最开始即创建或运行任何查询以及进行任何渲染之前更改View。您可以根据所需的逻辑从视图中删除“名称”字段处理程序。

/**
 * Implements hook_views_pre_view().
 */
function MY_MODULE_views_pre_view($view, $display_id, array &$args) {
  if ($view->id() !== 'user_admin_people') {
    return;
  }

  $user_roles = \Drupal::currentUser()->getRoles();
  if (!in_array('my-special-role', $user_roles)) {
    $view->removeHandler($display_id, 'field', 'name');
  }
}

该解决方案假定您只希望提供这种非常特定的用例-仅从该特定的View中删除该字段。用户可能仍然可以在网站的其他区域看到用户的显示名称。


干得好,投票赞成
Alireza Tabatabaeian

我认为应该是$views->id() ===
没有Sssweat

1
@NoSsweat如果!==则返回,因此仅在===时执行逻辑
krystalcode

我可能错了,但是应该有一个's' $views->id()吗?应该是$view->id()吗?
克里斯·

另外,如果要查看用户是否具有任何角色,请使用if (empty(array_intersect($userRoles, $userRolesAllowed)))。有关更多信息array_intersect
克里斯·


0

当需要删除表头<td>以及行<td>时,可以使用template_preprocess_views_view_table

/**
 * Implements template_preprocess_views_view_table().
 */
function TEMPLATE_preprocess_views_view_table(&$variables) {
  // @TODO: You should use $variables['view']->name and $variables['view']->current_display to apply this only one specific view.

  // Let's assume your field name is node status.
  // Remove header label.
  if (isset($variables['header']) && isset($variables['header']['status']) {
    unset($variables['header']['status']);
  }

  // Remove row columns.
  foreach($variables['rows'] as $key => $row) {
    if (isset($variables['rows']) && isset($variables['rows'][$key]) && isset($variables['rows'][$key]['status'])) {
      unset($variables['rows'][$key]['status']);
      unset($variables['result'][$key]->node_status);
    }
  }

  // You can always print_r($variables['rows']) to know what is exact field name that you need to delete.
  // print_r($variables['result']).
  // print_r($variables['header']).
}

注意:对于此类需求,请尽量不要使用两个以上的挂钩来满足您的需求。由于Drupal永远不会再使用一个或两个钩子来做您想做的任何事情。


更新:对于Drupal 7,在此URL上也使用相同的钩子名称template_preprocess_views_view_table


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.