You are here

function JobItemForm::reviewFormElement in Translation Management Tool 8

Build form elements for the review form using flattened data items.

@todo Mention in the api documentation that the char '|' is not allowed in field names.

Parameters

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

array $data: Flattened array of translation data items.

string $parent_key: The key for $data.

Return value

array|NULL Render array with the form element, or NULL if the text is not set.

1 call to JobItemForm::reviewFormElement()
JobItemForm::form in src/Form/JobItemForm.php
Overrides Drupal\Core\Entity\EntityForm::form().

File

src/Form/JobItemForm.php, line 407

Class

JobItemForm
Form controller for the job item edit forms.

Namespace

Drupal\tmgmt\Form

Code

function reviewFormElement(FormStateInterface $form_state, $data, $parent_key) {
  $review_element = NULL;
  foreach (Element::children($data) as $key) {
    $data_item = $data[$key];
    if (isset($data_item['#text']) && \Drupal::service('tmgmt.data')
      ->filterData($data_item)) {

      // The char sequence '][' confuses the form API so we need to replace
      // it when using it for the form field name.
      $field_name = str_replace('][', '|', $key);

      // Ensure that the review form structure is initialized.
      $review_element['#theme'] = 'tmgmt_data_items_form';
      $review_element['#ajaxid'] = $ajax_id = tmgmt_review_form_element_ajaxid($parent_key);
      $review_element['#top_label'] = array_shift($data_item['#parent_label']);
      $leave_label = array_pop($data_item['#parent_label']);

      // Data items are grouped based on their key hierarchy, calculate the
      // group key and ensure that the group is initialized.
      $group_name = substr($field_name, 0, strrpos($field_name, '|'));
      if (empty($group_name)) {
        $group_name = '_none';
      }
      if (!isset($review_element[$group_name])) {
        $review_element[$group_name] = [
          '#group_label' => $data_item['#parent_label'],
        ];
      }

      // Initialize the form element for the given data item and make it
      // available as $element.
      $review_element[$group_name][$field_name] = array(
        '#tree' => TRUE,
      );
      $item_element =& $review_element[$group_name][$field_name];
      $item_element['label']['#markup'] = $leave_label;
      $item_element['status'] = $this
        ->buildStatusRenderArray($this->entity
        ->isAccepted() ? TMGMT_DATA_ITEM_STATE_ACCEPTED : $data_item['#status']);
      $is_preliminary = $data[$key]['#status'] == TMGMT_DATA_ITEM_STATE_PRELIMINARY;
      if ($is_preliminary) {
        $form_state
          ->set('has_preliminary_items', $is_preliminary);
      }
      else {
        $form_state
          ->set('all_preliminary', FALSE);
      }
      $item_element['actions'] = array(
        '#type' => 'container',
        '#access' => !$is_preliminary,
      );
      $item_element['below_actions'] = [
        '#type' => 'container',
      ];

      // Check if the field has a text format attached and check access.
      if (!empty($data_item['#format'])) {
        $format_id = $data_item['#format'];

        /** @var \Drupal\filter\Entity\FilterFormat $format */
        $format = FilterFormat::load($format_id);
        if (!$format || !$format
          ->access('use')) {
          $item_element['actions']['#access'] = FALSE;
          $form_state
            ->set('accept_item', FALSE);
        }
      }
      $item_element['actions'] += $this
        ->buildActions($data_item, $key, $field_name, $ajax_id);

      // Manage the height of the textareas, depending on the length of the
      // description. The minimum number of rows is 3 and the maximum is 15.
      $rows = ceil(strlen($data_item['#text']) / 100);
      $rows = min($rows, 15);
      $rows = max($rows, 3);

      // Allow other modules to change the source and translation texts,
      // for example to mask HTML-tags.
      $source_text = $data_item['#text'];
      $translation_text = isset($data_item['#translation']['#text']) ? $data_item['#translation']['#text'] : '';
      $contexts = [
        'data_item' => $data_item,
        'job_item' => $this->entity,
      ];
      \Drupal::moduleHandler()
        ->alter('tmgmt_data_item_text_output', $source_text, $translation_text, $contexts);

      // Build source and translation areas.
      $item_element = $this
        ->buildSource($item_element, $source_text, $data_item, $rows, $form_state);
      $item_element = $this
        ->buildTranslation($item_element, $translation_text, $data_item, $rows, $form_state, $is_preliminary);
      $item_element = $this
        ->buildChangedSource($item_element, $form_state, $field_name, $key, $ajax_id);
      if (isset($form_state
        ->get('validation_messages')[$field_name])) {
        $item_element['below']['validation'] = [
          '#type' => 'container',
          '#attributes' => [
            'class' => [
              'tmgmt_validation_message',
              'messages',
              'messages--warning',
            ],
          ],
          'message' => [
            '#markup' => Html::escape($form_state
              ->get('validation_messages')[$field_name]),
          ],
        ];
      }

      // Give the translator UI controller a chance to affect the data item element.
      if ($this->entity
        ->hasTranslator()) {
        $item_element = \Drupal::service('plugin.manager.tmgmt.translator')
          ->createUIInstance($this->entity
          ->getTranslator()
          ->getPluginId())
          ->reviewDataItemElement($item_element, $form_state, $key, $parent_key, $data_item, $this->entity);

        // Give the source ui controller a chance to affect the data item element.
        $item_element = \Drupal::service('plugin.manager.tmgmt.source')
          ->createUIInstance($this->entity
          ->getPlugin())
          ->reviewDataItemElement($item_element, $form_state, $key, $parent_key, $data_item, $this->entity);
      }
    }
  }
  return $review_element;
}