0

我正在尝试隐藏未发布节点上的文件。我将来使用调度程序发布节点,并且链接到该节点的文件尚不能公开访问。我将它们移至私人文件夹。

但是当 cron 运行时,我必须将文件移回原来的位置。这里的问题是文件转到原始文件夹,但在文件名和 uri 之后得到一个 _0。

/**
 * Implements hook_entity_presave().
 */
function custom_configuration_entity_presave(EntityInterface $entity) {
  // Automatic fill in title field based on first and lastname.
  if($entity->getEntityTypeId() === 'node' && $entity->hasField('field_files')) {
    if($entity->isPublished()) {
      _custom_configuration_move_files($entity, 'public://', TRUE);
    }
    elseif (!$entity->isPublished()) {
      _custom_configuration_move_files($entity, 'private://', FALSE);
    }
  }
}

和我的帮助功能来移动文件

/**
 * Helper function to move a file
 * @param $entity
 *  the entity object
 * @param $target_stream_directory
 *  the stream directory
 * @param $published
 *  True or false if the entity is being published
 * 
 */
function _custom_configuration_move_files($entity, $target_stream_directory, $published) {
  // Get the files.
  $files_values = $entity->field_files->getValue();

  if(!empty($files_values)) {
    // Set the target directory. Either private or public/name_of_folder.
    $target_directory = $target_stream_directory;

    if($published) {
      // Add the field file directory to the target directory.
      $entity_definitions = $entity->getFieldDefinitions();
      $files_folder = $entity_definitions['field_files']->getSettings();
      $target_directory = $target_stream_directory . $files_folder['file_directory'];
    }

    // Loop over all files and move them.
    foreach($files_values as $file_value) {
      $file = \Drupal\file\Entity\File::load($file_value['target_id']);
      $file = file_move($file, $target_directory, 'FILE_EXISTS_REPLACE');
    }
  }
}

但是 cron 上的调度程序会保存带有 _0 的文件。我还尝试通过更改文件名来重新保存文件,但这给出了“未找到”,因为系统上的文件带有 _0。所以下面也不起作用

// Loop over all files and move them.
    foreach($files_values as $file_value) {
      $file = \Drupal\file\Entity\File::load($file_value['target_id']);
      $file_name = $file->getFilename();
      $full_uri = $target_directory . '/' . $file_name;
      $file = file_move($file, $full_uri, 'FILE_EXISTS_REPLACE');
      $file->setFilename($file_name);
      $file->setFileUri($full_uri);
      $file->save();
    }

有人可以指出我正确的方向吗?谢谢你。

4

1 回答 1

0

你可以试试这个。

$old_file_uri = $file->getFileUri();
$path_parts = pathinfo($old_file_uri);
$new_file_uri = $target_directory . '/' . $path_parts['basename'];
于 2020-05-18T11:19:03.617 回答