web-dev-qa-db-ja.com

画像フィールドにアップロードされた画像を削除する適切な方法

コードを使用して、エンティティの画像を削除する適切な方法は何ですか?

私はそのように処理するcron関数を持っています:

function processQueuedPropertyPhotoset($entity, $photos) {
if (!is_array($photos)) {
  watchdog('mymodule', 'Trying to process photos for a property but it has no photos. Aborting.');
  return;
}

if (is_array($entity->field_property_image) && count($entity->field_property_image)) {
  foreach ($entity->field_property_image['und'] as $key => $value) {
    $photo = file_load($value['fid']);

    if ($photo) {
      file_delete($photo, TRUE);
    }
  }
}

// wipe clean the records in the field_ table

unset($entity->field_property_image);
$entity->save();

// rest of code processes and saves new images

これが適切または効果的な方法であるかどうか私は興味があります。また、生成された画像派生物はDrupalこの方法でも削除されますか?画像フィールドテーブル定義のデータベースに「削除された」フィールドがあることに気づきました。これはいつ使用されますか?

このメソッドは、エンティティデータを消去し、サーバーとファイルのテーブルから画像を削除します。 Drupalのすべてのベースをカバーする受け入れ可能な方法であるか、またはこれを簡略化するAPI関数があるかどうかに単に興味があります。この関数は、サードパーティの統合Webを実行すると毎日呼び出されますサービス。

4
Kevin

画像ファイルが確実に削除されることを確認したい場合は(システムの別の部分がそのファイルに既得権を宣言しているかどうかに関係なく)、あなたがしていることは私にはよく見えます。

_FILE_STATUS_TEMPORARY_テーブルで_file_managed_とマークされたファイルを削除するcron( system_cron() 具体的に)のコアによって実行される関数はすでに存在しますが、その関数は_file_usage_テーブル。ファイルが使用中であると報告された場合は削除されません(フィールドの値がエンティティからまだ削除されていない場合)。

現在実行しているようにTRUEを2番目のパラメーターとしてfile_delete()に渡すことは、削除を強制する最もクリーンな方法です(_file_usage_のレコードもクリーンアップされるので、古くなりません。データ)。

画像モジュールは hook_file_delete() を実装し、ファイルURIの画像キャッシュをフラッシュするため、画像派生物は自動的に削除されます( image_file_delete()を参照 )。

フィールドテーブルのdeleted列は、後日削除するフィールドをマークするためだけにあります(削除するデータが大量にある場合でも、後続のページの読み込みは影響を受けないと思います)。同じ理由により、_field_config_テーブルと_field_config_instance_テーブルには同じ列があります。

フィールドモジュールは、cron実行( field_cron() )で削除対象としてマークされたデータをすべてパージします。

2
Clive