You are here

class clients_connection_drupal_services_5 in Web Service Clients 7.2

Same name and namespace in other branches
  1. 6.2 connections/clients_drupal/clients_drupal.inc \clients_connection_drupal_services_5
  2. 7.3 connections/clients_drupal/clients_drupal.inc \clients_connection_drupal_services_5
  3. 7 backends/clients_drupal/clients_drupal.inc \clients_connection_drupal_services_5

Drupal client for services on a Drupal 5 site.

Works with Services 5.x-0.92.

We extend from the Services 6.x-2.x class as not much actually changes between these versions when it comes to making calls.

Hierarchy

Expanded class hierarchy of clients_connection_drupal_services_5

File

connections/clients_drupal/clients_drupal.inc, line 674
Contains classes for Client connections handlers.

View source
class clients_connection_drupal_services_5 extends clients_connection_drupal_services_6_2 {

  // ============================================ D5: Connection methods.

  /**
   * Call a remote method with an array of parameters.
   *
   * TODO: REFACTOR this to look more like the static methods above --
   * separate methods for getuser, connect, etc etc.
   *
   * @param $method
   *  The name of the remote method to call.
   * @param
   *  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
   *  Whatever is returned from the remote site.
   */
  function callMethodArray($method, $method_params = array()) {

    //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') {
      $this
        ->handleXmlrpcError();
      return $connect;
    }

    // Log in and get the user's session ID.
    $login = $this
      ->call_user_login($session_id);
    $login_session_id = $login['sessid'];

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

    //dsm($login);

    // 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_params) == 1) {
        $method_params[] = 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_params[0] = (int) $method_params[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_params);

      //dsm($xmlrpc_args);

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

      // Throw an exception for errors from the remote call.
      $this
        ->handleXmlrpcError();
      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_params);

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

    // Throw an exception for errors from the remote call.
    $this
      ->handleXmlrpcError();
    return $result;
  }

  /**
   * Provide buttons for the connection testing page.
   *
   * @param $form_state
   *  This is passed in so you can set defaults based on user input.
   */
  function getTestOperations($form_state, $connection_name) {

    // Just making the inheritance explicit for debugging... ;)
    return parent::getTestOperations($form_state, $connection_name);
  }

  // ============================================ D5: Testing system.

  /**
   * Connection test button handler: loading a node.
   *
   * This uses a different method on Services 5.x-0.92.
   */
  function testConnectionNodeLoad(&$button_form_values) {
    $nid = $button_form_values['nid'];
    try {
      $node = $this
        ->callMethodArray('node.load', array(
        $nid,
      ));
    } catch (Exception $e) {
      drupal_set_message(t('Could not retrieve a node from the remote site, got error message "@message".', array(
        '@message' => $e
          ->getMessage(),
      )), 'warning');

      //dsm($e);
      return;
    }
    if (is_array($node) && isset($node['nid'])) {
      drupal_set_message(t('Sucessfully retrieved node %title (nid @nid).', array(
        '%title' => $node['title'],
        '@nid' => $node['nid'],
      )));
    }
    else {
      drupal_set_message(t('Could not retrieve a node from the remote site.'), 'warning');
    }
    return $node;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
clients_connection_base::$cid public property The connection id. Only set if this is stored in the database.
clients_connection_base::$configuration public property An array of further configuration options.
clients_connection_base::$endpoint public property The URL this connection connects to.
clients_connection_base::$name public property The machine name of the connection.
clients_connection_base::callMethod function Call a remote method.
clients_connection_drupal_services::handleXmlrpcError function Common helper for reacting to an error from an XMLRPC call.
clients_connection_drupal_services::testConnectionConnect function Connection test button handler: basic connection.
clients_connection_drupal_services::testConnectionLogin function Connection test button handler: user login.
clients_connection_drupal_services::testConnectionNodeLoadValidate function Connection test button validate handler: loading a node.
clients_connection_drupal_services::__construct function Constructor method. Overrides clients_connection_base::__construct
clients_connection_drupal_services_5::callMethodArray function Call a remote method with an array of parameters. Overrides clients_connection_drupal_services_6_2::callMethodArray
clients_connection_drupal_services_5::getTestOperations function Provide buttons for the connection testing page. Overrides clients_connection_drupal_services::getTestOperations
clients_connection_drupal_services_5::testConnectionNodeLoad function Connection test button handler: loading a node. Overrides clients_connection_drupal_services_6_2::testConnectionNodeLoad
clients_connection_drupal_services_6_2::call_user_login function Log in as the configured user.
clients_connection_drupal_services_6_2::connectionSettingsForm function Extra form elements specific to a class's edit form. Overrides clients_connection_base::connectionSettingsForm
clients_connection_drupal_services_6_2::connectionSettingsForm_submit static function Submit handler for saving/updating connections of this class. Overrides clients_connection_base::connectionSettingsForm_submit
clients_connection_drupal_services_6_2::formatEndpoint function Format the connection's endpoint as a link. Overrides clients_connection_base::formatEndpoint
clients_connection_drupal_services_6_2::xmlrpc_key_args function Helper function to get key-related method arguments for the XMLRPC call.