You are here

function oa_files_find_document in Open Atrium Files 7.2

Find the document that may correspond to a given file.

Parameters

$file: The file object to find.

1 call to oa_files_find_document()
oa_files_upload_create_documents_form in ./oa_files.module
Form callback; Create multiple documents.

File

./oa_files.module, line 493

Code

function oa_files_find_document($file, $gid = NULL, $sid = NULL) {
  $uri = strtolower($file->uri);
  $uri_ext = substr($uri, strrpos($uri, '.'));
  $uri_sans_ext = substr($uri, 0, strrpos($uri, '.'));
  $uri_after_underscore = substr($uri_sans_ext, strrpos($uri_sans_ext, '_') + 1);
  $uri_before_underscore = substr($uri_sans_ext, 0, strrpos($uri_sans_ext, '_'));
  $test_alt = $uri_before_underscore && strlen($uri_after_underscore) && is_numeric($uri_after_underscore);

  // This is not a renamed file, no existing document matches.
  if (!$test_alt) {
    return FALSE;
  }

  // We want to find all files on document with the same uri or prefix.
  $query = db_select('file_managed', 'f');
  $query
    ->innerJoin('field_data_field_oa_media', 'm', 'm.field_oa_media_fid = f.fid AND m.entity_type = :type', array(
    ':type' => 'node',
  ));
  $query
    ->fields('m', array(
    'delta',
    'language',
  ));
  $query
    ->addField('f', 'uri');
  $query
    ->addField('m', 'entity_id', 'nid');
  $query
    ->innerJoin('node', 'n', 'n.nid = m.entity_id');
  $query
    ->condition('n.type', 'oa_wiki_page');
  $query
    ->condition(db_or()
    ->condition('f.uri', db_like($uri), 'LIKE')
    ->condition('f.uri', db_like($uri_before_underscore) . '%', 'LIKE'));
  $query
    ->orderBy('f.fid', 'ASC');
  if ($gid) {
    $query
      ->innerJoin('og_membership', 'om', 'm.entity_id = om.etid AND om.entity_type = :type AND om.group_type = :type AND om.gid = :id', array(
      ':type' => 'node',
      ':id' => $gid,
    ));
    if ($sid) {
      $query
        ->innerJoin('field_data_oa_section_ref', 'sf', 'm.entity_id = sf.entity_id AND sf.entity_type = :type AND sf.oa_section_ref_target_id = :id', array(
        ':type' => 'node',
        ':id' => $sid,
      ));
    }
  }
  if ($rows = $query
    ->execute()
    ->fetchAll()) {
    foreach ($rows as $row) {

      // Test if the db one is [uri].[ext] or [uri]_[numeric].[ext].
      $row_uri = strtolower($row->uri);
      $db_uri_ext = substr($row_uri, strrpos($row_uri, '.'));
      $db_uri_sans_ext = substr($row_uri, 0, strrpos($row_uri, '.'));
      $db_uri_after_underscore = NULL;
      if ($pos = strrpos($db_uri_sans_ext, '_')) {
        $db_uri_before_underscore = substr($db_uri_sans_ext, 0, $pos);
        $db_uri_after_underscore = substr($db_uri_sans_ext, strrpos($db_uri_sans_ext, '_') + 1);
      }
      if ($db_uri_after_underscore !== '0' && !$db_uri_after_underscore || !is_numeric($db_uri_after_underscore)) {
        $db_uri_before_underscore = $db_uri_sans_ext;
        $db_uri_after_underscore = FALSE;
      }
      if ($db_uri_before_underscore == $uri_before_underscore && $db_uri_ext == $uri_ext && (!$db_uri_after_underscore || is_numeric($db_uri_after_underscore))) {
        if (($node = node_load($row->nid)) && $node->type == 'oa_wiki_page' && node_access('update', $node)) {
          $node->oa_files_row = $row;
          return $node;
        }
      }
    }
  }
  return FALSE;
}