web-dev-qa-db-fra.com

Comment masquer le champ d'une vue en fonction du rôle?

Dans/admin/people, je souhaite masquer le nom d'affichage (c'est-à-dire que Nom d'affichage ne doit pas apparaître dans la liste des utilisateurs), mais uniquement pour un rôle spécifique.

Dans mon fichier .module, j'ai essayé les crochets suivants:

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;
  }

Aucun d'eux ne m'a aidé. J'ai pensé à obtenir des champs de la vue "utilisateur" et après cela je le désélectionnerai pour un rôle particulier. Mais dans la liste des vues, le champ Nom apparaît toujours. Comment puis-je le cacher pour un rôle particulier?

Y'a-t-il une quelconque façon de réussir cela?

9
Sugandh Khanna

Le moyen le plus efficace serait d'utiliser hook_views_pre_view (), qui vous permet de modifier une vue au tout début du processus, c'est-à-dire avant que toute requête soit créée/exécutée et avant tout rendu. Vous pouvez supprimer le gestionnaire de champ "nom" de la vue en fonction de la logique souhaitée.

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

Cette solution suppose que vous êtes uniquement intéressé à servir ce cas d'utilisation très spécifique - supprimez le champ uniquement de cette vue spécifique. Les utilisateurs peuvent toujours voir les noms d'affichage des utilisateurs dans d'autres zones du site Web.

17
krystalcode

Vous pouvez masquer les champs en utilisant hook_entity_field_access , vous pouvez masquer le champ en fonction du compte d'utilisateur (le rôle est l'une de ses propriétés), de l'opération et de l'entité qui contient le champ.

Vous pouvez également utiliser le module Field Permissions pour masquer un champ à certains rôles.

3

Lorsque vous devez supprimer l'en-tête de table <td> ainsi que les lignes <td>, vous pouvez utiliser 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']).
}

Remarque: Pour tout besoin comme celui-ci, essayez de ne pas utiliser plus de deux crochets pour répondre à vos besoins. Puisque Drupal fera toujours ce que vous voulez en utilisant un ou deux crochets plus.


Mise à jour: pour Drupal 7 utilisant également le même nom de hook sur cette URL template_preprocess_views_view_table

0
Saud Alfadhli