Совет по XForms: Прием XForms-данных в PHP

Некоторым образом XForms-форма аналогична HTML-форме; при соответствующем кодировании серверный сценарий, принимающий данные, даже не будет видеть различий. Но сила XForms-форм во многом состоит в том, что данные могут быть переданы непосредственно в виде XML. Естественно, эта возможность не имеет большой ценности до тех пор, пока вы не подготовите сценарий по приему таких данных. В данном совете вы увидите, как создать PHP-сценарий, который может принимать и работать с XML-данными, переданными из XForms-формы.

Николас Чейз, автор, Studio B

Николас Чейз (Nicholas Chase), автор Studio B (www.studiob.com), работает в области разработки web-сайтов для таких компаний как Lucent Technologies, Sun Microsystems, Oracle и Tampa Bay Buccaneers. Ник работал учителем физики в средней школе, менеджером по низкоуровневой утечке радиоактивности, редактором интерактивного журнала по научной фантастике, инженером мультимедийных средств и инструктором по Oracle. Не так давно он был директором по технологии в компании, специализирующейся на интерактивных взаимодействиях в Clearwater, Florida. Николас является автором четырех книг по Web и XML-разработке, включая "XML Primer Plus" (Sams). Он любит общаться с читателями, и к нему можно обратиться по адресу nicholas@nicholaschase.com.



07.03.2007

Протестированные браузеры

Описанные в данном совете примеры XForms были протестированы при помощи Firefox 1.5 (с установленным расширением XForms) и Microsoft® Internet Explorer 6 с установленным элементом управления Formsplayer. Файл для загрузки содержит XHTML-файл для Firefox и HTML-файл для IE.

Пример документа

Начнем с примера документа. Для того чтобы иметь, с чем работать, создайте следующий пример (см. листинг 1).

Листинг 1. Пример документа
<?xml version="1.0" encoding="UTF-8"?>
<inventory>
   <book>
      <author>Nick Chase</author>
      <title>XML Primer Plus</title>
      <publisher>Sams</publisher>
   </book>
   <book>
      <author>Earth</author>
      <title>David Brin</title>
      <publisher>Spectra</publisher>
   </book>
   <movie>
      <director>Steven Spielberg</director>
      <title>Raiders of the Lost Ark</title>
      <actor>Harrison Ford</actor>
      <actor>Karen Allen</actor>
   </movie>
   <movie>
      <director>Rob Reiner</director>
      <title>The American President</title>
      <actor>Michael Douglas</actor>
      <actor>Annette Bening</actor>
      <actor>Martin Sheen</actor>
   </movie>
</inventory>

Форма для управления этими данными довольно проста (см. листинг 2).

Листинг 2. Управление данными
<?xml version="1.0" encoding="ASCII"?>
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ev="http://www.w3.org/2001/xml-events"
 xmlns:xforms="http://www.w3.org/2002/xforms">
  <head>
    <title>Instance Data-To-XHTML/XForms Example</title>
    <xforms:model id="model_inventory">
      <xforms:instance id="instance_model_inventory" src="inventory.xml"/>
      <xforms:submission id="submit_model_inventory"
 action="http://localhost/xforms.php"
          method="post"/>
    </xforms:model>
  </head>
  <body>
    <xforms:submit submission="submit_model_inventory">
      <xforms:label>Submit</xforms:label>
    </xforms:submit>
  </body>
</html>

Форма просто передает документ "как есть", что видно на рисунке 1.

Рисунок 1. Форма
Рисунок 1. Форма

Теперь давайте поработаем с PHP. Данные XForms-формы передаются на сервер как содержимое POST-запроса, поэтому для доступа к ним в PHP вы должны обратиться к содержимому переменной $HTTP_RAW_POST_DATA (см. листинг 3).

Листинг 3. Основной PHP
<?php
if (!isset($HTTP_RAW_POST_DATA))
   $HTTP_RAW_POST_DATA = file_get_contents("php://input");

   header("Content-type: text/plain");
   echo $HTTP_RAW_POST_DATA;
?>

Переменная $HTTP_RAW_POST_DATA не устанавливается по умолчанию во многих установках PHP; это требует определенных изменений конфигурации. К счастью, вы можете заполнить ее вручную, используя функцию file_get_contents(), для чтения данных из входного потока.

После получения строки, содержащей XML, вы можете вывести ее в браузер в виде неформатированного текста, установив Content-type для ответа в text/plain и выводя (echo) содержимое переменной. Вы могли бы увидеть пример документа в существующем виде при подтверждении формы, как показано на рисунке 2.

Рисунок 2. Пример документа
The instance document

Это все хорошо, но как насчет реальной работы с данными? К счастью, PHP позволяет вам легко создавать DOM Document из строки, содержащей XML-текст (см. листинг 4).

Листинг 4. Работа с данными
<?php
if (!isset($HTTP_RAW_POST_DATA))
   $HTTP_RAW_POST_DATA = file_get_contents("php://input");

   $doc = new DOMDocument();
q   $doc->loadXML($HTTP_RAW_POST_DATA);

   $allBooks = $doc->getElementsByTagName('book');
   $numBooks = $allBooks->length;

   $allMovies = $doc->getElementsByTagName('movie');
   $numMovies = $allMovies->length;

   echo "There are ".$numBooks." books and ".$numMovies." movies.";
?>

В данном случае вы создаете новый DOM Document, а затем используете функцию loadXML() для загрузки данных. После этого вы можете управлять Document любым способом, как будто вы загрузили данные из файла или из другого источника. В данном случае результаты должны выглядеть примерно так, как показано на рисунке 3.

Рисунок 3. Окончательный результат
Рисунок 3. Окончательный результат

Резюме

XForms передает XML-данные как содержимое HTTP POST-запроса, поэтому для использования их в вашем приложении просто прочтите содержимое переменной $HTTP_RAW_POST_DATA.


Загрузка

ОписаниеИмяРазмер
Пример кода PHP XFormsphpdatafiles.zip3KB

Ресурсы

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=XML
ArticleID=200367
ArticleTitle=Совет по XForms: Прием XForms-данных в PHP
publish-date=03072007