You are here

public function WebformAccessGroupForm::form in Webform 8.5

Same name and namespace in other branches
  1. 6.x modules/webform_access/src/WebformAccessGroupForm.php \Drupal\webform_access\WebformAccessGroupForm::form()

Gets the actual form array to be built.

Overrides EntityForm::form

See also

\Drupal\Core\Entity\EntityForm::processForm()

\Drupal\Core\Entity\EntityForm::afterBuild()

File

modules/webform_access/src/WebformAccessGroupForm.php, line 125

Class

WebformAccessGroupForm
Provides a form to define a webform access group.

Namespace

Drupal\webform_access

Code

public function form(array $form, FormStateInterface $form_state) {
  $is_webform_admin = $this
    ->currentUser()
    ->hasPermission('administer webform');

  /** @var \Drupal\webform_access\WebformAccessGroupInterface $webform_access_group */
  $webform_access_group = $this->entity;

  // Access group information which is displayed to group administrators.
  $form['information'] = [
    '#type' => 'details',
    '#title' => $this
      ->t('Group information'),
    '#access' => !$is_webform_admin,
  ];
  $form['information']['label'] = [
    '#type' => 'item',
    '#title' => $this
      ->t('Label'),
    '#markup' => $webform_access_group
      ->label(),
    '#input' => FALSE,
  ];
  if ($description = $webform_access_group
    ->get('description')) {
    $form['information']['description'] = [
      '#type' => 'item',
      '#title' => $this
        ->t('Description'),
      '#markup' => $description,
      '#input' => FALSE,
    ];
  }
  $form['information']['type'] = [
    '#type' => 'item',
    '#title' => $this
      ->t('Type'),
    '#markup' => $webform_access_group
      ->getTypeLabel(),
    '#input' => FALSE,
  ];
  $entities = WebformAccessGroupListBuilder::buildEntities($webform_access_group
    ->getEntityIds());
  if ($entities) {
    $form['information']['entities'] = [
      '#type' => 'item',
      '#title' => $this
        ->t('Nodes'),
      '#input' => FALSE,
      'nodes' => $entities,
    ];
  }
  $permissions = WebformAccessGroupListBuilder::buildPermissions($webform_access_group
    ->get('permissions'));
  if ($permissions) {
    $form['information']['permissions'] = [
      '#type' => 'item',
      '#title' => $this
        ->t('Permissions'),
      '#input' => FALSE,
      'nodes' => $permissions,
    ];
  }
  $admins = WebformAccessGroupListBuilder::buildUserAccounts($webform_access_group
    ->getAdminIds());
  if ($admins) {
    $form['information']['administrators'] = [
      '#type' => 'item',
      '#title' => $this
        ->t('Administrators'),
      '#input' => FALSE,
      'administrators' => $admins,
    ];
  }
  $form['general'] = [
    '#type' => 'details',
    '#title' => $this
      ->t('General information'),
    '#open' => TRUE,
    '#access' => $is_webform_admin,
  ];
  $form['general']['label'] = [
    '#type' => 'textfield',
    '#title' => $this
      ->t('Label'),
    '#maxlength' => 255,
    '#required' => TRUE,
    '#attributes' => $webform_access_group
      ->isNew() ? [
      'autofocus' => 'autofocus',
    ] : [],
    '#default_value' => $webform_access_group
      ->label(),
    '#access' => $is_webform_admin,
  ];
  $form['general']['id'] = [
    '#type' => 'machine_name',
    '#machine_name' => [
      'source' => [
        'general',
        'label',
      ],
      'exists' => '\\Drupal\\webform_access\\Entity\\WebformAccessGroup::load',
      'label' => '<br/>' . $this
        ->t('Machine name'),
    ],
    '#maxlength' => 32,
    '#field_suffix' => $webform_access_group
      ->isNew() ? ' (' . $this
      ->t('Maximum @max characters', [
      '@max' => 32,
    ]) . ')' : '',
    '#required' => TRUE,
    '#disabled' => !$webform_access_group
      ->isNew(),
    '#default_value' => $webform_access_group
      ->id(),
    '#access' => $is_webform_admin,
  ];
  $form['general']['description'] = [
    '#type' => 'webform_html_editor',
    '#title' => $this
      ->t('Description'),
    '#default_value' => $webform_access_group
      ->get('description'),
    '#access' => $is_webform_admin,
  ];
  $form['general']['type'] = [
    '#type' => 'webform_entity_select',
    '#title' => $this
      ->t('Type'),
    '#description' => $this
      ->t("The access group type is used to exposed an access group's users and email addresses to <code>[webform_access]</code> related tokens."),
    '#target_type' => 'webform_access_type',
    '#empty_option' => $this
      ->t('- None -'),
    '#default_value' => $webform_access_group
      ->get('type'),
    '#access' => $is_webform_admin,
  ];

  // Access.
  $form['access'] = [
    '#type' => 'details',
    '#title' => $this
      ->t('Access controls'),
    '#open' => TRUE,
  ];

  // Access: Users.
  $form['access']['users'] = [
    '#type' => 'webform_entity_select',
    '#title' => $this
      ->t('Users'),
    '#description' => $this
      ->t("Select which users can access this group's assigned nodes."),
    '#target_type' => 'user',
    '#multiple' => TRUE,
    '#selection_handler' => 'default:user',
    '#selection_settings' => [
      'include_anonymous' => FALSE,
    ],
    '#select2' => TRUE,
    '#default_value' => $webform_access_group
      ->getUserIds(),
  ];
  $this->elementManager
    ->processElement($form['access']['users']);

  // Access: Entities (Nodes).
  $form['access']['entities'] = [
    '#type' => 'select',
    '#title' => $this
      ->t('Nodes'),
    '#description' => $this
      ->t("Select which nodes that this group's users can access."),
    '#multiple' => TRUE,
    '#select2' => TRUE,
    '#options' => $this
      ->getEntitiesAsOptions(),
    '#default_value' => $webform_access_group
      ->getEntityIds(),
    '#access' => $is_webform_admin,
  ];
  $this->elementManager
    ->processElement($form['access']['entities']);

  // Permissions.
  $permissions_options = [];
  $access_rules = $this->webformAccessRulesManager
    ->getAccessRulesInfo();
  foreach ($access_rules as $permission => $access_rule) {
    $permissions_options[$permission] = [
      'title' => $access_rule['title'],
    ];
  }
  $form['permissions'] = [
    '#type' => 'details',
    '#title' => $this
      ->t('Permissions'),
    '#open' => TRUE,
    '#access' => $is_webform_admin,
  ];
  $form['permissions']['permissions'] = [
    '#type' => 'tableselect',
    '#header' => [
      'title' => $this
        ->t('Permission'),
    ],
    '#js_select' => FALSE,
    '#options' => $permissions_options,
    '#default_value' => $webform_access_group
      ->get('permissions'),
    '#access' => $is_webform_admin,
  ];
  $this->elementManager
    ->processElement($form['permissions']['permissions']);

  // Notifications.
  $form['notifications'] = [
    '#type' => 'details',
    '#title' => $this
      ->t('Custom notifications'),
    '#open' => TRUE,
  ];
  $form['notifications']['emails'] = [
    '#type' => 'webform_multiple',
    '#title' => $this
      ->t('Emails'),
    '#description' => $this
      ->t('Custom email addresses are solely for email notifications and are included in <code>[webform_access]</code> related tokens.'),
    '#add_more_input_label' => $this
      ->t('more emails'),
    '#sorting' => FALSE,
    '#operations' => FALSE,
    '#element' => [
      '#type' => 'email',
      '#title' => $this
        ->t('Emails'),
      '#title_display' => 'invisible',
    ],
    '#default_value' => $webform_access_group
      ->getEmails(),
  ];

  // Administration.
  $form['administration'] = [
    '#type' => 'details',
    '#title' => $this
      ->t('Administration'),
    '#open' => TRUE,
    '#access' => $is_webform_admin,
  ];

  // Administration: Admins.
  $form['administration']['admins'] = [
    '#type' => 'webform_entity_select',
    '#title' => $this
      ->t('Administrators'),
    '#description' => $this
      ->t('Administrators will be able to add and remove users and custom email addresses from this group.') . '<br/><br/>' . "<em>Please note: Administrators are not automatically assigned access to this group's webforms and will not receive any emails. If administrators should also be able access this access group's webforms or receive emails, you must explicitly add the administrator as a user or email address to this access group.</em>",
    '#target_type' => 'user',
    '#multiple' => TRUE,
    '#selection_handler' => 'default:user',
    '#selection_settings' => [
      'include_anonymous' => FALSE,
    ],
    '#select2' => TRUE,
    '#default_value' => $webform_access_group
      ->getAdminIds(),
    '#access' => $is_webform_admin,
  ];
  $this->elementManager
    ->processElement($form['administration']['admins']);
  $form['#attached']['library'][] = 'webform_access/webform_access.admin';
  return parent::form($form, $form_state);
}