SCRIPT.com.ua
Логин: Пароль:
Регистрация Забыл пароль
МАТЕРИАЛЫ
Поиск
Новости
Материалы
Работа с WDDX в РНР [PHP]
Рецепт по установке web-сервера под Windows [PHP]
Инициализация для Flash Player 8 Beta [Flash]
Криптование [Action Script]
Настрока Homesite под Action Script [Action Script]
Учитесь писать код правильно [PHP]
Пасхальные яйца. [Action Script]
Flash-игры: проще, если знаешь как [Flash]
Установка Ming под win32 Apache+PHP [Action Script]
Wysiwyg HTML Редакторы [DHTML]
Исходники
"Объект" на JavaScript - аналог AsBroadcaster [DHTML]
Запрет кэширования [HTML]
Полупрозрачные картинки, которые 'востанавливаются' при наведении. [DHTML]
Новостная лента v1.2.1 [PHP]
Обход XML-дерева [Action Script]
CDATA и комментарии [XSL]
Кроссразмерный полноэкранный режим [Action Script]
KeyListener [Action Script]
Редирект [HTML]
Текстовый узел [XSL]
Лаборатория
Документация
Файлы
Ссылки
Пользователи
Контакты
Наш выбор
Need for Speed Carbon: Own the City Sony PSP
Наши партнеры
Вторник, 24 Октября, 2006
Работа с WDDX в РНР [PHP]

Автор: К.Карпенко

Привет всем моим читателям!
Сегодня мы поговорим об очень важной технологии не только для мира Веб, но и для программирования в целом. А поговорим мы сегодня про универсальность данных и межплатформенный обмен информации. Как вы уже, наверное, поняли, для этого мы будем использовать технологии WDDX.
Но что это такое,- спросите вы.
WDDX был разработан совметсными усилиями разработчиков компании Alliery в 1998 году. И привзвана она в сей мир для того лишь, чтобы унифицировать информацию, и перевести её в один, доступный всем платформам формат- XML. И сказать чесно у них это получилось. Впервые технологию WDDX разработчики Alliery внедрили в свою же платформу, а именно ColdFusion. С течением времени данный формат данных набрал популярности среди разработчиков современного веб'а (хотя не так сильно, как хотелось бы). Данная технология была внедрена в большенство языков для веб-программирования. Так модули для поддержки WDDX доступны для Perl, PHP, Python, ColdFusion и многих других.
Ну, поскольку данная статья посвящена именно WDDX для платформы РНР, то о РНР сейчас и пойдёт речь.
В РНР данная технология интегрирована по умолчанию, и доступна во всех версиях начиная с 3.x.
По большому счёту технология WDDX не такая уж и масштабная, и заключаеться в нескольких банальных этапах обработки данных.
Вот эти этапы:
1.Данные
2.Сериализация и трансформация в WDDX код
3.Сериализирование данные
4.Десериализация и трансформация в ассоциативный массив
5.Данные
Как видите, с данных всё началось, и данными всё окончилось. Теперь давайте поговорим подробнее о каждом из этапов.
Что ж, допустим у нас есть некоторая переменная произвольного типа, и нам нужно перенести её в WDDX формат, для дальнейших трансформация. Для этого мы производим сериализацию, а то есть перевод данных в WDDX. Однако мы передаём не только данные и название ассоциированой с ними переменной, но и тип ассоциированой переменной, так как зачем нам обыкновенные данные.
В данный момент WDDX поддерживает большенство из доступных на разных платформах типов данных (числа, строки, структуры, массивы).
Что ж, чтобы вам было понятнее, мы сейчас напишем небольшой пример по сериализации данных, для того чтобы показать структуру WDDX данных на примере.

<?php
$array=array('dasa','fgs','312ew');
$integer=312;
$string='fgasdfasf';
$pack=wddx_packet_start('First WDDX package');
wddx_add_vars($pack,'array','integer','string','float');
$serialized_data=wddx_packet_end($pack);
print htmlspecialchars($serialized_data);
?>

Что ж давайте по порядку. Сначала мы объявляем разного рода переменные, для того чтобы сериализировать их в WDDX формат. После этого мы создаём “стартовый” пакет WDDX.
Кстати, вы можете оставить некоторый произвольный комментарий в качестве параметра функции wddx_packet_start(). Данный текст будет добавлен в специальный XML-тег с индификатором <comment>.
В целом он не носит никакой практической пользы, кроме того, что поясняет предназначение данных в данном WDDX пакете.
После того как мы создали пакет, у нас есть возможность добавлять в него новые данные. Для этого мы вызываем функцию wddx_add_vars. Которая первым аргументом принимает индификатор пакета, а после n-е количество аргументов строкового типа, которые будут насить название переменных в среде РНР. Эта же функция производит процес сериализации данных.
Теперь мы просто вызываем функцию wddx_packet_end, которой передаём ресурс пакета, и возвращённый результат присваиваем переменной $serialized_data. Теперь у нас есть готовый WDDX код, который можно отображать.
Для его отображения мы применяем к нему функцию htmlspecialchars, так как броузер не будет корректно отображать “теговые” данные.
Вот, как видите ничего архисложно (как бы сказал дедушка Ленин) в этом нет.
Эти данные теперь можно успешно преобразовывать в данные на другой платформе, и продолжать работу с ними. И вот сразу и появляеться вопрос, как же их преобразовать обратно?
А очень просто, для этого есть процедура десериализации. Десериализация это как раз процес обратный сериализации, а именно перевод данных на ту или иную платформу, в виде ассофицативного масива, где индексом будет название переменной, а значением её содержимое. Для десериализации в РНР служит функция wddx_deserialize или её прототип wddx_unserialize, дело в том, что функция wddx_unserialize доступна лишь в поздних версиях языка РНР, и потому мы в данной статье будем использовать функцию wddx_deserialize.
Что ж, давайте и это протестируем, для наглядности:

<?
$array=array('dasa','fgs','312ew');
$integer=312;
$string='fgasdfasf';
$pack=wddx_packet_start('First WDDX package');
wddx_add_vars($pack,'array','integer','string');
$serialized_data=wddx_packet_end($pack);
// Я удалю начальные переменные, чтобы показать вам, что они действительно
// пересоздадуться
unset($array,$integer,$float,$string);
$deserialized_data=wddx_deserialize($serialized_data);
foreach($deserialized_data as $k=>$v){
$$k=$v;
}
print $integer.';'.$array.';'.$string;
?>

Вот, как видите, всё успешно работает.
Сначала мы удаляем переменные (не забудьте - это не обязательно), а после вызываем функцию wddx_deserialize и передаём ей сериализированые данные в качестве аргумента, и результат её выполнения присваиваем переменной $deserialized_data. Но нам ведь не нужен массив, и поэтому нам нужно перевести его в формат обычных переменных. Для этого мы делаем простейший перебор и вспоминая тонкости РНР присваиваем переменно, именем которой будет значение переменной $k, значение переменной $v, так мы полностью восстанавливаем все переменные.
Как видите, процес работы с технологией WDDX довольно прост, однако для полного усвоения материала, мы создадим небольшой проект, в соответствии, с которым мы сначала сформируем WDDX-совместимые данные в среде ColdFusion с данные, скажем, биржи акций, далее нашей задачей будет перевести данные в среду РНР, для дальнейшей их обработки.
Что ж, приступим.

Код на PHP

<html>
<head>
<title>Биржа акций </title>
<meta http-eqiv='Content-Type' Content='text/html; charset=windows-1251'>
<meta name='Author' Content='LoRd aka K.Karpenko'>
</head>
<body>
<?php
if(isset($_POST['add'])){
$title=$_POST['title'];
$cost=$_POST['cost'];
$saldo=$_POST['saldo'];
$package=wddx_packet_start('Share Information System');
wddx_add_vars($package,'title','cost','saldo');
$serialized_data=wddx_packet_end($package);
$f=fopen('data.xml','w+');
flock($f,LOCK_EX);
fwrite($f,$serialized_data);
flock($f,LOCK_UN);
fclose($f);
print "Данные успешно добавлены!";
}
?>
<form action='' method='post'>
Название акций:<input type='text' name='title'><br>
Стоимость1000 акций: <input type='text' name='cost'><br>
Биржевое сальдо: <input type='text' name='saldo'>
<input type='submit' name='add' value='Добавить'>
</form>
</body>
</html>

Принцип вы скорее всего уже поняли. Полученые из формы данные мы сериализируем в формат WDDX, а потом пишем их в некий файл data.xml, для последующей обработки в среде ColdFusion, которая и будет обрабатывать данные файла.

Код на CFML

<html>
<head>
<title>Стоимость акций на бирже</title>
</head>
<body>
<cflock name='Block' type='ReadOnly' timeout='60'>
<cffile action='read' file='data.xml' variable='wddx_data'>
</cflock>
<cfwddx action='wddx2cfml' input='#wddx_data#' output='shares_cost'>
Данные по бирже:<br>
<cfoutput>
#shares_cost#
</cfotput>
</body>
</html>

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

До скорых встреч, Кирилл.

Опубликовал: Alexander (20:06) | комментарии [0]
< назад
Вверх © Copyright 2004-2014 Script.com.ua



Версия для печати