You are here

public function UserPermissionsForm::buildForm in Zircon Profile 8.0

Same name and namespace in other branches
  1. 8 core/modules/user/src/Form/UserPermissionsForm.php \Drupal\user\Form\UserPermissionsForm::buildForm()

Form constructor.

Parameters

array $form: An associative array containing the structure of the form.

\Drupal\Core\Form\FormStateInterface $form_state: The current state of the form.

Return value

array The form structure.

Overrides FormInterface::buildForm

1 call to UserPermissionsForm::buildForm()
UserPermissionsRoleSpecificForm::buildForm in core/modules/user/src/Form/UserPermissionsRoleSpecificForm.php
1 method overrides UserPermissionsForm::buildForm()
UserPermissionsRoleSpecificForm::buildForm in core/modules/user/src/Form/UserPermissionsRoleSpecificForm.php

File

core/modules/user/src/Form/UserPermissionsForm.php, line 90
Contains \Drupal\user\Form\UserPermissionsForm.

Class

UserPermissionsForm
Provides the user permissions administration form.

Namespace

Drupal\user\Form

Code

public function buildForm(array $form, FormStateInterface $form_state) {
  $role_names = array();
  $role_permissions = array();
  $admin_roles = array();
  foreach ($this
    ->getRoles() as $role_name => $role) {

    // Retrieve role names for columns.
    $role_names[$role_name] = $role
      ->label();

    // Fetch permissions for the roles.
    $role_permissions[$role_name] = $role
      ->getPermissions();
    $admin_roles[$role_name] = $role
      ->isAdmin();
  }

  // Store $role_names for use when saving the data.
  $form['role_names'] = array(
    '#type' => 'value',
    '#value' => $role_names,
  );

  // Render role/permission overview:
  $options = array();
  $hide_descriptions = system_admin_compact_mode();
  $form['system_compact_link'] = array(
    '#id' => FALSE,
    '#type' => 'system_compact_link',
  );
  $form['permissions'] = array(
    '#type' => 'table',
    '#header' => array(
      $this
        ->t('Permission'),
    ),
    '#id' => 'permissions',
    '#attributes' => [
      'class' => [
        'permissions',
        'js-permissions',
      ],
    ],
    '#sticky' => TRUE,
  );
  foreach ($role_names as $name) {
    $form['permissions']['#header'][] = array(
      'data' => $name,
      'class' => array(
        'checkbox',
      ),
    );
  }
  $permissions = $this->permissionHandler
    ->getPermissions();
  $permissions_by_provider = array();
  foreach ($permissions as $permission_name => $permission) {
    $permissions_by_provider[$permission['provider']][$permission_name] = $permission;
  }
  foreach ($permissions_by_provider as $provider => $permissions) {

    // Module name.
    $form['permissions'][$provider] = array(
      array(
        '#wrapper_attributes' => array(
          'colspan' => count($role_names) + 1,
          'class' => array(
            'module',
          ),
          'id' => 'module-' . $provider,
        ),
        '#markup' => $this->moduleHandler
          ->getName($provider),
      ),
    );
    foreach ($permissions as $perm => $perm_item) {

      // Fill in default values for the permission.
      $perm_item += array(
        'description' => '',
        'restrict access' => FALSE,
        'warning' => !empty($perm_item['restrict access']) ? $this
          ->t('Warning: Give to trusted roles only; this permission has security implications.') : '',
      );
      $options[$perm] = $perm_item['title'];
      $form['permissions'][$perm]['description'] = array(
        '#type' => 'inline_template',
        '#template' => '<div class="permission"><span class="title">{{ title }}</span>{% if description or warning %}<div class="description">{% if warning %}<em class="permission-warning">{{ warning }}</em> {% endif %}{{ description }}</div>{% endif %}</div>',
        '#context' => array(
          'title' => $perm_item['title'],
        ),
      );

      // Show the permission description.
      if (!$hide_descriptions) {
        $form['permissions'][$perm]['description']['#context']['description'] = $perm_item['description'];
        $form['permissions'][$perm]['description']['#context']['warning'] = $perm_item['warning'];
      }
      $options[$perm] = '';
      foreach ($role_names as $rid => $name) {
        $form['permissions'][$perm][$rid] = array(
          '#title' => $name . ': ' . $perm_item['title'],
          '#title_display' => 'invisible',
          '#wrapper_attributes' => array(
            'class' => array(
              'checkbox',
            ),
          ),
          '#type' => 'checkbox',
          '#default_value' => in_array($perm, $role_permissions[$rid]) ? 1 : 0,
          '#attributes' => array(
            'class' => array(
              'rid-' . $rid,
              'js-rid-' . $rid,
            ),
          ),
          '#parents' => array(
            $rid,
            $perm,
          ),
        );

        // Show a column of disabled but checked checkboxes.
        if ($admin_roles[$rid]) {
          $form['permissions'][$perm][$rid]['#disabled'] = TRUE;
          $form['permissions'][$perm][$rid]['#default_value'] = TRUE;
        }
      }
    }
  }
  $form['actions'] = array(
    '#type' => 'actions',
  );
  $form['actions']['submit'] = array(
    '#type' => 'submit',
    '#value' => $this
      ->t('Save permissions'),
    '#button_type' => 'primary',
  );
  $form['#attached']['library'][] = 'user/drupal.user.permissions';
  return $form;
}