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

10

Dans / admin / people, je souhaite masquer le nom d'affichage (c'est-à-dire que le 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?

Sugandh Khanna
la source
voulez-vous masquer ce champ uniquement dans votre vue ou voulez-vous qu'il soit masqué partout?
Alireza Tabatabaeian
Uniquement sur la page de liste / admin / people. Il y a une colonne display name sur / admin / page, je veux cacher cette colonne en fait. Peut-être que si je masque le champ, cette colonne est également masquée pour mon rôle particulier.
Sugandh Khanna

Réponses:

17

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.

krystalcode
la source
Bon travail, voté
Alireza Tabatabaeian
Je pense que ça devrait être $views->id() ===?
Pas de Sssweat
1
@NoSsweat If! == then return, donc n'exécutez la logique que si ===
krystalcode
Je peux me tromper, mais devrait-il y avoir un «s» dedans $views->id()? Devrait-il en être ainsi $view->id()?
Chris Happy
De plus, si vous voulez voir si l'utilisateur a l'un des rôles, utilisez if (empty(array_intersect($userRoles, $userRolesAllowed))). Plus d'infos surarray_intersect
Chris Happy
3

Vous pouvez masquer des champs à l'aide de hook_entity_field_access , vous pouvez masquer un 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 Autorisations de champ pour masquer un champ de certains rôles.

Alireza Tabatabaeian
la source
0

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. Depuis Drupal fera toujours tout 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

Saud Alfadhli
la source
0

Utilisez le module Permissions de champ de vues . Aucun code personnalisé requis!

La prise en charge des rôles a été ajoutée il y a environ un mois.

colan
la source