필자는 동일한 유스 케이스 (파일 이름을 유지하면서 파일을 바꾸고 싶다)를 가지고 있었고 사용자 정의 모듈의 다음 코드 가이 목표를 달성했습니다. 이 코드는 Entity API 모듈을 사용하므로 모듈 .info 파일에서 종속성으로 추가해야합니다. 피드백 환영합니다.
이를 통해 '제거'를 클릭 한 후 노드를 저장 한 후 파일을 즉시 삭제할 수 있습니다. 경고 : 이것은 또한 파일을 제거하고 노드를 저장할 때 이전 개정으로 롤백하여 해당 파일을 다시 가져올 수 없음을 의미합니다.
/**
* Implements hook_node_update().
*
* Delete files from old node revisions.
*/
function MYMODULE_node_update($node) {
// Array of content types to act on.
if (in_array($node->type, array('page', 'article'))) {
$wrapper = entity_metadata_wrapper('node', $node);
$original_wrapper = entity_metadata_wrapper('node', $node->original);
// Array of file fields to act on.
foreach (array('field_public_files', 'field_private_files') as $field) {
if (!isset($original_wrapper->{$field})) {
continue;
}
$current_files = array();
$original_files = array();
// Get files that were attached to the original node (before update).
foreach ($original_wrapper->{$field}->value() as $file) {
$original_files[] = $file['fid'];
}
// Stop if there were no files previously attached.
if (empty($original_files)) {
continue;
}
// Get files currently attached to the node (after update).
foreach ($wrapper->{$field}->value() as $file) {
$current_files[] = $file['fid'];
}
// Delete files that were in the original node but were removed during
// this update.
$deleted_files = array_diff($original_files, $current_files);
foreach ($deleted_files as $fid) {
if ($file = file_load($fid)) {
// Delete all usages of the file. Each node revision adds to the usage
// count.
file_usage_delete($file, 'file', 'node', $node->nid, 0);
file_delete($file);
}
}
}
}
}