You are here

public function BulkUpdateFieldsForm::buildForm in Bulk Update Fields 8

Same name and namespace in other branches
  1. 8.2 src/Form/BulkUpdateFieldsForm.php \Drupal\bulk_update_fields\Form\BulkUpdateFieldsForm::buildForm()

Form constructor.

Parameters

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

\Drupal\Core\Form\FormStateInterface $form_state: The current state of the form.

Return value

array The form structure.

Overrides FormInterface::buildForm

File

src/Form/BulkUpdateFieldsForm.php, line 148

Class

BulkUpdateFieldsForm
BulkUpdateFieldsForm.

Namespace

Drupal\bulk_update_fields\Form

Code

public function buildForm(array $form, FormStateInterface $form_state) {
  if (isset($this->form)) {
    $form = $this->form;
  }
  $form['#title'] = $this
    ->t('Bulk Update Fields');
  $submit_label = 'Next';
  switch ($this->step) {
    case 1:

      // Retrieve IDs from the temporary storage.
      $this->userInput['entities'] = $this->tempStoreFactory
        ->get('bulk_update_fields_ids')
        ->get($this->currentUser
        ->id());
      $options = [];

      // Exclude some base fields.
      // TODO add date fields and revision log.
      $excluded_base_fields = [
        'nid',
        'uuid',
        'vid',
        'type',
        'revision_uid',
        'title',
        'path',
        'menu_link',
        'status',
        'uid',
        'default_langcode',
        'revision_timestamp',
        'revision_log',
        'created',
        'changed',
      ];
      foreach ($this->userInput['entities'] as $entity) {
        $this->entity = $entity;
        $fields = $entity
          ->getFieldDefinitions();
        foreach ($fields as $field) {
          if (!in_array($field
            ->getName(), $excluded_base_fields) && !isset($options[$field
            ->getName()])) {
            $options[$field
              ->getName()]['field_name'] = $field
              ->getName();
          }
        }
      }
      $header = [
        'field_name' => $this
          ->t('Field Name'),
      ];
      $form['#title'] .= ' - ' . $this
        ->t('Select Fields to Alter');
      $form['table'] = [
        '#type' => 'tableselect',
        '#header' => $header,
        '#options' => $options,
        '#empty' => $this
          ->t('No fields found'),
      ];
      break;
    case 2:
      foreach ($this->userInput['entities'] as $entity) {
        $this->entity = $entity;
        foreach ($this->userInput['fields'] as $field_name) {
          $temp_form_element = [];
          $temp_form_state = new FormState();
          if ($field = $entity
            ->getFieldDefinition($field_name)) {

            // TODO Dates fields are incorrect due to TODOs below.
            if ($field
              ->getType() == 'datetime') {
              drupal_set_message($this
                ->t('Cannot update field @field_name. Date field types are not yet updatable.', [
                '@field_name' => $field_name,
              ]), 'error');
              continue;
            }

            // TODO
            // I cannot figure out how to get a form element for only a field.
            // Maybe someone else can.
            // TODO Doing it this way does not allow for feild labels on
            // textarea widgets.
            $form[$field_name] = $entity
              ->get($field_name)
              ->defaultValuesForm($temp_form_element, $temp_form_state);
          }
        }
      }
      $form['#title'] .= ' - ' . $this
        ->t('Enter New Values in Appropriate Fields');
      break;
    case 3:
      $form['#title'] .= ' - ' . $this
        ->t('Are you sure you want to alter @count_fields fields on @count_entities entities?', [
        '@count_fields' => count($this->userInput['fields']),
        '@count_entities' => count($this->userInput['entities']),
      ]);
      $submit_label = 'Update Fields';
      break;
  }
  drupal_set_message($this
    ->t('This module is experiemental. PLEASE do not use on production databases without prior testing and a complete database dump.'), 'warning');
  $form['actions']['submit'] = [
    '#type' => 'submit',
    '#value' => $submit_label,
    '#button_type' => 'primary',
  ];
  return $form;
}