30 July 2009

Использование XML-RPC в Drupal. Quickstart

Drupal
В этой статье я расскажу как можно использовать эту замечательную технологию в не менее замечательной системе Друпал. В качестве примера попытаемся сделать систему, позволяющую отправлять сообщения на сайты под управлением Drupal из вашего jabber-клиента.

Чтобы сэкономить время, применим следующие инструменты:
  • Drupal 6
  • Services (модуль для Drupal 6)
  • xmppphp — для создания jabber бота (для тестового приложения вполне сгодится)
  • xmlrpc — упростим себе разработку
  • jid — под которым будет работать бот
  • небольшой вспомогательный класс


Drupal

Устанавливаем Друпал. После установки, включаем модуль Blog. Последующие сообщения будем размещать в блогах пользователей по следующей схеме. Человек добавляет бота себе в ростер, затем отправляет боту сообщение. Бот смотрит: есть ли такой пользователь (с таким же почтовым адресом)? Если есть, то добавляет сообщение от имени этого пользователя. Если таких нет, то регистрирует нового юзера и добавляем от его имени сообщение.
Друпал живёт по адресу drupal.org

Services

Нужно заметить, что на страничке модуля, на момент написания статьи, рекомендован к использованию development snapshot. Его и установим. После установки, включаем всё, что касается сервисов. Модуль имеет различные возможности аутентификации. Оставляю выбор метода на ваш вкус, однако следует учесть, что в примере использовалась авторизация на основе имени и пароля пользователя.
Модуль распологается здесь drupal.org/project/Services

Jabber Bot

C этим пунктом вопросов будет меньше всего, т.к. мы возьмём бота из примера. Берём любого консольного бота (их там аж две штуки) и дописываем несколько строк, которые будут инклудить наш вспомогательный класс.

Проект уютненько расположился на гугле-коде, и найти его можно
по этой ссылке: code.google.com/p/xmpphp
Скачиваем, распаковываем, запускаем бота, используя jid для авторизации.

Start the dance

Друпал готов, сервисы запущены, бот приветливо ждёт новых сообщений. Теперь очередь дошла до программирования. Напишем несколько функций, которые помогут немного упростить задачу.
Создадим небольшой класс и тут нам понадобится библитека xmlrpc:

  1. require_once("xmlrpc/xmlrpc.inc");


В конструкторе класса устанавливаем соединение:
  1. function __construct() {
  2. $this->send_message('system.connect');
  3. }


И соответственно, неплохо бы прописать отправку сообщений:

  1. function send_message($method, $message = array()) {
  2. $XMLRPC = new xmlrpc_client(_PATH, _SERV, _PORT);
  3. $XMLRPC ->return_type = "phpvals";
  4. $msg = new xmlrpcmsg($method, $message);
  5. $ret = $XMLRPC->send($msg);
  6. if(!$ret->faultCode()) {
  7. $answer = $ret->value();
  8. if (isset($answer['sessid']) && !isset(self::$session)) {
  9. self::$session = $answer['sessid'];
  10. }
  11. return $ret->value();
  12. } else return $ret->faultString();
  13. }


Теперь добавляем ноду. Для этого в качестве параметров передадим имя пользователя и сообщение для отправки:

  1. function node_save($user, $message) {
  2. $node = array (
  3. 'title' => '*',
  4. 'body' => $message,
  5. 'type' => 'blog',
  6. 'promote' => 1,
  7. 'uid' => 0 ,
  8. 'name' => 'Anonymouse' ,
  9. );
  10. $msg = array(
  11. php_xmlrpc_encode( self::$session ),
  12. php_xmlrpc_encode( $node )
  13. );
  14. return $this->send_message('node.save', $msg);
  15. }


Вот, в общем-то, и всё, что было необходимо сделать. Возможно наблюдательный хаброюзер заметит, что параметр $user ни коим образом не был задействован. Я решил оставить работу с пользователями на совесть читателей. Но если кому-нибудь захочется поскорее прикрутить что-то похожее к своему блогу, то весь класс можно найти здесь: github.com/mcnet/drupal.xmlrpc.class

Удачи!

ЗЫ Я бы не рекомендовал использовать класс без некоторой доработки. В данный момент весь код представлен в качестве ознакомительного примера.
Tags:xmppdrupalxml-rpcservicesexample
Hubs: Drupal
+5
3.3k 17
Comments 6
Popular right now
PHP Developer (удаленно)
from 100,000 ₽HelastelRemote job
Senior QA Engineer
from 1,800 to 2,200 $Nitka Technologies, Inc.Нижний НовгородRemote job
Frontend-разработчик
from 200,000 to 250,000 ₽Таможенная картаМоскваRemote job
Middle PHP developer (удалённо)
from 120,000 ₽BoxberryRemote job
.net разработчик
from 90,000 ₽IT Smart FinanceНовосибирск