私は同じ使用例を持ち(ファイル名を維持しながらファイルを置き換えたい)、カスタムモジュールの次のコードはこの目標を満たしました。このコードは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);
}
}
}
}
}