From dbfcb22ade354a31ff49a9429fb23bf694cae9ac Mon Sep 17 00:00:00 2001 From: Tiffney Bare <63624-tbare@users.noreply.drupalcode.org> Date: Tue, 20 Feb 2024 13:07:41 -0600 Subject: [PATCH] additional work for saving remote files --- .../src/Element/UploadOrLink.php | 52 ++++++++++++++----- .../Field/FieldWidget/JsonFormWidget.php | 19 ------- 2 files changed, 39 insertions(+), 32 deletions(-) diff --git a/modules/json_form_widget/src/Element/UploadOrLink.php b/modules/json_form_widget/src/Element/UploadOrLink.php index 75bb3ec5e5..783c7b4288 100644 --- a/modules/json_form_widget/src/Element/UploadOrLink.php +++ b/modules/json_form_widget/src/Element/UploadOrLink.php @@ -68,7 +68,7 @@ public static function processManagedFile(&$element, FormStateInterface $form_st $file_url_type = static::getUrlType($element); $element = static::unsetFilesWhenRemoving($form_state, $element); - $file_url_remote = $element['#value']['file_url_remote'] ?? $element['#uri']; + $file_url_remote = static::setRemoteFile($element, $form_state); $file_url_remote_is_valid = isset($file_url_remote) && UrlHelper::isValid($file_url_remote, TRUE); $is_remote = $file_url_remote_is_valid && $file_url_type == static::TYPE_REMOTE; if ($is_remote) { @@ -76,7 +76,6 @@ public static function processManagedFile(&$element, FormStateInterface $form_st } $access_file_url_elements = (empty($element['#files']) && !$file_url_remote_is_valid) || !$file_url_type; - $file_url_remote = static::setPreviousFormFiles($element, $form_state, $access_file_url_elements, $file_url_remote); $element['#uri'] = !isset($element['#uri']) ? $file_url_remote : $element['#uri']; $file_url_type_selector = ':input[name="' . $element['#name'] . '[file_url_type]"]'; @@ -89,18 +88,27 @@ public static function processManagedFile(&$element, FormStateInterface $form_st return $element; } + /** + * Helper function to set file_url_remote variable. + */ + private static function setRemoteFile($element, $form_state) { + $file_url_remote = ''; + if ($element['#value']['file_url_remote']) { + $file_url_remote = $element['#value']['file_url_remote']; + } + else { + $file_url_remote = $element['#uri']; + } + + return static::setPreviousFormFiles($element, $form_state, $file_url_remote); + } + /** * Helper function to previous remote files. */ - private static function setPreviousFormFiles($element, $form_state, $access_file_url_elements, $file_url_remote = NULL) { + private static function setPreviousFormFiles($element, $form_state,$file_url_remote = NULL) { $previous_files = $form_state->get('previous_files') ?? []; $element_key = $element['#array_parents'][6]; - $triggering_element = $form_state->getTriggeringElement(); - $button = is_array($triggering_element) ? array_pop($triggering_element['#array_parents']) : ''; - - if (isset($previous_files[$element_key]) && str_contains($button, 'remove')) { - unset($previous_files[$element_key]); - } if ($file_url_remote == NULL && isset($previous_files[$element_key])) { $file_url_remote = $previous_files[$element_key]; @@ -108,9 +116,13 @@ private static function setPreviousFormFiles($element, $form_state, $access_file elseif ($file_url_remote != NULL && !isset($previous_files[$element_key])) { $previous_files[$element_key] = $file_url_remote; } + elseif($file_url_remote != NULL && isset($previous_files[$element_key]) && $previous_files[$element_key] != $file_url_remote){ + unset($previous_files[$element_key]); + $previous_files[$element_key] = $file_url_remote; + } $form_state->set('previous_files', $previous_files); - return $file_url_remote != NULL ? $file_url_remote : NULL; + return $file_url_remote != NULL ? $file_url_remote : ''; } /** @@ -156,18 +168,32 @@ private static function unsetFilesWhenRemoving($form_state, $element) { $previous_files = $form_state->get('previous_files') ?? []; $element_key = $element['#array_parents'][6]; $button = is_array($triggering_element) ? array_pop($triggering_element['#array_parents']) : ''; + $count = $form_state->get('json_form_widget_info')['distribution']['count']; + if ($button == 'remove_button') { unset($element['#files']); + unset($previous_files[$element_key]); $element = static::unsetFids($element); } - if ($button == 'remove' && isset($previous_files[$element_key])) { - unset($previous_files[$element_key]); - $form_state->set('previous_files', $previous_files); + if ($button == 'remove' && isset($previous_files[$element_key]) && $element_key == $count) { + $previous_files = static::unsetPreviousFiles($previous_files,$element_key); } + + $form_state->set('previous_files', $previous_files); return $element; } + /** + * Helper function to unset previous_files. + */ + private static function unsetPreviousFiles($previous_files,$element_key) { + if (isset($previous_files[$element_key])) { + unset($previous_files[$element_key]); + } + return $previous_files; + } + /** * Helper function to unsetFids. */ diff --git a/modules/json_form_widget/src/Plugin/Field/FieldWidget/JsonFormWidget.php b/modules/json_form_widget/src/Plugin/Field/FieldWidget/JsonFormWidget.php index 0a7e58ebb0..d51a6add30 100644 --- a/modules/json_form_widget/src/Plugin/Field/FieldWidget/JsonFormWidget.php +++ b/modules/json_form_widget/src/Plugin/Field/FieldWidget/JsonFormWidget.php @@ -152,8 +152,6 @@ public function extractFormValues(FieldItemListInterface $items, array $form, Fo $data[$property] = $value; } } - $previous_files = $form_state->get('previous_files') ?? []; - $data = $this->setPreviousFiles($data, $previous_files); $json = [json_encode($data)]; $values = $this->massageFormValues($json, $form, $form_state); $items->setValue($values); @@ -167,23 +165,6 @@ public function extractFormValues(FieldItemListInterface $items, array $form, Fo static::setWidgetState($form['#parents'], $field_name, $form_state, $field_state); } - /** - * Helper to add missing remote files. - */ - protected function setPreviousFiles($data, $previous_files) { - $files = $data['distribution']; - foreach ($files as $key => $value) { - if (array_key_exists($key, $previous_files) && array_key_exists($key, $data['distribution'])) { - unset($data['distribution'][$key]['downloadURL']); - $data['distribution'][$key]['downloadURL'] = $previous_files[$key]; - } - elseif (!array_key_exists($key, $previous_files) && isset($data['distribution'][$key]['downloadURL']) && array_key_exists($key, $data['distribution'])) { - unset($data['distribution'][$key]['downlaodURL']); - } - } - return $data; - } - /** * Get form data schema ID. *