You are here

public function ContentModerationNotificationsFormBase::buildForm in Content Moderation Notifications 8.3

Same name and namespace in other branches
  1. 8 src/Form/ContentModerationNotificationsFormBase.php \Drupal\content_moderation_notifications\Form\ContentModerationNotificationsFormBase::buildForm()
  2. 8.2 src/Form/ContentModerationNotificationsFormBase.php \Drupal\content_moderation_notifications\Form\ContentModerationNotificationsFormBase::buildForm()

Overrides Drupal\Core\Entity\EntityFormController::form().

Builds the entity add/edit form.

Parameters

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

\Drupal\Core\Form\FormStateInterface $form_state: An associative array containing the current state of the form.

Return value

array An associative array containing the content_moderation_notification add/edit form.

Overrides EntityForm::buildForm

File

src/Form/ContentModerationNotificationsFormBase.php, line 53

Class

ContentModerationNotificationsFormBase
Class ContentModerationNotificationFormBase.

Namespace

Drupal\content_moderation_notifications\Form

Code

public function buildForm(array $form, FormStateInterface $form_state) {

  // Retrieve a list of all possible workflows.

  /** @var \Drupal\workflows\WorkflowInterface[] $workflows */
  $workflows = $this->entityTypeManager
    ->getStorage('workflow')
    ->loadMultiple();

  // Return early if there are no available workflows.
  if (empty($workflows)) {
    $form['no_workflows'] = [
      '#type' => 'markup',
      '#markup' => $this
        ->t('No workflows available. <a href=":url">Manage workflows</a>.', [
        ':url' => Url::fromRoute('entity.workflow.collection')
          ->toString(),
      ]),
    ];
    return $form;
  }

  // Get anything we need from the base class.
  $form = parent::buildForm($form, $form_state);

  // Drupal provides the entity to us as a class variable. If this is an
  // existing entity, it will be populated with existing values as class
  // variables. If this is a new entity, it will be a new object with the
  // class of our entity. Drupal knows which class to call from the
  // annotation on our ContentModerationNotification class.

  /** @var \Drupal\content_moderation_notifications\ContentModerationNotificationInterface $content_moderation_notification */
  $content_moderation_notification = $this->entity;

  // Build the options array of workflows.
  $workflow_options = [];
  foreach ($workflows as $workflow_id => $workflow) {
    $workflow_options[$workflow_id] = $workflow
      ->label();
  }

  // Default to the first workflow in the list.
  $workflow_keys = array_keys($workflow_options);
  if ($form_state
    ->getValue('workflow')) {
    $selected_workflow = $form_state
      ->getValue('workflow');
  }
  elseif (isset($content_moderation_notification->workflow)) {
    $selected_workflow = $content_moderation_notification->workflow;
  }
  else {
    $selected_workflow = array_shift($workflow_keys);
  }
  $form['label'] = [
    '#title' => $this
      ->t('Label'),
    '#type' => 'textfield',
    '#default_value' => $content_moderation_notification
      ->label(),
    '#description' => $this
      ->t('The label for this notification.'),
    '#required' => TRUE,
    '#size' => 30,
  ];
  $form['id'] = [
    '#type' => 'machine_name',
    '#title' => $this
      ->t('Machine name'),
    '#default_value' => $content_moderation_notification
      ->id(),
    '#machine_name' => [
      'exists' => [
        $this,
        'exists',
      ],
      'source' => [
        'label',
      ],
    ],
    '#disabled' => !$content_moderation_notification
      ->isNew(),
  ];

  // Allow the workflow to be selected, this will dynamically update the
  // available transition lists.
  $form['workflow'] = [
    '#type' => 'select',
    '#title' => $this
      ->t('Workflow'),
    '#options' => $workflow_options,
    '#default_value' => $selected_workflow,
    '#required' => TRUE,
    '#description' => $this
      ->t('Select a workflow'),
    '#ajax' => [
      'wrapper' => 'workflow_transitions_wrapper',
      'callback' => static::class . '::updateWorkflowTransitions',
    ],
  ];

  // Ajax replaceable fieldset.
  $form['transitions_wrapper'] = [
    '#type' => 'container',
    '#prefix' => '<div id="workflow_transitions_wrapper">',
    '#suffix' => '</div>',
  ];

  // Transitions.
  $state_transitions_options = [];
  $state_transitions = $workflows[$selected_workflow]
    ->getTypePlugin()
    ->getTransitions();
  foreach ($state_transitions as $key => $transition) {
    $state_transitions_options[$key] = $transition
      ->label();
  }
  $form['transitions_wrapper']['transitions'] = [
    '#type' => 'checkboxes',
    '#title' => $this
      ->t('Transitions'),
    '#options' => $state_transitions_options,
    '#default_value' => isset($content_moderation_notification->transitions) ? $content_moderation_notification->transitions : [],
    '#required' => TRUE,
    '#description' => $this
      ->t('Select which transitions triggers this notification.'),
  ];

  // Role selection.
  $roles_options = user_role_names(TRUE);
  $form['roles'] = [
    '#type' => 'checkboxes',
    '#title' => $this
      ->t('Roles'),
    '#options' => $roles_options,
    '#default_value' => $content_moderation_notification
      ->getRoleIds(),
    '#description' => $this
      ->t('Send notifications to all users with these roles.'),
  ];

  // Send email to author?
  $form['author'] = [
    '#type' => 'checkbox',
    '#title' => $this
      ->t('Email the author?'),
    '#default_value' => $content_moderation_notification
      ->sendToAuthor(),
    '#description' => $this
      ->t('Send notifications to the current author of the content.'),
  ];
  $form['site_mail'] = [
    '#type' => 'checkbox',
    '#title' => $this
      ->t('Disable the site email address'),
    '#default_value' => $content_moderation_notification
      ->disableSiteMail(),
    '#description' => $this
      ->t('Do not send notifications to the site email address.'),
  ];
  $form['emails'] = [
    '#type' => 'textarea',
    '#title' => $this
      ->t('Adhoc email addresses'),
    '#default_value' => $content_moderation_notification
      ->getEmails(),
    '#description' => $this
      ->t('Send notifications to these email addresses, emails should be entered as a comma separated list and optionally on separate lines.'),
  ];

  // Email subject line.
  $form['subject'] = [
    '#type' => 'textfield',
    '#title' => $this
      ->t('Email Subject'),
    '#default_value' => $content_moderation_notification
      ->getSubject(),
    '#required' => TRUE,
    '#maxlength' => 1024,
  ];

  // Email body content.
  $form['body'] = [
    '#type' => 'text_format',
    '#format' => $content_moderation_notification
      ->getMessageFormat() ?: filter_default_format(),
    '#title' => $this
      ->t('Email Body'),
    '#default_value' => $content_moderation_notification
      ->getMessage(),
  ];

  // Add token tree link if module exists.
  if ($this->moduleHandler
    ->moduleExists('token')) {
    $form['body']['token_tree_link'] = [
      '#theme' => 'token_tree_link',
      '#token_types' => array_unique([
        'user',
        $selected_workflow,
        'node',
      ]),
      '#weight' => 10,
    ];
  }

  // Return the form.
  return $form;
}