Skip to content

Commit

Permalink
additional work for saving remote files
Browse files Browse the repository at this point in the history
  • Loading branch information
Tiffney Bare committed Feb 20, 2024
1 parent 9426b24 commit dbfcb22
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 32 deletions.
52 changes: 39 additions & 13 deletions modules/json_form_widget/src/Element/UploadOrLink.php
Original file line number Diff line number Diff line change
Expand Up @@ -68,15 +68,14 @@ 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) {
$element = static::loadRemoteFile($element, $file_url_remote);
}

$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]"]';
Expand All @@ -89,28 +88,41 @@ 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];
}
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 : '';
}

/**
Expand Down Expand Up @@ -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.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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.
*
Expand Down

0 comments on commit dbfcb22

Please sign in to comment.