public function InlineParagraphsWidget::massageFormValues

File

paragraphs/src/Plugin/Field/FieldWidget/InlineParagraphsWidget.php, line 1314

Class

InlineParagraphsWidget
Plugin implementation of the 'entity_reference paragraphs' widget.

Namespace

Drupal\paragraphs\Plugin\Field\FieldWidget

Code

public function massageFormValues(array $values, array $form, FormStateInterface $form_state) {
  $field_name = $this->fieldDefinition
    ->getName();
  $widget_state = static::getWidgetState($form['#parents'], $field_name, $form_state);
  $element = NestedArray::getValue($form_state
    ->getCompleteForm(), $widget_state['array_parents']);
  foreach ($values as &$item) {
    if (isset($widget_state['paragraphs'][$item['_original_delta']]['entity']) && $widget_state['paragraphs'][$item['_original_delta']]['mode'] != 'remove') {
      $paragraphs_entity = $widget_state['paragraphs'][$item['_original_delta']]['entity'];

      /** @var \Drupal\Core\Entity\Display\EntityFormDisplayInterface $display */
      $display = $widget_state['paragraphs'][$item['_original_delta']]['display'];
      if ($widget_state['paragraphs'][$item['_original_delta']]['mode'] == 'edit') {
        $display
          ->extractFormValues($paragraphs_entity, $element[$item['_original_delta']]['subform'], $form_state);
      }

      // A content entity form saves without any rebuild. It needs to set the
      // language to update it in case of language change.
      $langcode_key = $paragraphs_entity
        ->getEntityType()
        ->getKey('langcode');
      $langcode = $form_state
        ->get('langcode');
      if (!isset($langcode) && isset($element['#host'])) {

        // Use the host entity as a last resort to determine the langcode.
        // @see self::formMultipleElements
        $langcode = $element['#host']
          ->language()
          ->getId();
      }
      if ($paragraphs_entity
        ->get($langcode_key)->value != $langcode) {

        // If a translation in the given language already exists, switch to
        // that. If there is none yet, update the language.
        if ($paragraphs_entity
          ->hasTranslation($langcode)) {
          $paragraphs_entity = $paragraphs_entity
            ->getTranslation($langcode);
        }
        else {
          $paragraphs_entity
            ->set($langcode_key, $langcode);
        }
      }
      $paragraphs_entity
        ->setNeedsSave(TRUE);
      $item['entity'] = $paragraphs_entity;
      $item['target_id'] = $paragraphs_entity
        ->id();
      $item['target_revision_id'] = $paragraphs_entity
        ->getRevisionId();
    }
    elseif (isset($widget_state['paragraphs'][$item['_original_delta']]['mode']) && in_array($widget_state['paragraphs'][$item['_original_delta']]['mode'], [
      'remove',
      'removed',
    ])) {
      $item['target_id'] = NULL;
      $item['target_revision_id'] = NULL;
    }
  }
  return $values;
}