You are here

public function EntityExportCsvForm::form in Entity Export CSV 8

Gets the actual form array to be built.

Overrides EntityForm::form

See also

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

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

1 call to EntityExportCsvForm::form()
EntityExportCsvDuplicateForm::form in src/Form/EntityExportCsvDuplicateForm.php
Gets the actual form array to be built.
1 method overrides EntityExportCsvForm::form()
EntityExportCsvDuplicateForm::form in src/Form/EntityExportCsvDuplicateForm.php
Gets the actual form array to be built.

File

src/Form/EntityExportCsvForm.php, line 78

Class

EntityExportCsvForm
Class EntityExportCsvForm.

Namespace

Drupal\entity_export_csv\Form

Code

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

  /** @var \Drupal\entity_export_csv\Entity\EntityExportCsvInterface $entity_export_csv */
  $entity_export_csv = $this->entity;
  $form['label'] = [
    '#type' => 'textfield',
    '#title' => $this
      ->t('Label'),
    '#maxlength' => 255,
    '#default_value' => $entity_export_csv
      ->label(),
    '#description' => $this
      ->t("Label for the Entity export csv."),
    '#required' => TRUE,
    '#weight' => -100,
  ];
  $form['id'] = [
    '#type' => 'machine_name',
    '#default_value' => $entity_export_csv
      ->id(),
    '#machine_name' => [
      'exists' => '\\Drupal\\entity_export_csv\\Entity\\EntityExportCsv::load',
    ],
    '#disabled' => !$entity_export_csv
      ->isNew(),
    '#weight' => -99,
  ];
  $form['#attached']['library'][] = 'entity_export_csv/export_form';
  $options = $this->manager
    ->getContentEntityTypesEnabled(TRUE);
  if (empty($options)) {
    $this
      ->messenger()
      ->addWarning($this
      ->t('No entity type have been configured to be exported.'));
    return $form;
  }
  if ($this->languageManager
    ->isMultilingual()) {
    $languages = $this->languageManager
      ->getLanguages();
    $languages_options = [];
    foreach ($languages as $language_id => $language) {
      $languages_options[$language
        ->getId()] = $language
        ->getName();
    }
    $form['langcode'] = [
      '#type' => 'select',
      '#title' => $this
        ->t('Language'),
      '#description' => $this
        ->t('Select the language you want export'),
      '#options' => $languages_options,
      '#default_value' => $entity_export_csv
        ->getLangCode() ?: $this->languageManager
        ->getDefaultLanguage()
        ->getId(),
    ];
  }
  $entity_type_id_default = $entity_export_csv
    ->getTargetEntityTypeId() ?: '';
  $form['entity_type_id'] = [
    '#type' => 'select',
    '#title' => $this
      ->t('Entity type'),
    '#required' => TRUE,
    '#options' => [
      '' => $this
        ->t('Select'),
    ] + $options,
    '#default_value' => $entity_type_id_default,
    '#ajax' => [
      'event' => 'change',
      'method' => 'replace',
      'wrapper' => 'bundle-wrapper',
      'callback' => [
        $this,
        'ajaxReplaceBundleCallback',
      ],
    ],
  ];
  $form['bundle_wrapper'] = [
    '#type' => 'container',
    '#prefix' => '<div id="bundle-wrapper">',
    '#suffix' => '</div>',
  ];
  $entity_type_id = $this
    ->getElementPropertyValue('entity_type_id', $form_state, $entity_type_id_default);
  $bundles = $this->manager
    ->getBundlesEnabledPerEntityType($entity_type_id, TRUE);
  $bundle_default = $entity_export_csv
    ->getTargetBundle() ?: '';
  if ($entity_type_id) {
    $form['bundle_wrapper']['bundle'] = [
      '#type' => 'select',
      '#title' => $this
        ->t('Bundle'),
      '#description' => $this
        ->t('Select the bundle to export.'),
      '#options' => [
        '' => $this
          ->t('- Select -'),
      ] + $bundles,
      '#default_value' => $this
        ->getElementPropertyValue('bundle', $form_state, $bundle_default),
      '#required' => TRUE,
      '#ajax' => [
        'event' => 'change',
        'method' => 'replace',
        'wrapper' => 'fields-wrapper',
        'callback' => [
          $this,
          'ajaxReplaceFieldsCallback',
        ],
      ],
    ];
    $delimiters = $this->manager
      ->getDelimiters();
    $form['bundle_wrapper']['delimiter'] = [
      '#type' => 'select',
      '#title' => $this
        ->t('Delimiter'),
      '#options' => $delimiters,
      '#default_value' => $entity_export_csv
        ->getDelimiter() ?: ',',
    ];
    $form['bundle_wrapper']['fields'] = [
      '#type' => 'container',
      '#prefix' => '<div id="fields-wrapper">',
      '#suffix' => '</div>',
      '#tree' => TRUE,
      '#attributes' => [
        'class' => [
          'inline-elements',
        ],
      ],
    ];
    $bundle = $this
      ->getElementPropertyValue('bundle', $form_state, $bundle_default);
    if ($bundle) {
      $form['bundle_wrapper']['fields']['#title'] = $this
        ->t('Select fields to export');
      $fields = $this->manager
        ->getBundleFieldsEnabled($entity_type_id, $bundle, TRUE);
      $fields_default_values = $entity_export_csv
        ->getFields() ?: [];
      if (!empty($fields_default_values)) {
        $this->manager
          ->sortNaturalFields($fields, $fields_default_values);
      }
      foreach ($fields as $field_name => $definition) {
        $field_name_class = Html::cleanCssIdentifier($field_name);
        $form['bundle_wrapper']['fields'][$field_name] = [
          '#type' => 'fieldset',
          '#title' => $definition
            ->getLabel(),
          '#tree' => TRUE,
        ];
        $enable_default = isset($fields_default_values[$field_name]['enable']) ? $fields_default_values[$field_name]['enable'] : TRUE;
        $form['bundle_wrapper']['fields'][$field_name]['enable'] = [
          '#type' => 'checkbox',
          '#title' => $this
            ->t('Enable'),
          '#default_value' => $this
            ->getElementPropertyValue([
            'fields',
            $field_name,
            'enable',
          ], $form_state, $enable_default),
        ];
        $order_default = isset($fields_default_values[$field_name]['order']) ? $fields_default_values[$field_name]['order'] : 0;
        $form['bundle_wrapper']['fields'][$field_name]['order'] = [
          '#type' => 'number',
          '#title' => $this
            ->t('Order'),
          '#required' => TRUE,
          '#default_value' => $this
            ->getElementPropertyValue([
            'fields',
            $field_name,
            'order',
          ], $form_state, $order_default),
        ];
        $field_type = $definition
          ->getType();
        $exporters = $this->fieldTypeExportManager
          ->getFieldTypeOptions($field_type, $entity_type_id, $bundle, $field_name);
        $exporter_ids = array_keys($exporters);
        $default_exporter = isset($fields_default_values[$field_name]['exporter']) && isset($exporters[$fields_default_values[$field_name]['exporter']]) ? $fields_default_values[$field_name]['exporter'] : $this
          ->getDefaultExporterId($exporter_ids);
        $default_exporter_value = $this
          ->getElementPropertyValue([
          'fields',
          $field_name,
          'exporter',
        ], $form_state, $default_exporter);
        $form['bundle_wrapper']['fields'][$field_name]['exporter'] = [
          '#type' => 'select',
          '#title' => $this
            ->t('Export format'),
          '#options' => $exporters,
          '#default_value' => $default_exporter_value,
          '#required' => TRUE,
          '#ajax' => [
            'event' => 'change',
            'method' => 'replace',
            'wrapper' => 'fields-wrapper',
            'callback' => [
              $this,
              'ajaxReplaceFieldsCallback',
            ],
          ],
        ];
        $form['bundle_wrapper']['fields'][$field_name]['form'] = [
          '#type' => 'container',
          '#prefix' => '<div id="export-form-wrapper-"' . $field_name_class . '>',
          '#suffix' => '</div>',
        ];
        $triggering = $form_state
          ->getTriggeringElement();
        if ($triggering['#name'] === 'fields[' . $field_name . '][exporter]') {
          $default_exporter_value = $triggering['#value'];
        }

        // @TODO handle configuration values
        $configuration_default = isset($fields_default_values[$field_name]['form']['options']) ? $fields_default_values[$field_name]['form']['options'] : [];
        $configuration = $this
          ->getElementPropertyValue([
          'fields',
          $field_name,
          'form',
          'options',
        ], $form_state, $configuration_default);

        /** @var \Drupal\entity_export_csv\Plugin\FieldTypeExportInterface $plugin */
        $plugin = $this->fieldTypeExportManager
          ->createInstance($default_exporter_value, $configuration);
        $form['bundle_wrapper']['fields'][$field_name]['form']['options'] = $plugin
          ->buildConfigurationForm([], $form_state, $definition);
      }
    }
  }
  $form['status'] = [
    '#type' => 'checkbox',
    '#title' => $this
      ->t('Enabled'),
    '#default_value' => $entity_export_csv
      ->status(),
  ];
  return $form;
}