A Javascript client for Drupal 7 / Services Module
-
An installation of Drupal 7.x and Services Module
-
REST Server module enabled, an endpoint defined and appropriate permissions (system, user, node, etc.). In server settings, enable only response formatter
json
the request parsing mime typesapplication/json
,application/x-www-form-urlencoded
andmultipart/form-data
. -
A Javascript project - node.js or Titanium are known to work.
bower install drupal-client
<script src="bower_components/drupal-client/build/drupal.min.js"></script>
npm install drupal-client
var Drupal = require('drupal');
Copy lib/drupal.js and lib/field.js into your app/lib/ folder.
var Drupal = require('drupal');
Configure the client for your installation of Drupal+Services. Note that the URL includes the trailing slash.
var drupal = new Drupal();
drupal.setRestPath("http://mywebsite.com/", "rest_endpoint");
Create a Service and enable (at least) the Resources called "system" and "user".
drupal.systemConnect(
//success
function(sessionData) {
var uid = sessionData.user.uid;
console.log('session found for user '+uid);
},
//failure
function(error) {
console.log('boo :(');
}
);
var user = {
name: 'my_new_username',
pass: 'my_new_password',
mail: 'my_email@drupal.js'
};
drupal.createAccount(user,
//success
function(userData) {
console.log('yay!');
},
//failure
function(error) {
console.log('boo :(');
},
headers //optional
);
var my_username = "<DRUPAL USERNAME>";
var my_password = "<DRUPAL PASSWORD>";
var userObject;
drupal.login(my_username, my_password,
function(userData) {
console.log('User ' + userData.uid + ' has logged in.');
userObject = userData;
},
function(err){
console.log('login failed.');
}
);
This updates an account profile on the server. userObject
is a user object that may have been received from a login request (see above).
drupal.putResource("user/"+userObject.uid, userObject,
function(userData) {
console.log('user has been updated.');
},
function(err){
console.log('user update failed.');
}
);
var filename = "uploaded_file.png";
var data = require('fs').readFileSync("path/to/file/file.png");
var base64data = data.toString('base64');
var filesize = data.length;
drupal.uploadFile(base64data, filename, filesize,
function (response) {
fid = response.fid;
},
function (err) {
console.log(err);
},
function (progress_event) {
console.log(progress_event.loaded + '/' + filesize + ' uploaded');
}
);
var node = {
type: "my_content_type",
title: "My New Node",
body: drupal.field.structureField("Check out this great new node!"),
field_bool: drupal.field.structureField(1),
field_decimal: drupal.field.structureField(.1),
field_float: drupal.field.structureField(2.3),
field_integer: drupal.field.structureField(4),
field_multiple: drupal.field.structureField(["one", "two", "three"]),
field_file: drupal.field.structureField(fid, "fid"),
field_date: field.structureField(new Date())
};
drupal.createNode(node,
function (resp) {
console.log(resp);
},
function (err) {
console.log(err);
}
);
The workhorse function of the interface is makeAuthenticatedRequest(config, success, failure, headers)
. There are a few helper functions included for posting/getting nodes, getting views, uploading files, etc. They all construct a call to makeAuthenticatedRequest()
. This function should facilitate most things that people want to do with Drupal in a mobile environment. It's also easy to use `makeAuthenticatedRequest' to make requests against custom Services. The short-term roadmap includes calls to the services supporting entities.
To run the tests, rename test/config.js.example
to test/config.js
and replace strings with the url of your Drupal install and your service endpoint.
npm install
npm test