You are here

public function PardotContactFormMapFormBase::buildForm in Pardot Integration 8

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

Builds the entity add/edit form.

Parameters

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

array $form_state: An associative array containing the current state of the form.

Return value

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

Overrides EntityForm::buildForm

File

src/Form/PardotContactFormMapFormBase.php, line 80

Class

PardotContactFormMapFormBase
Class PardotContactFormMapFormBase.

Namespace

Drupal\pardot\Form

Code

public function buildForm(array $form, FormStateInterface $form_state) {
  $form = parent::buildForm($form, $form_state);

  // @Todo: Set defaults from config entity $mapping.
  $mapping = $this->entity;

  // Build the form.
  $form['label'] = array(
    '#type' => 'textfield',
    '#title' => $this
      ->t('Label'),
    '#maxlength' => 255,
    '#default_value' => $mapping
      ->label(),
    '#required' => TRUE,
  );
  $form['id'] = array(
    '#type' => 'machine_name',
    '#title' => $this
      ->t('Machine name'),
    '#default_value' => $mapping
      ->id(),
    '#machine_name' => array(
      'exists' => array(
        $this,
        'exists',
      ),
      'replace_pattern' => '([^a-z0-9_]+)|(^custom$)',
      'error' => 'The machine-readable name must be unique, and can only contain lowercase letters, numbers, and underscores. Additionally, it can not be the reserved word "custom".',
    ),
    '#disabled' => !$mapping
      ->isNew(),
  );
  $form['status'] = array(
    '#title' => 'Is active',
    '#type' => 'checkbox',
    '#default_value' => $mapping->status,
  );
  $form['post_url'] = array(
    '#title' => 'Post url',
    '#type' => 'textfield',
    '#default_value' => $mapping->post_url,
    '#description' => $this
      ->t('Visit your "Form Handlers" page in Pardot. Click on a form link and then copy the "Endpoint URL" value here.'),
  );

  // Provide contact_form config entities as options.
  $options = array();
  $contact_storage = $this->entityTypeManager
    ->getStorage('contact_form');
  $contact_forms = $contact_storage
    ->loadMultiple();

  // @Todo: Remove options that are already configured, set help text w/
  // those already set.
  foreach ($contact_forms as $contact_form) {
    $options[$contact_form
      ->id()] = $contact_form
      ->label();
  }

  // Disable caching on this form.
  $form_state
    ->setCached(FALSE);
  $form['contact_form_id'] = array(
    '#type' => 'select',
    '#title' => $this
      ->t('Contact Form'),
    '#options' => $options,
    '#default_value' => $mapping->contact_form_id,
    '#required' => TRUE,
    '#ajax' => array(
      'callback' => '::updateMapSettings',
      'wrapper' => 'pardot-form-mapping-wrapper',
      'effect' => 'fade',
      'progress' => array(
        'type' => 'throbber',
        'message' => t('Loading the field mapping table...'),
      ),
    ),
    '#disabled' => !$mapping
      ->isNew(),
  );

  // Add target element for ajax callback.
  $form['container'] = array(
    '#type' => 'container',
    '#attributes' => array(
      'id' => 'pardot-form-mapping-wrapper',
    ),
  );

  // When editing or when rebuilding form after ajax callback, add mapping
  // table element with selected form field definitions.
  if (isset($mapping->contact_form_id)) {
    $bundle = $mapping->contact_form_id;
  }
  elseif ($form_state
    ->getValue('contact_form_id') !== NULL) {
    $bundle = $form_state
      ->getValue('contact_form_id');
  }
  else {
    $bundle = NULL;
  }
  if (isset($bundle)) {
    $bundle_fields = array();
    $field_definitions = $this->entityFieldManager
      ->getFieldDefinitions('contact_message', $bundle);
    foreach ($field_definitions as $field_name => $field_definition) {
      $bundle_fields[] = array(
        'field_label' => (string) $field_definition
          ->getLabel(),
        'field_name' => $field_definition
          ->getName(),
        'field_type' => $field_definition
          ->getType(),
      );
    }
    $header = array(
      'field_label' => $this
        ->t('Field Label'),
      'field_name' => $this
        ->t('Field Name'),
      'field_type' => $this
        ->t('Field Type'),
      'pardot_key' => $this
        ->t('Pardot External Field Name'),
    );
    $form['container']['mapped_fields'] = array(
      '#type' => 'table',
      '#caption' => $this
        ->t('Add Pardot External Field Names to map contact form elements.'),
      '#header' => $header,
      '#tree' => TRUE,
    );

    // Generate tables rows.
    foreach ($bundle_fields as $field) {
      $form['container']['mapped_fields'][$field['field_name']]['field_label'] = array(
        '#plain_text' => $field['field_label'],
      );
      $form['container']['mapped_fields'][$field['field_name']]['field_name'] = array(
        '#plain_text' => $field['field_name'],
      );
      $form['container']['mapped_fields'][$field['field_name']]['field_type'] = array(
        '#plain_text' => $field['field_type'],
      );
      $form['container']['mapped_fields'][$field['field_name']]['pardot_key'] = array(
        '#type' => 'textfield',
        '#title' => $this
          ->t('Pardot External Field Name'),
        '#title_display' => 'invisible',
        '#default_value' => isset($mapping->mapped_fields[$field['field_name']]) ? $mapping->mapped_fields[$field['field_name']] : NULL,
      );
    }
  }
  return $form;
}