You are here

class clients_connection_drupal_services_7_3 in Web Service Clients 7.3

Same name and namespace in other branches
  1. 6.2 connections/clients_drupal/clients_drupal.inc \clients_connection_drupal_services_7_3
  2. 7.2 connections/clients_drupal/clients_drupal.inc \clients_connection_drupal_services_7_3

Drupal client for services on a Drupal 7 site for Services 7.x-3.x.

Hierarchy

Expanded class hierarchy of clients_connection_drupal_services_7_3

File

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

View source
class clients_connection_drupal_services_7_3 extends clients_connection_drupal_services {

  // ============================================ D7-3: Connection form methods.

  /**
   * Extra form elements specific to a class's edit form.
   *
   * @param $form_state
   *  The form state from the main form, which you probably don't need anyway.
   *
   * @see clients_connection_form()
   * @see clients_connection_form_submit()
   */
  function connectionSettingsFormAlter(&$form, &$form_state) {
    $form['endpoint']['#description'] = t('Remote service URL e.g. http://mysite.com/path/to/xmlrpc');

    // There is no configuration other than the credentials.
    $form['credentials']['username'] = array(
      '#type' => 'textfield',
      '#title' => t('Service username'),
      '#size' => 30,
      '#maxlength' => 60,
      '#attributes' => array(
        'autocomplete' => 'off',
      ),
      '#description' => t('This should be same as the username on the server you are connecting to.'),
      '#required' => TRUE,
    );
    $password_exists = isset($this->credentials['password']);
    $password_desc = $password_exists ? t('This should be same as the password on the server you are connecting to. Leave blank unless you need to change this.') : t('This should be same as the password on the server you are connecting to.');
    $form['credentials']['password'] = array(
      '#type' => 'password',
      '#title' => t('Service password'),
      '#size' => 30,
      '#maxlength' => 60,
      '#attributes' => array(
        'autocomplete' => 'off',
      ),
      '#description' => $password_desc,
      '#required' => !$password_exists,
    );
  }

  // ============================================ D7-3: Connection API.

  /**
   * Call a remote method.
   *
   * @param $method
   *  The name of the remote method to call.
   * @param $method_params
   *  An array of parameters to 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()) {
    $this->method = $method;

    // Connect to the remote system service to get an initial session id to log in with.
    $connect = xmlrpc($this->endpoint, array(
      'system.connect' => array(),
    ));
    $session_id = $connect['sessid'];
    $this
      ->handleXmlrpcError();

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

    // Log in and get the user's session ID.
    $this
      ->credentialsLoad();
    $username = $this->credentials['username'];
    $password = $this->credentials['password'];
    $login = xmlrpc($this->endpoint, array(
      'user.login' => array(
        $username,
        $password,
      ),
    ));
    $login_session_id = $login['sessid'];
    $login_session_name = $login['session_name'];

    // Set our cookie for subsequent requests.
    $this->cookie = $login_session_name . '=' . $login_session_id;
    $this
      ->handleXmlrpcError();

    // If the requested method is user.login, we're done.
    if ($method == 'user.login') {
      return $login;
    }
    $headers = array(
      // Pass in the login cookie we received previously.
      'Cookie' => $this->cookie,
      // It would appear that with XMLRPC we always need the XCSRF token, no
      // matter what the method.
      'X-CSRF-Token' => $this
        ->getXCSRFToken(),
    );
    $xmlrpc_options = array(
      'headers' => $headers,
    );
    $result = xmlrpc($this->endpoint, array(
      $method => $method_params,
    ), $xmlrpc_options);

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

  /**
   * Get the X-CSRF token.
   *
   * This calls the remote site to get the token, and caches it, so that
   * multiple requests made with the same connection don't need to retrieve it
   * again.
   *
   * This expects the 'user.token' method to be enabled on the
   * endpoint. This only exists in Services 3.5 and later. We do not support
   * earlier versions.
   *
   * @return
   *  The X-CSRF token.
   *
   * @throws
   *  An exception if the remote site does not return a token.
   */
  function getXCSRFToken() {
    if (isset($this->CSRFToken)) {
      return $this->CSRFToken;
    }
    $headers = array(
      // Pass in the login cookie we received previously.
      'Cookie' => $this->cookie,
    );
    $options = array(
      'headers' => $headers,
    );
    $response = xmlrpc($this->endpoint, array(
      'user.token' => array(),
    ), $options);
    $this
      ->handleXmlrpcError();
    if (isset($response['token'])) {
      $this->CSRFToken = $response['token'];
      return $this->CSRFToken;
    }
    else {
      throw new Exception(t("Unable to get a CSRF token from the remote site."));
    }
  }

}

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_base::credentialsLoad function Load the credentials into the connection.
clients_connection_base::debug function Output debugging data.
clients_connection_base::formatEndpoint function Format the connection's endpoint as a link. 1
clients_connection_base::get_credentials_storage_plugin function Get the credentials storage plugin for this connection.
clients_connection_drupal_services::connectionSettingsForm_submit function Submit handler for saving/updating connections of this class. Overrides clients_connection_base::connectionSettingsForm_submit
clients_connection_drupal_services::credentialsProperties function Declare an array of properties which should be treated as credentials. Overrides clients_connection_base::credentialsProperties
clients_connection_drupal_services::handleXmlrpcError function Common helper for reacting to an error from an XMLRPC call.
clients_connection_drupal_services::__construct function Constructor method. Overrides ClientsHandlerEntity::__construct
clients_connection_drupal_services_7_3::callMethodArray function Call a remote method. Overrides clients_connection_base::callMethodArray
clients_connection_drupal_services_7_3::connectionSettingsFormAlter function Extra form elements specific to a class's edit form. Overrides clients_connection_base::connectionSettingsFormAlter
clients_connection_drupal_services_7_3::getXCSRFToken function Get the X-CSRF token.
Entity::$defaultLabel protected property 1
Entity::$entityInfo protected property
Entity::$entityType protected property
Entity::$idKey protected property
Entity::$wrapper protected property
Entity::buildContent public function Builds a structured array representing the entity's content. Overrides EntityInterface::buildContent 1
Entity::bundle public function Returns the bundle of the entity. Overrides EntityInterface::bundle
Entity::defaultLabel protected function Defines the entity label if the 'entity_class_label' callback is used. 1
Entity::defaultUri protected function Override this in order to implement a custom default URI and specify 'entity_class_uri' as 'uri callback' hook_entity_info().
Entity::delete public function Permanently deletes the entity. Overrides EntityInterface::delete
Entity::entityInfo public function Returns the info of the type of the entity. Overrides EntityInterface::entityInfo
Entity::entityType public function Returns the type of the entity. Overrides EntityInterface::entityType
Entity::export public function Exports the entity. Overrides EntityInterface::export
Entity::getTranslation public function Gets the raw, translated value of a property or field. Overrides EntityInterface::getTranslation
Entity::hasStatus public function Checks if the entity has a certain exportable status. Overrides EntityInterface::hasStatus
Entity::identifier public function Returns the entity identifier, i.e. the entities name or numeric id. Overrides EntityInterface::identifier
Entity::internalIdentifier public function Returns the internal, numeric identifier. Overrides EntityInterface::internalIdentifier
Entity::isDefaultRevision public function Checks whether the entity is the default revision. Overrides EntityInterface::isDefaultRevision
Entity::label public function Returns the label of the entity. Overrides EntityInterface::label
Entity::save public function Permanently saves the entity. Overrides EntityInterface::save
Entity::setUp protected function Set up the object instance on construction or unserializiation.
Entity::uri public function Returns the uri of the entity just as entity_uri(). Overrides EntityInterface::uri
Entity::view public function Generate an array for rendering the entity. Overrides EntityInterface::view
Entity::wrapper public function Returns the EntityMetadataWrapper of the entity. Overrides EntityInterface::wrapper
Entity::__sleep public function Magic method to only serialize what's necessary.
Entity::__wakeup public function Magic method to invoke setUp() on unserialization.