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?


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.


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


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


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.