ロールに基づいてビューのフィールドを非表示にするにはどうすればよいですか?


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 2017

/ admin / peopleリストページのみ。display name / admin / pageに列がありますが、実際にはその特定の列を非表示にしたいと思います。フィールドを非表示にすると、その列も特定の役割で非表示になります。
Sugandh Khanna 2017

回答:


17

最も効率的な方法は、hook_views_pre_view()を使用することです。これにより、プロセスの最初(つまり、クエリが構築/実行される前、およびレンダリングが行われる前に、ビューを変更できます。必要なロジックに基づいて、ビューから 'name'フィールドハンドラーを削除できます。

/**
 * 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');
  }
}

このソリューションは、この非常に特定のユースケースのみを提供することに関心があると想定しています。この特定のビューからのみフィールドを削除してください。ユーザーは引き続き、Webサイトの他の領域のユーザーの表示名を表示できる場合があります。


いい仕事、投票
Alireza Tabatabaeian 2017

あるべきだと思います$views->id() ===か?
Sssweatなし17

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']).
}

注:このようなニーズがある場合は、3つ以上のフックを使用しないようにしてください。Drupalは常に1つまたは2つのフックを使用して必要なことを何でも行うので、これ以上は必要ありません。


更新:Drupal 7の場合も、このURLで同じフック名を使用していますtemplate_preprocess_views_view_table


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.