You are here

public function WebformEntityVariantsForm::form in Webform 6.x

Same name and namespace in other branches
  1. 8.5 src/WebformEntityVariantsForm.php \Drupal\webform\WebformEntityVariantsForm::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

src/WebformEntityVariantsForm.php, line 72

Class

WebformEntityVariantsForm
Provides a webform to manage submission variants.

Namespace

Drupal\webform

Code

public function form(array $form, FormStateInterface $form_state) {
  $user_input = $form_state
    ->getUserInput();

  // Hard code the form id.
  $form['#id'] = 'webform-variants-form';

  // Build table header.
  $header = [
    [
      'data' => $this
        ->t('Title / Notes'),
    ],
    [
      'data' => $this
        ->t('ID'),
      'class' => [
        RESPONSIVE_PRIORITY_LOW,
      ],
    ],
    [
      'data' => $this
        ->t('Element'),
      'class' => [
        RESPONSIVE_PRIORITY_LOW,
      ],
    ],
    [
      'data' => $this
        ->t('Summary'),
      'class' => [
        RESPONSIVE_PRIORITY_LOW,
      ],
    ],
    [
      'data' => $this
        ->t('Status'),
      'class' => [
        RESPONSIVE_PRIORITY_LOW,
      ],
    ],
    [
      'data' => $this
        ->t('Weight'),
      'class' => [
        'webform-tabledrag-hide',
      ],
    ],
    [
      'data' => $this
        ->t('Operations'),
    ],
  ];

  /** @var \Drupal\webform\WebformInterface $webform */
  $webform = $this
    ->getEntity();

  // Build table rows for variants.
  $variants = $webform
    ->getVariants();
  $rows = [];
  foreach ($variants as $variant_id => $variant) {
    $offcanvas_dialog_attributes = WebformDialogHelper::getOffCanvasDialogAttributes($variant
      ->getOffCanvasWidth());
    $row['#attributes']['class'][] = 'draggable';
    $row['#attributes']['data-webform-key'] = $variant_id;
    $row['#weight'] = isset($user_input['variants']) && isset($user_input['variants'][$variant_id]) ? $user_input['variants'][$variant_id]['weight'] : NULL;
    $row['title'] = [
      '#tree' => FALSE,
      'data' => [
        'label' => [
          '#type' => 'link',
          '#title' => $variant
            ->label(),
          '#url' => Url::fromRoute('entity.webform.variant.edit_form', [
            'webform' => $webform
              ->id(),
            'webform_variant' => $variant_id,
          ]),
          '#attributes' => $offcanvas_dialog_attributes,
        ],
        'notes' => [
          '#prefix' => '<br/>',
          '#markup' => $variant
            ->getNotes(),
        ],
      ],
    ];
    $row['id'] = [
      '#markup' => $variant_id,
    ];
    $variant_element_key = $variant
      ->getElementKey();
    $variant_element = $webform
      ->getElement($variant_element_key);
    if ($variant_element) {
      $webform_element = $this->elementManager
        ->getElementInstance($variant_element);
      $row['element'] = [
        '#markup' => $webform_element
          ->getAdminLabel($variant_element),
      ];
    }
    else {
      $row['element'] = [
        'data' => [
          '#markup' => $this
            ->t("'@element_key' is missing.", [
            '@element_key' => $variant_element_key,
          ]),
          '#prefix' => '<b class="color-error">',
          '#suffix' => '</b>',
        ],
      ];
    }
    $row['summary'] = $variant
      ->getSummary();
    if ($variant
      ->isDisabled()) {
      $status = $this
        ->t('Disabled');
    }
    else {
      $status = $this
        ->t('Enabled');
    }
    $row['status'] = [
      'data' => [
        '#markup' => $status,
      ],
    ];
    $row['weight'] = [
      '#type' => 'weight',
      '#title' => $this
        ->t('Weight for @title', [
        '@title' => $variant
          ->label(),
      ]),
      '#title_display' => 'invisible',
      '#delta' => 50,
      '#default_value' => $variant
        ->getWeight(),
      '#attributes' => [
        'class' => [
          'webform-variant-order-weight',
        ],
      ],
      '#wrapper_attributes' => [
        'class' => [
          'webform-tabledrag-hide',
        ],
      ],
    ];
    $operations = [];

    // Edit.
    $operations['edit'] = [
      'title' => $this
        ->t('Edit'),
      'url' => Url::fromRoute('entity.webform.variant.edit_form', [
        'webform' => $webform
          ->id(),
        'webform_variant' => $variant_id,
      ]),
      'attributes' => $offcanvas_dialog_attributes,
    ];

    // Duplicate.
    $operations['duplicate'] = [
      'title' => $this
        ->t('Duplicate'),
      'url' => Url::fromRoute('entity.webform.variant.duplicate_form', [
        'webform' => $webform
          ->id(),
        'webform_variant' => $variant_id,
      ]),
      'attributes' => $offcanvas_dialog_attributes,
    ];
    if ($variant_element && $variant
      ->isEnabled()) {

      // If #prepopulate is disabled use '_webform_variant'
      // querystring parameter for view and test operations.
      // @see \Drupal\webform\Entity\Webform::getSubmissionForm
      $query = [
        $variant_element_key => $variant_id,
      ];
      if (empty($variant_element['#prepopulate'])) {
        $query = [
          '_webform_variant' => $query,
        ];
      }

      // View.
      $operations['view'] = [
        'title' => $this
          ->t('View'),
        'url' => Url::fromRoute('entity.webform.canonical', [
          'webform' => $webform
            ->id(),
        ], [
          'query' => $query,
        ]),
      ];

      // Test.
      if ($webform
        ->access('test')) {
        $operations['test'] = [
          'title' => $this
            ->t('Test'),
          'url' => Url::fromRoute('entity.webform.test_form', [
            'webform' => $webform
              ->id(),
          ], [
            'query' => $query,
          ]),
        ];
      }

      // Share.
      if ($this->moduleHandler
        ->moduleExists('webform_share') && $webform
        ->access('update') && $webform
        ->getSetting('share', TRUE)) {
        $operations['share'] = [
          'title' => $this
            ->t('Share'),
          'url' => Url::fromRoute('entity.webform.share_embed', [
            'webform' => $webform
              ->id(),
          ], [
            'query' => $query,
          ]),
        ];
      }
    }

    // Apply.
    $operations['apply'] = [
      'title' => $this
        ->t('Apply'),
      'url' => Url::fromRoute('entity.webform.variant.apply_form', [
        'webform' => $webform
          ->id(),
      ], [
        'query' => [
          'variant_id' => $variant_id,
        ],
      ]),
      'attributes' => WebformDialogHelper::getModalDialogAttributes(WebformDialogHelper::DIALOG_NARROW),
    ];

    // Add AJAX functionality to enable/disable operations.
    $operations['status'] = [
      'title' => $variant
        ->isEnabled() ? $this
        ->t('Disable') : $this
        ->t('Enable'),
      'url' => Url::fromRoute('entity.webform.variant.' . ($variant
        ->isEnabled() ? 'disable' : 'enable'), [
        'webform' => $webform
          ->id(),
        'webform_variant' => $variant_id,
      ]),
      'attributes' => WebformDialogHelper::getModalDialogAttributes(WebformDialogHelper::DIALOG_NARROW, [
        'use-ajax',
      ]),
    ];

    // Delete.
    $operations['delete'] = [
      'title' => $this
        ->t('Delete'),
      'url' => Url::fromRoute('entity.webform.variant.delete_form', [
        'webform' => $webform
          ->id(),
        'webform_variant' => $variant_id,
      ]),
      'attributes' => WebformDialogHelper::getModalDialogAttributes(WebformDialogHelper::DIALOG_NARROW),
    ];
    $row['operations'] = [
      '#type' => 'operations',
      '#links' => $operations,
      '#prefix' => '<div class="webform-dropbutton">',
      '#suffix' => '</div>',
    ];
    $rows[$variant_id] = $row;
  }

  // Add test multiple variants.
  if ($webform
    ->getVariants()
    ->count() > 1 && count($webform
    ->getElementsVariant()) > 1) {
    $row = [];
    $row['#attributes']['class'] = [
      'webform-variant-table-test-multiple',
    ];
    $row[] = [
      '#wrapper_attributes' => [
        'colspan' => 6,
      ],
    ];
    $operations = [];

    // View variants.
    $operations['view'] = [
      'title' => $this
        ->t('View variants'),
      'url' => Url::fromRoute('entity.webform.variant.view_form', [
        'webform' => $webform
          ->id(),
      ]),
      'attributes' => WebformDialogHelper::getModalDialogAttributes(WebformDialogHelper::DIALOG_NARROW),
    ];

    // Test variants.
    if ($webform
      ->access('test')) {
      $operations['test'] = [
        'title' => $this
          ->t('Test variants'),
        'url' => Url::fromRoute('entity.webform.variant.test_form', [
          'webform' => $webform
            ->id(),
        ]),
        'attributes' => WebformDialogHelper::getModalDialogAttributes(WebformDialogHelper::DIALOG_NARROW),
      ];
    }

    // Share variants.
    if ($this->moduleHandler
      ->moduleExists('webform_share') && $webform
      ->access('update') && $webform
      ->getSetting('share', TRUE)) {
      $operations['share'] = [
        'title' => $this
          ->t('Share variants'),
        'url' => Url::fromRoute('entity.webform.variant.share_form', [
          'webform' => $webform
            ->id(),
        ]),
        'attributes' => WebformDialogHelper::getModalDialogAttributes(WebformDialogHelper::DIALOG_NARROW),
      ];
    }

    // Apply variants.
    $operations['apply'] = [
      'title' => $this
        ->t('Apply variants'),
      'url' => Url::fromRoute('entity.webform.variant.apply_form', [
        'webform' => $webform
          ->id(),
      ]),
      'attributes' => WebformDialogHelper::getModalDialogAttributes(WebformDialogHelper::DIALOG_NARROW),
    ];
    $row['operations'] = [
      '#type' => 'operations',
      '#prefix' => '<div class="webform-dropbutton">',
      '#suffix' => '</div>',
      '#links' => $operations,
    ];
    $rows[] = $row;
  }

  // Build the list of existing webform variants for this webform.
  $form['variants'] = [
    '#type' => 'table',
    '#header' => $header,
    '#tabledrag' => [
      [
        'action' => 'order',
        'relationship' => 'sibling',
        'group' => 'webform-variant-order-weight',
      ],
    ],
    '#attributes' => [
      'id' => 'webform-variants',
      'class' => [
        'webform-variants-table',
      ],
    ],
    '#empty' => $this
      ->t('There are currently no variants setup for this webform.'),
  ] + $rows;

  // Must preload libraries required by (modal) dialogs.
  WebformDialogHelper::attachLibraries($form);
  $form['#attached']['library'][] = 'webform/webform.admin.tabledrag';
  return parent::form($form, $form_state);
}