You are here

function filefield_delete_file_references in FileField 6.3

Delete all node references of a file.

Parameters

$file: The file object for which to find references.

$field: Optional. The CCK field array or field name as a string.

1 call to filefield_delete_file_references()
filefield_file_delete in ./filefield.module
Implementation of hook_file_delete().

File

./filefield.module, line 1112
FileField: Defines a CCK file field type.

Code

function filefield_delete_file_references($file, $field = NULL) {
  $fields = filefield_get_field_list(NULL, $field);
  $file = (object) $file;
  $references = filefield_get_file_references($file, $field);
  foreach ($references as $nid => $node_references) {

    // Do not update a node if it is already being deleted directly by the user.
    if (isset($file->delete_nid) && $file->delete_nid == $nid) {
      continue;
    }
    foreach ($node_references as $vid) {

      // Do not update the node revision if that revision is already being
      // saved or deleted directly by the user.
      if (isset($file->delete_vid) && $file->delete_vid == $vid) {
        continue;
      }
      $node = node_load($nid, $vid);
      foreach ($fields as $field_name => $field) {
        if (isset($node->{$field_name})) {
          foreach ($node->{$field_name} as $delta => $item) {
            if ($item['fid'] == $file->fid) {
              unset($node->{$field_name}[$delta]);
            }
          }
          $node->{$field_name} = array_values(array_filter($node->{$field_name}));
        }
      }

      // Save the node after removing the file references. This flag prevents
      // FileField from attempting to delete the file again.
      $node->skip_filefield_delete = TRUE;
      node_save($node);
    }
  }
}