You are here

public function Roles::preRender in Drupal 10

Same name and namespace in other branches
  1. 8 core/modules/user/src/Plugin/views/field/Roles.php \Drupal\user\Plugin\views\field\Roles::preRender()
  2. 9 core/modules/user/src/Plugin/views/field/Roles.php \Drupal\user\Plugin\views\field\Roles::preRender()

Runs before any fields are rendered.

This gives the handlers some time to set up before any handler has been rendered.

Parameters

\Drupal\views\ResultRow[] $values: An array of all ResultRow objects returned from the query.

Overrides FieldHandlerInterface::preRender

File

core/modules/user/src/Plugin/views/field/Roles.php, line 66

Class

Roles
Field handler to provide a list of roles.

Namespace

Drupal\user\Plugin\views\field

Code

public function preRender(&$values) {
  $uids = [];
  $this->items = [];
  foreach ($values as $result) {
    $uids[] = $this
      ->getValue($result);
  }
  if ($uids) {
    $roles = user_roles();
    $result = $this->database
      ->query('SELECT [u].[entity_id] AS [uid], [u].[roles_target_id] AS [rid] FROM {user__roles} [u] WHERE [u].[entity_id] IN ( :uids[] ) AND [u].[roles_target_id] IN ( :rids[] )', [
      ':uids[]' => $uids,
      ':rids[]' => array_keys($roles),
    ]);
    foreach ($result as $role) {
      $this->items[$role->uid][$role->rid]['role'] = $roles[$role->rid]
        ->label();
      $this->items[$role->uid][$role->rid]['rid'] = $role->rid;
    }

    // Sort the roles for each user by role weight.
    $ordered_roles = array_flip(array_keys($roles));
    foreach ($this->items as &$user_roles) {

      // Create an array of rids that the user has in the role weight order.
      $sorted_keys = array_intersect_key($ordered_roles, $user_roles);

      // Merge with the unsorted array of role information which has the
      // effect of sorting it.
      $user_roles = array_merge($sorted_keys, $user_roles);
    }
  }
}