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

9

In / admin / people möchte ich den Anzeigenamen ausblenden (dh 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?

Sugandh Khanna
quelle
Möchten Sie dieses Feld nur in Ihrer Ansicht ausblenden oder möchten Sie, dass es überall ausgeblendet wird?
Alireza Tabatabaeian
Nur auf der Seite / admin / people listing. Es kommt eine Spalte von display name / admin / page, ich möchte diese bestimmte Spalte tatsächlich ausblenden. Wenn ich ein Feld ausblende, wird diese Spalte möglicherweise auch für meine bestimmte Rolle ausgeblendet.
Sugandh Khanna
Wenn Sie dies stattdessen mit Berechtigung tun können, können Sie einfach die Berechtigungen für Ansichtsfelder verwenden .
Colan

Antworten:

17

Am effizientesten wäre die Verwendung von hook_views_pre_view (), mit der Sie eine Ansicht zu Beginn des Prozesses ändern können, dh 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.

krystalcode
quelle
Gute Arbeit, gewählt
Alireza Tabatabaeian
Ich denke es sollte sein $views->id() ===?
Kein Sssweat
1
@NoSsweat If! == dann zurück, daher nur die Logik ausführen, wenn ===
krystalcode
Ich könnte mich irren, aber sollte es ein 's' geben $views->id()? Sollte es sein $view->id()?
Chris Happy
Wenn Sie sehen möchten, ob der Benutzer eine der Rollen hat, verwenden Sie if (empty(array_intersect($userRoles, $userRolesAllowed))). Weitere Informationen zuarray_intersect
Chris Happy
3

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 das Feld Berechtigungen auch verwenden , um ein Feld vor bestimmten Rollen auszublenden.

Alireza Tabatabaeian
quelle
0

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: Versuchen Sie bei solchen Anforderungen, nicht mehr als zwei Haken zu verwenden, um Ihre Anforderungen zu erfüllen. Da Drupal immer alles macht, was Sie wollen, verwenden Sie nicht mehr einen oder zwei Haken.


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

Saud Alfadhli
quelle