Drupal 6 + Silverlight

Аватар пользователя Dr. Hardcore Dr. Hardcore 5 августа 2008 в 12:17

Я думаю про технологию Silverlight слышали многие и надеюсь про взаимодействие Silverlight и Drupal тоже. На днях набрел на статью Connecting Drupal and Silverlight. Для меня это не стало новостью, но скажем так очень заинтересовало. Ниже привожу свой перевод статьи. Для просмотра демонстрации вам необходимо установить Silverlight 2.0. И так статья:
Представленное приложение Silverlight позволяет выполнять следующие действия:

  • Вход пользователя
  • Анонимный вход
  • Создание нового пользователя
  • Выход пользователя

Вы можете выполнять действия, описанные выше, используя сессию Silverlight; нет необходимости обновлять страницу, для того чтобы действия имели эффект для приложения Silverlight. Но обновление страницы позволит Drupal распознать ваши действия, если вы создаете аккаунт или выполнили вход.
Drupal – система управления контентом с открытым исходным кодом (CMS), которая позволяет пользователям добавлять модули на сайт, обеспечивая огромную гибкость. Эти модули обычно написаны на языке PHP и используют API Drupal для взаимодействия с платформой (ядром). Silverlight (версии 2.0 и выше) – кросс-платформенный плагин для браузера, который позволяет пользователям писать управляемый .NET код для серверной стороны и использовать XAML для пользовательской стороны. С тех пор как Silverlight – стало приложением для браузера и Drupal платформой, содержащей данные в браузере, они могут обмениваться данными между собой используя протокол HTTP в качестве интерфейса. В этом примере я решил использовать XML-RPC, так как для Drupal он является «родным», а Silverlight может легко использовать его возможности.
XML-RPC Scheme
На заметку: для Drupal существует модуль services, который находится в стадии разработки, позволяющий внешним приложениям (таким как Silverlight) легко взаимодействовать используя различные интерфейсы, такие как XML-RPC, SOAP, REST and AMF. Я не использую этот модуль в своем примере.

Собственный модуль для Drupal:

Я установил Drupal 6.2 с собственным модулем, который был написан для взаимодействия с моим приложением Silverlight. Я написал модуль, следуя советам книги Pro Drupal Development, используя главы 2 и 19. Для создания модуля для Drupal необходимы два фала: файл .info, который содержит информацию о модуле, и файл .module, который является собственно модулем. Мой модуль чрезвычайно прост, в котором реализуется хук hook_xmlrpc, связывающий xml-rpc методы с функциями php. XML-RPC методы принимаются из приложения Silverlight и вызывают соответствующие функции php c необходимыми аргументами. Мои функции php выполняют различные задачи, такие как: проверка в базе данных drupal, существует ли пользователь, выполнение входа если пользователь существует и переданы соответствующие данные, обеспечние входа анонимного пользователя, выход из системы и создание зарегистрированного пользователя. После того как модуль загружен на сервер и включен – работа окончена. Окончена для Drupal.

Приложение Silverlight:

Существуют два метода в Silverlight для взаимодействия через web сервис (в нашем случае Xml-rpc): WebClient и HttpWebRequest. HttpWebRequest включает в себя все свойства и методы WebClient и ему подобных. Но конечно особенные моменты, которые предоставляет HttpWebRequest добавляют комплексность. WebClient чрезвычайно прост, и требует всего лишь одно событие и одно свойство для использования, хотя существуют дополнительные методы и свойства, делающие жизнь легче. Ниже приведены свойства и события, которые я использовал для моего приложения:

drupalDB = new WebClient();
drupalDB.UploadStringCompleted += new UploadStringCompletedEventHandler(drupalDB_UploadStringCompleted);
drupalDB.UploadProgressChanged += new UploadProgressChangedEventHandler(drupalDB_UploadProgressChanged);
drupalDB.UploadStringAsync(location, xmlData);

drupalDB – это мой WebClient, и два события описанные здесь, уведомят меня об изменении процесса загрузки и его завершении (прекрасно подходит для панели прогресса). Свойство UploadStringAsync берет URI и строку как данные для загрузки на web сервис. На заметку: я использую UploadStringCompleted и не использую DownloadStringCompleted так как WebClient выполняет GET для загрузки и POST для отправки, но XML-RPC позволяет использовать только POST.

Данные, которые я отправляю на xml-rpc сервис это строка в формате xml, которая использует стандартное xml-rpc описание:

string xmlData = "<?xml version=\"1.0\"?>"
              + "<methodCall>"
              + "<methodName>userlogin.logAnonIn</methodName>"
              + "<params>"
              + "<param>"
              + "<value>"
              + "</value>"
              + "</param>"
              + "</params>"
              + "</methodCall>";

Необходимо отметить две важные вещи: Тэг <methodName> содержит xml-rpc метод, который хук hook_xmlrpc направит на php-функцию. Первая часть аргумента, userlogin – имя моего модуля и стандартный формат, которому следует Drupal. Тэг <param> содержит тэг <value> где аргумент может быть передан функции hook_xmlrpc. Если требуется несколько аргументов, то к аргументу необходимо добавить дополнительно тэги <param><value>мои данные</value></param> между тэгом <params>. Как только данные отправлены от Silverlight к Drupal, и соответствующая функция выполнена, возвращаемое значение передается Silverlight:

<methodResponse>

  <params>
    <param>
      <value>
        <string>return value</string>
      </value>
    </param>
  </params>
</methodResponse>

Событие UploadStringCompleted уведомит о том, что все данные получены. Распространенный способ разобрать полученные данные – использовать LINQ. LINQ очень мощный и легкий в использовании инструмент, если вы немного изучите его. Я могу разобрать полученные данные, используя следующее выражение LINQ:

XDocument document = XDocument.Parse(e.Result);
List<MethodToCall> methodsToCall = (from user in document.Descendants("value").Elements("string")
                                    select new MethodToCall
                                    {
                                        MethodName = user.Value
                                    }).ToList();

Я расположил результат в XDocument и использовал LINQ для разбора документа для каждого узла ‘value’, который имеет потомка ‘string’. Это стандартный формат, в котором отправляет xml-rpc. Если передано несколько аргументов, то будет несколько узлов ‘value’. Я вызвал ToList() в выражении LINQ для создания общего списка нескольких аргументов, которые могут быть снова обработаны.
В моем приложении, с того момента как я стал контролировать то, что я отправляю и принимаю от xml-rpc сервиса, я решил использовать строку ответа от Drupal как метод в моем приложении Silverlight. Следует отметить, что аргументы, которые отправляются в качестве ответа представлены как объекты. Если в ответе несколько аргументов, они так же являются объектом, а не массивом объектов, таким образом метод должен получить несколько аргументов, являющимися объектами, вместо одного аргумента – массива объектов.
После того как мой метод вызван через событие я просто обновляю объект «пользователь». И мы получаем то что хотели! Это основы того, как научить Drupal общаться с Silverlight. Конечно же, необходимо добавить больше логики в приложение Silverlight, для того чтобы разобраться в данных, которые ему прислал Drupal. Я добавил немного элементов, которые, надеюсь, дают опыт пользователю, что намного лучше (и легче) в моем приложении для входа пользователей.
На заметку: Если ваше приложение Silverlight сконфигурировано на web-сервере, все что вам нужно, для того чтобы отобразить его – использовать нижеприведенный код, где вам угодно:

<div style="width: 325px; height: 350px;">
    <object data="data:application/x-silverlight," type="application/x-silverlight-2-b2" width="100%" height="100%">
        <param name="source" value="/silverlight/SLApps/DrupalGameDemo.xap" />
 
        <!-- Only need the below to show a link to get silverlight if it is not installed -->
        <a href="http://go.microsoft.com/fwlink/?LinkID=115261" style="text-decoration: none;">
            <img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style: none" />
        </a>
    </object>
</div>

Тэг <object> содержит тэг , который имеет атрибут ‘value’, содержащий расположение вашего файла .xap. Ссылка в коде будет отображена в том случае, если пользователь не установил Silverlight.

P.S. В аттаче выкладываю модуль для Drupal. Само приложение Silverlight выкладывать не стал так как архив с ним битый. У кого есть желание - может попробовать скачать с источника.

__________________________

ВложениеРазмер
Иконка пакета silverlight_login.zip1.44 КБ

Комментарии

Аватар пользователя VladSavitsky VladSavitsky 5 августа 2008 в 13:34

Признаюсь - про эту технологию я вообще ничего не знаю. Поэтому поискал инфу и вот пару страниц с объяснением что это такое:

  • Знакомство с Silverlight - В данном техническом документе содержится общий обзор технологии Silverlight и определяется ее место среди инструментов разработки веб-приложений нового поколения. (8 печатных страниц)
  • Silverlight Материал из Википедии

PS
Добавил ссылку на эту статью в Википедию.

Аватар пользователя Dr. Hardcore Dr. Hardcore 5 августа 2008 в 13:41

Silverlight - достаточно продвинутая вещь, мне очень нравится. Наверно евангелисты Microsoft сделали свое дело и посвятили в свою веру. Был на ее презентации на днях разработчика, ну и видел какие прелести можно делать с ее помощью на Remix в Москве. Ну и документации по ней ну уж очень много. Если нужно, могу поискать скринкаст по сильверлайту, дабы было нагляднее.

Аватар пользователя andrbelt andrbelt 5 августа 2008 в 14:17

Silverlight - очень специфическая технология. представьте, что вы затрачиваете уйму времени на добавление этих silverlight фишек на свой сайт. А что увидят 99,99999% пользователей, когда зайдут к вам - предложение скачать Silverlight (2.5mb). Размер конечно смешной. Но уверяю вас, что большинство пользователей плюнут на это. И я лично сделаю также. Это точно такой же маразм как делать весь сайт на flash и требовать чтобы пользователь установил последнюю версию flash проигрывателя. Если сайт предъявляет какие-то требования к пользователю, то такой сайт явно ненужен.
Так что на данный момент Silverlight - пустая трата времени для разработчика.

Аватар пользователя Dr. Hardcore Dr. Hardcore 5 августа 2008 в 15:10

andrbelt wrote:
Silverlight - очень специфическая технология. представьте, что вы затрачиваете уйму времени на добавление этих silverlight фишек на свой сайт. А что увидят 99,99999% пользователей, когда зайдут к вам - предложение скачать Silverlight (2.5mb). Размер конечно смешной. Но уверяю вас, что большинство пользователей плюнут на это. И я лично сделаю также. Это точно такой же маразм как делать весь сайт на flash и требовать чтобы пользователь установил последнюю версию flash проигрывателя. Если сайт предъявляет какие-то требования к пользователю, то такой сайт явно ненужен.
Так что на данный момент Silverlight - пустая трата времени для разработчика.

Ничего себе загнул.... Можно вопрос? Вы насколько знакомы с сильверлайтом чтобы утверждать такое? Во первых, если так рассуждать - тогда и флэш в топку, если пользователь не установит флэш плеер то не увидит к примеру баннеры. Сырая технология???? На счет уймы времени абсолютно несогласен, все что требуется для разработчика, касательно интеграции drupal и Silverlight, прописать колбэк для соответствующих функций и все. не думаю что это займет много времени. Если говорить о сильверлайте, то возможности, которые предоставляет сильверлайт уникальны, то есть этого нет ни во флэше ни в JavaScript, а если аналогичный функционал возможно организовать, то сто процентов с потерей производительности и оптимизации. Не поленюсь найти скринкасты по сильверлайту и презентации с devdays.
P.S. Кстати, не удивлюсь, если Microsoft добавит сильверлайт к обновлениям, соотвественно отпадет необходимость устанавливать его вручную, аналогичная ситуация может произойти и с Mac'ами. Если так рассуждать, то любая платформа или "виртуальная машина" - сакс. Я о яве рантайм, .net и т.д.

Аватар пользователя Akzhan Akzhan 8 августа 2008 в 0:13

На требования к клиенту можете реально положить

Почти ВСЕ пользователи Windows получат обновления автоматически.

Остальные получат обновления автомат через FireFox.

А оставшиеся абсолютно коммерчески незначимы.

Аватар пользователя Nikit Nikit 5 августа 2008 в 14:49

andrbelt, не всё же одним гребешком, например корпоративные сайты? иногда, помоему, проще силверлайт, чем в скриптах копаться.

Аватар пользователя andrbelt andrbelt 5 августа 2008 в 15:13

Nikit, я писал несколько о другом. все ваши изыски Silverlight пользователь просто не увидит, так как у него Silverlight не установлен на системе. то есть данная технология полный аналог flash. единственное различия - flash инсталлирован у подавляющего большинства. а Silverlight - никто даже не знает что это такое. может быть в будущем microsoft удаться продвинуть свое детище. но сейчас это пока бессмысленная игрушка.
P.S. у кого не установлен flash проигрыватель? поднимите ваши руки? опустите. а у кого установлен Silverligh? вот в чем смысл. может быть Silverlight - технология будущего времени. может быть.

Аватар пользователя Akzhan Akzhan 8 августа 2008 в 0:23

У меня не установлен дома Flash, и установлен Silverlight 2RC1.

Вам уже ответили - 99% рынка будут иметь Silverlight. Это гарантируют Windows Update и Nokia.

Остальных в лес, как незначимых с коммерческой точки зрения,

Ибо пользователи бесплатного софта не привыкли платить за софт... хотя и для них есть Moonlight.

P.S.: На Макосихе тоже есть, это же демонстрировали неоднократно,

Вообще тут забавно вышло - когда в большой компании юникосидов предложили лицензировать всё ПО, по выбору сотрудника, за бабло компании (выбор между Ubuntu и Vista)... максимальное количество сотрудников забило на опен-сорсные понты.

Аватар пользователя Dr. Hardcore Dr. Hardcore 5 августа 2008 в 15:13

Сильверлайт относительно молодая технология, но аналогом флэша уж точно не является. Кто не верит, в сети куча обзоров и сравнений этих технологий. И уж поверьте, Microsoft продвинет ее

Аватар пользователя andrbelt andrbelt 5 августа 2008 в 15:31

Если уж быть честным, то тогда давайте не будем сравнивать дедушку flash и бабушку JavaScript с Silverlight и на их фоне показывать преимущество новой технологии. Было бы правильнее провести сравнение новобранцев: Silverlight от microsoft и Flex от Adobe. Мне кажется Silverlight пока проигрывает)))

P.S. Dr. Hardcore, вы точно евангелист от microsoft)

Аватар пользователя Dr. Hardcore Dr. Hardcore 5 августа 2008 в 16:10

Да нет, я не евангелист, уж точно бы drupal не использовал, и не сидел бы здесь а где нибудь на blogs.msdn или на gotdotnet.=) Просто некоторые технологии Microsoft мне нравятся, тем более я могу их использовать с моим любимым друпалом

Аватар пользователя Nikit Nikit 5 августа 2008 в 16:40

andrbelt, я тоже о другом, о других задачах так сказать.
Насчёт флеша и силверлайта вы несколько категоричны, флеш имхо "устарел", будущее за такими как силверлайт (есть еще варианты?).

Аватар пользователя Irbis Irbis 5 августа 2008 в 17:03

Не у всех ещё flash стоит, а вы про Silverlight Smile Это как .net, появился ещё 6 лет и только сейчас набирает обороты, когда его в visty воткнули, заметьте что ещё не все перешли на неё. А Linux-оиды с бубном и mono до сих пор устраивают ритуальные пляски. За Silverlight будущее - только вот когда оно это будущее настанет?

Аватар пользователя Dr. Hardcore Dr. Hardcore 5 августа 2008 в 17:57

будущее начинается завтра=) я думаю что установить сильверлайт не сложнее чем установить флэш. а преимущества очевидны, и они уж точно превосходят недостатки

Аватар пользователя fasdalf@fasdalf.ru fasdalf@fasdalf.ru 6 августа 2008 в 9:44

Я вот не могу оценить приемущеста - на мою винду XP Silverlight не ставится в принципе и переставлять её ради него не буду. Так что я не в силах оценить его приемущества. А flash у меня включен Wink

Аватар пользователя Dr. Hardcore Dr. Hardcore 6 августа 2008 в 10:19

В общем что-то каменты не в ту степь пошли, действительно пишу как евангелист... Цель статьи (точнее ее перевода) не показать какой классный сильверлайт, все его преимущества, и т.д., а лишь возможность его интеграции с друпалом. Хотите использовать - используйте, не хотите - на нет и суда нет.

Аватар пользователя theurs theurs 7 августа 2008 в 15:37

http://www.microsoft.com/silverlight/resources/install.aspx?mode=sysreq&...

Microsoft Silverlight may not be supported on your computer's hardware or operating system.

You are ready to use Microsoft Silverlight

ОС - последняя стабильная версия Ubuntu со всеми обновлениями по сегодня, файрфокс 3.

Ничего кроме разочарования новые технологии микрософта не вызывают.

Аватар пользователя andypost@drupal.org andypost@drupal.org 7 августа 2008 в 15:58

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

Аватар пользователя Dr. Hardcore Dr. Hardcore 7 августа 2008 в 22:25

<a href="mailto:andypost@drupal.org">andypost@drupal.org</a> wrote:
Все правильно, нафиг эти холивары - тут просто изложено возможное решение. А уж кому оно понадобится и для чего - это отдельная тема мало относящаяся к друпалу.

Огромное спасибо за понимание.... уж чего не хотел от статьи так это холивара....

Аватар пользователя Ильич Рамирес Санчес Ильич Рамирес Санчес 11 августа 2008 в 18:27

"Akzhan" wrote:
На требования к клиенту можете реально положить

ага. первый шаг к тому чтобы клиенты на вас положили... тото я зря оставляю отработчики без JS на случай старых браузеров и тд...

Аватар пользователя Akzhan Akzhan 12 августа 2008 в 3:54

Ilya1st wrote:
"Akzhan" wrote:
На требования к клиенту можете реально положить

ага. первый шаг к тому чтобы клиенты на вас положили... тото я зря оставляю отработчики без JS на случай старых браузеров и тд...

Всегда надо смотреть на шаг вперёд. Делать сервисы не на сегодня, а на год вперёд.

RIA - это наше будущее, что, естественно, не отменяет обычных сайтов, но очень удачно их дополняет.