You are here

function image_update in Image 5.2

Same name and namespace in other branches
  1. 5 image.module \image_update()
  2. 6 image.module \image_update()

Implementation of hook_update

Take $node by reference so we can use this to save the node after rebuilding derivatives.

2 calls to image_update()
image_load in ./image.module
Implementation of hook_load
image_operations_rebuild in ./image.module

File

./image.module, line 729

Code

function image_update(&$node) {
  if ($node->new_file || $node->rebuild_images) {

    // Derivative images that aren't needed are set to the original file. Make
    // note of the current path before calling _image_insert() because if it's
    // in the temp directory it'll be moved. We'll need it later to determine
    // which derivative images need to be saved with _image_insert().
    $original_path = $node->images[IMAGE_ORIGINAL];
    if ($node->new_file) {

      // The derivative images were built during image_prepare() or
      // image_create_node_from() so all we need to do is remove all the old,
      // existing images.
      // Remove all the existing images.
      $result = db_query("SELECT f.fid, f.filepath FROM {image} i INNER JOIN {files} f ON i.fid = f.fid WHERE i.nid = %d", $node->nid);
      while ($file = db_fetch_object($result)) {
        file_delete(file_create_path($file->filepath));
        db_query("DELETE FROM {files} WHERE fid = %d", $file->fid);
      }
      db_query("DELETE FROM {image} WHERE nid = %d", $node->nid);

      // Save the original first so that it if it's moved the derivatives are
      // placed in the correct directory.
      _image_insert($node, IMAGE_ORIGINAL, $original_path);
    }
    else {
      if ($node->rebuild_images) {

        // Find the original image.
        $original_file = db_fetch_object(db_query("SELECT i.fid, f.filepath FROM {image} i INNER JOIN {files} f ON i.fid = f.fid WHERE i.nid = %d AND i.image_size = '%s'", $node->nid, IMAGE_ORIGINAL));

        // Delete all but the original image.
        $result = db_query("SELECT i.fid, f.filepath FROM {image} i INNER JOIN {files} f ON i.fid = f.fid WHERE i.nid = %d AND f.fid <> %d", $node->nid, $original_file->fid);
        while ($file = db_fetch_object($result)) {

          // Beware of derivative images that have the same path as the original.
          if ($file->filepath != $original_file->filepath) {
            file_delete(file_create_path($file->filepath));
          }
          db_query("DELETE FROM {files} WHERE fid = %d", $file->fid);
          db_query("DELETE FROM {image} WHERE fid = %d", $file->fid);
        }
        _image_build_derivatives($node, FALSE);

        // Prevent multiple rebuilds.
        $node->rebuild_images = FALSE;
      }
    }
    $sizes = image_get_derivative_sizes($node->images[IMAGE_ORIGINAL]);
    foreach ($sizes as $key => $size_info) {
      if (!empty($node->images[$key]) && $node->images[$key] != $original_path) {
        _image_insert($node, $key, $node->images[$key]);
      }
    }
  }
}