web-dev-qa-db-ja.com

Filefield値を削除するときに基礎となるファイルを保持する方法

FileFieldを持つコンテンツタイプ(特に画像)があります。これらの値のいずれかが削除されると、Drupalは(他のノードが同じファイルを参照していない限り)基礎となるファイルも削除します)。

基礎となるファイルを削除したくありません。ファイルシステムに残しておいてください。 FileField値が削除された後もそれが確実に残るようにするために使用できるフックまたは他の手法はありますか?

4
Greg

これは醜いハックですが、これはファイルが削除されるのを防ぐために私が見つけた最も簡単な方法です。これは、file_deleteをフックし、$file変数からuriプロパティを削除することで機能します。 URIがないと、Drupalはファイルを削除できません。

// Think twice before using this ugly hack.
// It probably breaks something and kills kittens.
function mymodule_file_delete($file) {
  $path = drupal_realpath($file->uri);
  if (!is_dir($path) && is_file($path)) {
    if (preg_match('/insert_regex_here/', $path)) {
      $file->uri = NULL;
    }
  }
}

私が検討した他の選択肢は:

  • ハッキングコア
    ハッキングコアはタブーですが、上記で使用したフックよりもクリーンなソリューションになります。
  • 保持したい各ファイルで file_usage_add() を使用します
    私のユースケースにはあまり適合しません-Drupalとは無関係に作成および削除された数万のファイル。これらすべてのファイルをfile_usage_addと同期するのは困難です。
  • Media モジュールを使用してファイルパスを参照します
    メディアはやり過ぎのようで、まだ安定していません。加えて、それが私が必要としていることをするかどうかはわかりません。
0
Greg
0
Daniel Nitsche