1.20.x system.admin.inc system_transliteration_retroactive_submit($form, &$form_state)

Form submit function; retroactively transliterates existing file names.

See also

system_transliteration_retroactive()

File

modules/system/system.admin.inc, line 2733
Admin page callbacks for the System module.

Code

function system_transliteration_retroactive_submit($form, &$form_state) {
  include_once BACKDROP_ROOT . '/core/includes/transliteration.inc';
  $count = 0;
  $errors = array();
  $result = system_transliteration_file_query()->execute();

  while ($row = $result->fetchAssoc()) {
    $file = new File($row);
    $wrapper = file_stream_wrapper_get_instance_by_uri($file->uri);
    $scheme = file_uri_scheme($file->uri);

    // Missing implementation.
    if (!$wrapper) {
      $errors[] = file_uri_target($file->uri);
      continue;
    }

    // Skip non-writable stream wrappers.
    $writeable_stream_wrappers = file_get_stream_wrappers(STREAM_WRAPPERS_WRITE);
    if (!isset($writeable_stream_wrappers[$scheme])) {
      continue;
    }

    // Missing file.
    if (!file_exists($wrapper->realpath())) {
      $errors[] = file_uri_target($file->uri);
      continue;
    }

    // Sanitize file name.
    $filename = transliteration_clean_filename(backdrop_basename($file->uri));

    // Build destination URI.
    $destination = file_stream_wrapper_uri_normalize(backdrop_dirname($file->uri) . '/' . $filename);
    $destination = file_destination($destination, FILE_EXISTS_RENAME);

    // Rename and update the file record accordingly.
    if ($wrapper->rename($file->uri, $destination)) {
      $file->uri = $destination;
      // Don't use file_save() as it modifies the timestamp.
      backdrop_write_record('file_managed', $file, 'fid');
      // Inform modules that the file has been updated.
      module_invoke_all('file_update', $file);
      $count++;
    }
    else {
      $errors[] = file_uri_target($file->uri);
    }
  }

  if ($errors) {
    $message = t('Not all file names could be converted. The following files could not be accessed and have been ignored:');
    $message .= theme('item_list', array('items' => $errors));
    backdrop_set_message($message, 'error');
  }
  else {
    backdrop_set_message(format_plural($count, 'One file name has been successfully transliterated.', '@count file names have been successfully transliterated.'));
  }

  backdrop_flush_all_caches();
}