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.