Come posso nascondere il campo di una vista in base al ruolo?


10

In / admin / people, voglio nascondere il nome visualizzato (ovvero il nome visualizzato non deve apparire nell'elenco utenti), ma solo per un ruolo specifico.

Nel mio file .module, ho provato i seguenti hook:

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

Nessuno di loro mi ha aiutato. Ho pensato di ottenere i campi della vista "utente" e successivamente lo disinserirò per un ruolo particolare. Ma nell'elenco delle viste, il campo Nome è ancora visualizzato. Come posso nasconderlo per un ruolo particolare?

C'è un modo per raggiungere questo obiettivo?


vuoi nascondere questo campo solo nella tua vista o vuoi che sia nascosto ovunque?
Alireza Tabatabaeian,

Solo nella pagina di elenco / admin / people. Arriva una colonna di display name / admin / page, in realtà voglio nascondere quella particolare colonna. Può essere Se nascondo un campo, anche quella colonna viene nascosta per il mio ruolo particolare.
Sugandh Khanna,

Risposte:


17

Il modo più efficiente sarebbe utilizzare hook_views_pre_view (), che consente di modificare una vista all'inizio del processo, ovvero prima che venga creata / eseguita una query e prima che venga eseguito qualsiasi rendering. È possibile rimuovere il gestore di campo "nome" dalla vista in base alla logica desiderata.

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

Questa soluzione presuppone che tu sia interessato a servire questo caso d'uso molto specifico: rimuovi il campo solo da questa Vista specifica. Gli utenti potrebbero comunque essere in grado di vedere i nomi visualizzati degli utenti in altre aree del sito Web.


Buon lavoro, votato
Alireza Tabatabaeian,

Penso che dovrebbe essere $views->id() ===?
No Sssweat,

1
@NoSsweat If! == quindi return, quindi esegui la logica solo ===
krystalcode

Potrei sbagliarmi, ma dovrebbe esserci una 's' in $views->id()? Dovrebbe essere $view->id()?
Chris Happy,

Inoltre, se vuoi vedere se l'utente ha uno dei ruoli, usa if (empty(array_intersect($userRoles, $userRolesAllowed))). Maggiori informazioni suarray_intersect
Chris Happy


0

Quando è necessario eliminare l'intestazione della tabella <td> e anche le righe <td> è possibile utilizzare 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']).
}

Nota: per qualsiasi esigenza come questa, prova a non usare più di due ganci per soddisfare le tue esigenze. Poiché Drupal farà sempre tutto ciò che desideri utilizzando uno o due ganci non di più.


Aggiornamento: per Drupal 7 anche usando lo stesso hook hook su questo URL template_preprocess_views_view_table


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.