You are here

function clients_connection_drupal_services_5::callMethod in Web Service Clients 7

Call a remote method.

TODO: REFACTOR this to look more like the static methods above -- separate methods for getuser, connect, etc etc.

Parameters

$method: The name of the remote method to call.

All other parameters are passed to the remote method.: Note that the D5 version of Services does not seem to respect optional parameters; you should pass in defaults (eg an empty string or 0) instead of omitting a parameter.

Return value

Whatever is returned from the remote site.

Overrides clients_connection_drupal_services_6_2::callMethod

1 call to clients_connection_drupal_services_5::callMethod()
clients_connection_drupal_services_5::testConnectionNodeLoad in backends/clients_drupal/clients_drupal.inc
Connection test button handler: loading a node.

File

backends/clients_drupal/clients_drupal.inc, line 643
Defines methods and calls to Drupal services

Class

clients_connection_drupal_services_5
Drupal client for services on a Drupal 5 site.

Code

function callMethod($method) {

  //dsm($this);

  //dsm($method);
  $config = $this->configuration;
  $connect = xmlrpc($this->endpoint, 'system.connect');
  $session_id = $connect['sessid'];

  // We may want to call only system.connect for testing purposes.
  if ($method == 'system.connect') {
    return $connect;
  }

  // Log in
  // Get the API key-related arguments.
  $key_args = $this
    ->xmlrpc_key_args('user.login');

  //dsm($key_args);

  // Build the array of connection arguments we need to log in.
  $username = $this->configuration['username'];
  $password = $this->configuration['password'];
  $login_args = array_merge(array(
    $this->endpoint,
    'user.login',
  ), $key_args, array(
    $session_id,
  ), array(
    $username,
    $password,
  ));

  // Call the xmlrpc method with our array of arguments. This accounts for
  // whether we use a key or not, and the extra parameters to pass to the method.
  $login = call_user_func_array('xmlrpc', $login_args);
  $login_session_id = $login['sessid'];

  // If the requested method is user.login, we're done.
  if ($method == 'user.login') {
    return $login;
  }

  //dsm($login);

  // Get all the arguments this function has been passed.
  $function_args = func_get_args();

  // Slice out the ones that are arguments to the method call: everything past
  // the 1st argument.
  $method_args = array_slice($function_args, 1);

  // The node.load method on D5 is an evil special case because it's defined
  // to not use an API key.
  if ($method == 'node.load') {

    // Be nice. Let the caller specify just the nid, and provide the
    // empty default for the optional fields parameter.
    if (count($method_args) == 1) {
      $method_args[] = array();
    }

    // Be nice part 2: the number one (in my experience) cause of lost
    // hours on Services is the way XMLRPC and/or services get their
    // knickers in a twist when they want an integer but think they've got
    // a string because they're too damn stupid to try casting.
    // So cast the nid here, since we're already in a special case for this
    // method anyway.
    $method_args[0] = (int) $method_args[0];

    // Build the array of connection arguments for the method we want to call.
    $xmlrpc_args = array_merge(array(
      $this->endpoint,
      $method,
    ), array(
      $login_session_id,
    ), $method_args);

    //dsm($xmlrpc_args);

    // Call the xmlrpc method with our array of arguments.
    $result = call_user_func_array('xmlrpc', $xmlrpc_args);
    if ($result === FALSE) {

      //dsm('error');
      return xmlrpc_error();
    }
    return $result;
  }

  // Get the API key-related arguments.
  $key_args = $this
    ->xmlrpc_key_args($method);

  // Build the array of connection arguments for the method we want to call.
  $xmlrpc_args = array_merge(array(
    $this->endpoint,
    $method,
  ), $key_args, array(
    $login_session_id,
  ), $method_args);

  // Call the xmlrpc method with our array of arguments.
  $result = call_user_func_array('xmlrpc', $xmlrpc_args);
  if ($result === FALSE) {

    //dsm('error');
    return xmlrpc_error();
  }
  return $result;
}