web-dev-qa-db-ja.com

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

/ admin/peopleで、表示名(つまりDisplay nameがユーザーリストに表示されてはいけない)を非表示にしたいのですが、特定のロールに対してのみです。

私の.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;
  }

それらのどれも私を助けませんでした。ビュー「ユーザー」のフィールドを取得することを考えた後、特定の役割の設定を解除します。しかし、ビューのリストでは、名前フィールドはまだ表示されています。特定の役割でそれを非表示にするにはどうすればよいですか?

これを達成する方法はありますか?

9
Sugandh Khanna

最も効率的な方法は、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サイトの他の領域のユーザーの表示名を引き続き表示できる場合があります。

17
krystalcode

hook_entity_field_access を使用してフィールドを非表示にできます。ユーザーアカウント(ロールはそのプロパティの1つです)、操作、およびフィールドを含むエンティティに基づいてフィールドを非表示にできます。

Field Permissions モジュールを使用して、特定のロールからフィールドを非表示にすることもできます。

テーブルヘッダー<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

0
Saud Alfadhli