You are here

function _oauthconnector_fetch_field in OAuth Connector 7

Same name and namespace in other branches
  1. 6 oauthconnector.module \_oauthconnector_fetch_field()
2 calls to _oauthconnector_fetch_field()
oauthconnector_oauth_common_authorized in ./oauthconnector.module
Implements hook_oauth_common_authorized().
_oauthconnector_info in ./oauthconnector.module
Information callback

File

./oauthconnector.module, line 663
OAuth Connector module

Code

function _oauthconnector_fetch_field($field, $provider, $access_token) {
  static $external_field_cache = array();
  $field = $provider->mapping['fields'][$field];
  if (!isset($access_token->key)) {
    return FALSE;
  }
  if (isset($external_field_cache[$access_token->key][$field['method post']][$field['resource']][$field['field']])) {
    return $external_field_cache[$access_token->key][$field['method post']][$field['resource']][$field['field']];
  }
  if (!isset($external_field_cache[$access_token->key])) {
    $external_field_cache[$access_token->key] = array();
  }
  if (!isset($external_field_cache[$access_token->key][$field['method post']])) {
    $external_field_cache[$access_token->key][$field['method post']] = array();
  }
  $context = array(
    'field' => $field,
    'provider' => $provider,
    'access_token' => $access_token,
  );
  if (!isset($external_field_cache[$access_token->key][$field['method post']][$field['resource']])) {
    $info = array();
    $skip_normal_call = FALSE;

    /**
     * Give other modules a change to do their own call.
     */
    drupal_alter('oauthconnector_fetch_field_endpoint_call', $info, $skip_normal_call, $context);
    if (!$skip_normal_call) {
      $request_method = empty($field['method post']) ? 'GET' : 'POST';
      $org_info = (array) oauthconnector_endpoint_call($field['resource'], array(), $provider, $access_token, $request_method, $provider->mapping['format']);
      $info = $info + $org_info;

      // merge without overwrite.
    }
    $external_field_cache[$access_token->key][$field['method post']][$field['resource']] = $info;
  }
  else {
    $info = $external_field_cache[$access_token->key][$field['method post']][$field['resource']];
  }
  $response = FALSE;
  if (!empty($info)) {
    if (!empty($field['querypath']) && module_exists('querypath')) {

      //TODO: Perhaps cache this QueryPath object as well?
      $response = _oauthconnector_object_to_qp(qp('<?xml version="1.0"?><reponse/>'), $info)
        ->find($field['field'])
        ->eq(0)
        ->text();
    }
    elseif (!empty($info[$field['field']])) {
      $response = $info[$field['field']];
    }
    elseif (strstr($field['field'], '.') !== FALSE) {
      $parts = explode('.', $field['field']);
      $temp_info = $info;
      foreach ($parts as $part) {
        if (isset($temp_info[$part])) {
          $temp_info = $temp_info[$part];
        }
        else {
          break;
        }
      }
      if (!empty($temp_info) && is_string($temp_info)) {
        $response = $temp_info;
      }
    }
  }

  // Give other modules a change to sanatize or change a value.
  drupal_alter('oauthconnector_fetch_field_value', $response, $info, $context);
  $external_field_cache[$access_token->key][$field['method post']][$field['resource']][$field['field']] = $response;
  return $response;
}