it-swarm.com.de

Wie verstecke ich das Feld einer Ansicht basierend auf der Rolle?

In/admin/people möchte ich den Anzeigenamen ausblenden (d. H. Der Anzeigename darf nicht in der Benutzerliste erscheinen), sondern nur für eine bestimmte Rolle.

In meiner .module-Datei habe ich folgende Hooks ausprobiert:

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

Keiner von ihnen hat mir geholfen. Ich habe darüber nachgedacht, Felder der Ansicht "Benutzer" zu erhalten, und danach werde ich sie für eine bestimmte Rolle deaktivieren. In der Liste der Ansichten wird das Feld Name weiterhin angezeigt. Wie kann ich es für eine bestimmte Rolle ausblenden?

Gibt es eine Möglichkeit, dies zu erreichen?

9
Sugandh Khanna

Am effizientesten wäre die Verwendung von hook_views_pre_view (), mit der Sie eine Ansicht zu Beginn des Prozesses ändern können, d. H. Bevor eine Abfrage erstellt/ausgeführt wird und bevor ein Rendering stattfindet. Sie können den Feldhandler 'Name' basierend auf der gewünschten Logik aus der Ansicht entfernen.

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

Bei dieser Lösung wird davon ausgegangen, dass Sie nur an diesem speziellen Anwendungsfall interessiert sind. Entfernen Sie das Feld nur aus dieser speziellen Ansicht. Benutzer können möglicherweise weiterhin die Anzeigenamen von Benutzern in anderen Bereichen der Website anzeigen.

17
krystalcode

Sie können Felder mit hook_entity_field_access ausblenden. Sie können Felder basierend auf dem Benutzerkonto (Rolle ist eine seiner Eigenschaften), der Operation und der Entität, die das Feld enthalten, ausblenden.

Sie können auch das Modul Feldberechtigungen verwenden, um ein Feld vor bestimmten Rollen auszublenden.

Wenn Sie den Tabellenkopf <td> und auch die Zeilen <td> löschen müssen, können Sie template_preprocess_views_view_table verwenden

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

Hinweis: Verwenden Sie für solche Anforderungen nicht mehr als zwei Haken, um Ihre Anforderungen zu erfüllen. Da Drupal wird immer alles tun, was Sie wollen, mit ein oder zwei Hooks nicht mehr.


Update: Für Drupal 7 wird auch derselbe Hook-Name für diese URL verwendet template_preprocess_views_view_table

0
Saud Alfadhli