IBM®
Перейти к тексту
    в России и странах СНГ [изменить]    Условия использования
 
 
   
    Главная страница    Продукты    Услуги и решения    Поддержка и загрузка    Мой профиль    
Перейти к тексту

developerWorks Россия  >  XML  >

Используйте PHP для создания XForms : Часть 2. Использование библиотеки XForms, написанной на PHP, для создания форм

developerWorks
Опции документа

Опции документа, требующие включения JavaScript, не отображаются

Обсудить

Исходные тексты примера


Выскажите мнение об этой странице

Помогите нам улучшить содержание


Уровень сложности: средний

Тайлер Андерсон, независимый автор, N/A

08.10.2008

Данная статья, состоящая из двух частей, рассчитана на PHP-разработчиков. Она призвана заставить их отказаться от использования форм формата HTML Web 1.0 и перейти на использование XForms формата Web 2.0. В первой части данной статьи мы создали библиотеку XForms на PHP. Во второй части данной статьи нам предстоит ее улучшить, добавив функцию проверки на ошибки и некоторые другие полезные функции для того чтобы сделать ее использование более удобным. После этого вы рассмотрите пример использования этой библиотеки, создав соответствующую форму.

Библиотека XForms на PHP: что дальше?

Не забегайте вперед! Убедитесь, что вы прочли первую часть данной статьи: «Создание библиотеки XForms на PHP».

На данный момент у нас есть библиотека, написанная на PHP, которая теоретически должна работать, но на практике она еще не тестировалась. Настало время улучшить вид выводимых данных, ввести проверку входных параметров функций (поскольку сообщения об ошибках, выдаваемые программой предварительной обработки данных XForms, не всегда бывают полезны), а также посмотреть на пример использования данной библиотеки.

Ну что же, приступим к реализации намеченного плана.



В начало


Улучшение библиотеки

После того как мы создали ядро библиотеки XForms, мы готовы внести в нее некоторые улучшения. Например, можно добавить возможность исключения данных определенного типа, а также возможность управления этими данными, что бывает полезно в тех случаях, когда не все вводимые данные могут быть приняты, либо в случае, когда возникшие ошибки могут оказать негативное воздействие на конечный XHTML-документ. Кроме того, нам понадобятся несколько вспомогательных функций, которые будут использоваться при выводе кода XHTML в Web-браузер и форматировании данных. Начнем с введения проверки на ошибки.

Проверка на ошибки

Добавив в библиотеку возможность проверки на ошибки, мы тем самым значительно сократим время написания кода за счет того, что препроцессору XForms придется обрабатываться гораздо меньше ошибок. Если это сделать сейчас, то в дальнейшем эта проверка будет значительно помогать нам при разработке. Проверка на ошибки будет производиться двумя способами:

  • Первая проверка будет выполняться для тех тегов XHTML, в которых могут использоваться вложенные элементы (например, те четыре тега, которые использовались в первой части статьи: action, model, trigger и repeat).
  • Вторая проверка выполняется при передаче функциям входных параметров. При этом проверяется возникновение определенных условий. Если такие условия возникают, то они должны быть обработаны должным образом с отображением соответствующей информации в браузере.

Для начала перейдем к списку переменных в файле xforms_lib.php и добавим две переменные, как показано в листинге 1.


Листинг 1. Добавление новых переменных
                
...
    var $namespaceEvents;
    var $allowed; 
    var $tag;
    
    function xforms_lib($ns, $nsxforms, $nsevents){
... 
        $this->tag = '';
        $this->allowed =
            array('action' => array('dispatch', 'insert',
                                    'setvalue', 'load'),
                  'model' => array('instance', 'submission',
                                   'bind', 'action'),
                  'trigger' => array('label', 'action'),
                  'root' => array('trigger', 'submit', 'select1',
                                  'repeat', 'input', 'output',
                                  'label', 'model'));
...

Здесь новые переменные – $allowed и $tag. В конструкторе мы проинициализируем их. Ниже в данном разделе вы узнаете больше о назначении переменной $tag, а пока вам достаточно знать лишь то, что эта переменная предназначена для хранения текущего открытого тега. Все значения, представленные в листинге 1, являются тегом XHTML самого верхнего уровня XForms. Root используется в том случае, если ни один тег не был определен (repeat и root фактически являются одним и тем же тегом, при этом, когда тег repeat открыт, root используется для проверки данного факта). Например, взгляните на 'action': в качестве разрешенных дочерних тегов XHTML выступают только dispatch, insert, setvalue и load. Как видите, в разных тегах разрешено использовать разные дочерние теги.

Чтобы воспользоваться всеми новыми функциональными возможностями, нам предстоит изменить метод dispatchTag так, как показано в листинге 2.


Листинг 2. Внесение изменений в функцию dispatchTag
                
    function dispatchTag($name, $target){
        $this->check('dispatch');
        $xml = '<xforms:dispatch';
        if($name != '')
            $xml .= ' name="'.$name.'"';
        if($target != '')
            $xml .= ' target="'.$target.'"';
        $xml .= " />";
    }

Обратите внимание на то, что здесь добавилось нового. В новую функцию check (которую мы создадим ниже) мы передаем имя создаваемого тега. Остальная часть функции осталась прежней.

Теперь нам необходимо ввести новую функцию check (как показано в листинге 3). С помощью данной функции мы и будем производить проверку.


Листинг 3. Функция check
                
    function check($newTag, $action=''){
        $openTag = $this->tag;
        if($openTag == '')
            $openTag = 'root';

        if($action == 'close' && ($openTag != $newTag || $openTag == 'root'))
            throw new Exception("Cannot close $openTag with a $newTag ".
                                "\"close tag\"statement!");
        else if($action == 'close' && $openTag == $newTag)
            return;
        else if(!in_array($newTag, $this->allowed["$openTag"]))
            throw new Exception("$newTag is not allowed within $openTag!");
    }

  • Первое условие if. Обратите внимание на то, что если текущее значение переменной $tag не определено (т.е. равно ''), то параметру $openTag по умолчанию будет присвоено значение 'root'.
  • Второе условие if. Если открытый тег, определенный в $openTag, закрывается, и при этом открытый тег ($openTag) не такой же как тег $newTag или равен root (так как тег root не может быть закрыт), то после этого выводится сообщение об ошибке.
  • Первый оператор else в условии if. В противном случае, если закрываемый тег ($newTag) равен открытому тегу ($openTag), то ошибка не возникнет.
  • Второй оператор else в условии if. Однако если открываемый/создаваемый тег ($newTag) не относится к числу тегов, которые разрешено открывать внутри уже открытого тега ($openTag) (например, если тег repeat попробуют создать при открытом теге action), то будет выдано сообщение об ошибке. Такие ошибки будут перехвачены, после чего о них будет выведена информация пользователю.

Сейчас нам предстоит воспользоваться функцией check, добавив необходимое для проверки выражение во все функции, некоторые из которых представлены в листинге 4 в качестве примера (остальные изменения вы можете найти в исходном коде).


Листинг 4. Добавление функции check
                
    function loadTag($resource = '', $ref = '', $show='replace'){
        $this->check('load');
        $xml = '<xforms:load show="'.$show.'"';
...
    }

    function triggerTagOpen($ref, $submission = '', $label = 'default'){
        $this->check('trigger', 'open');
        $xml = '<xforms:trigger ref="'.$ref.'"';
        if($submission != '')
            $xml .= ' submission="'.$submission.'"';
        $xml .= ' >';
    }

    function triggerTagClose(){
        $this->check('trigger', 'close');
        $xml = '</xforms:trigger>';
    }

Здесь нам необходимо не забыть добавить вызов функции $this->check() к каждой функции, которая создает тег XHTML. Обратите внимание на разницу в вызове функции check в функциях triggerTagOpen и triggerTagClose. Второй параметр ('open' или 'close') передается в зависимости от того, был ли тег открыт или закрыт.

Сейчас нам предстоит создать функцию, которая назначает открытый в данный момент тег ($this->tag), представленный ранее в листинге 3. Мы будем использовать данную функцию для присвоения значения открытому в данный момент тегу, как показано в листинге 5.


Листинг 5. Функция setTag
                
    function setTag($t){
        $this->tag = $t;
    }

Мы будем использовать эту функцию для назначения тега самого верхнего элемента. Например, после открытия тега model мы воспользуемся этой функцией следующим образом: setTag('model'). После закрытия тега мы больше не будем работать под XHTML-тегом XForms, поэтому нам необходимо будет еще раз вызвать эту функцию следующим образом: setTag('root'), вновь присвоив значение root в качестве текущего открытого тега.

Настало время добавить проверку вводимых значений. При этом при обнаружении недопустимых данных будет выводиться соответствующее сообщение. Для добавления проверки нам понадобятся всего пять функций: submission, bind, load, select1 и instance. Начнем с функции submission, как показано в листинге 6.


Листинг 6. Функция submissionTag (вывод сообщения об ошибке при обнаружении недопустимых значений)
                
    function submissionTag($id, $action, $method = 'post', $ref='',
                           $instance = '', $replace = ''){
        $this->check('submission');
        if(($instance != '' || $replace != '') &&
           $replace != '' && $instance != '')
            throw new Exception("instance or replace is set, but not both ".
                                "in a submission tag!");
        $xml = '<xforms:submission id="'.$id.'" action="'.$action.
            '" method="'.$method.'"';
...
    }
	

При использовании функции submissionTag можно вводить один из двух входных параметров ($instance или $replace), но при этом только один из них, а не оба сразу. При использовании этой функции в случае обнаружения недопустимого значения пользователю будет выведено соответствующее сообщение.

Этот же принцип используется и в остальных четырех функциях (как показано в листинге 7).


Листинг 7. Дополнительные функции, отображающие соответствующие уведомления при вводе недопустимых данных
                

    function bindTag($nodeset, $relevant = '', $calculate = '',
                     $required = ''){
        $this->check('bind');
        if($relevant == '' && $calculate == '' && $required == '')
            throw new Exception("Must set one of: relevant, calculate or ".
                                "required in a bind tag!");
        $xml = '<xforms:bind nodeset="'.$nodeset.'"';
...
    }

    function loadTag($resource = '', $ref = '', $show='replace'){
        $this->check('load');
        if($resource != '' && $ref != '')
            throw new Exception("Cannot specify both a resource and ref ".
                                "for the load tag!");
        else if($resource == '' && $ref == '')
            throw new Exception("Must specify one of: resource or ref ".
                                "for the load tag!");
        $xml = '<xforms:load show="'.$show.'"';
...
    }

    function select1Tag($ref, $label, $itemArray, $itemset){
        $this->check('select1');
        if(is_array($itemArray) && is_array($itemset))
            throw new Exception("Cannot specify both a list of items ".
                                "and an itemset for a select1 element!");
        else if(!is_array($itemArray) && !is_array($itemset))
            throw new Exception("Must specify one of: itemArray or itemset ".
                                "as arrays in the select1 tag!");
        $xml = '<xforms:select1 ref="'.$ref.'">';
        $xml .= '<xforms:label>'.$label.'</xforms:label>';
...
    }

    function instanceTag($id = '', $instanceXML = '', $src = ''){
        $this->check('instance');
        if($instanceXML != '' && $src != '')
            throw new Exception("Must define instance data or a src URL ".
                                "for the instance tag!");
        $xml = '<xforms:instance';
...
    }

Обратите внимание на то, что для функции bindTag должен быть передан один из следующих параметров: $relevant, $calculate или $required. При использовании функции loadTag ее два параметра ($resource и $ref) не могут быть заданы одновременно (обязательно должен быть задан только один из двух). При использовании функции select1Tag необходимо использовать один из двух входных параметров: $itemArray или $itemset (но не оба сразу). И наконец, при использовании функции instanceTag необходимо, чтобы был задан хотя бы один из параметров ($instanceXML или $src).

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

Вспомогательные функции

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

Вначале нам предстоит ввести еще несколько переменных класса, как показано в листинге 8.


Листинг 8. Дополнительные переменные класса
                
    var $allowed;
    var $print;
    var $indentation;
    var $indentationValue;
    
    function xforms_lib($ns, $nsxforms, $nsevents){
...
        $this->namespaceEvents = $nsevents;
        $this->print = 0;
        $this->indentation = 0;
        $this->indentationValue = "    ";
        $this->allowed =
...
    }

Дополнительные три переменные будут использоваться при форматировании выводимых данных XHTML. С помощью переменной $print определяется, необходимо ли выводить XHTML (с помощью выражения echo) непосредственно в браузер, используя для этого функцию printData, которая будет определена ниже. Переменная $indentation используется для указания количества отступов, которые будут добавлены перед строкой кода при обращении к функции indentation (приведенной ниже), а в переменной $indentationValue содержатся символы, которые будут использоваться в качестве отступа (в нашем случае в переменной $indentationValue содержатся четыре пробела).

Сейчас нам предстоит создать несколько функций, одна из которых будет устанавливать значение $print, а другие – увеличивать и уменьшать величину отступа (т.е. изменять значение переменной $indentation), как показано в листинге 9.


Листинг 9. Функции, предназначенные для изменения значений переменных $indentation и $print
                
    function incrementIndentation(){
        $this->indentation++;
    }

    function decrementIndentation(){
        $this->indentation--;
    }

    function setPrint($p){
        if($p)
            $this->print = 1;
        else
            $this->print = 0;
    }

Первые две функции увеличивают и уменьшают значение переменной $indentation (обнуленной изначально в конструкторе), а третья переменная устанавливает значение переменной $print. При этом $print принимает значение 1, если выполняется условие ввода переменной, и 0 - если нет.

В листинге 10 представлена функция, вставляющая отступ перед строкой кода.


Листинг 10. Вставка отступа
                
    function indentation(){
        $xml = '';
        for($i = $this->indentation; $i > 0; $i--)
            $xml .= $this->indentationValue;
        return $xml;
    }

Количество итераций в цикле данной функции равно значению переменной $indentation, при этом на каждой итерации происходит прибавление значения переменной $indentationValue к $xml, после чего функция выводит это накопленное значение в качестве результата. Например, если значение $indentation было 2, то в переменной $xml будет накоплено восемь пробелов, которые и будут выведены данной функцией в качестве результата. Эта функция вместе с функциями decrementIndentation и incrementIndentation используется для придания коду XHTML определенного формата с целью его более удобного отображения.

В листинге 11 представлена функция printData, с помощью которой отображается код XHTML.


Листинг 11. Отображение кода XHTML
                
    function printData($xml){
        if($this->print){
            echo $this->indentation();
            echo $xml."\r\n";
            return 0;
        }
        return 1;
    }

В конце каждой функции происходит вызов функции printData. В зависимости от значения переменной класса $print данные XHTML будут либо возвращены функцией, либо отображены браузером. Добавьте эту функцию во все функции, которые используются для создания тегов, как показано в листинге 12. Добавьте функцию incrementIndentation ко всем функциям tagOpen, а функцию decrementIndentation ко всем функциям tagClose.


Листинг 12. Использование функций printData, incrementIndentation и decrementIndentation.
                
    function submissionTag($id, $action, $method = 'post', $ref='',
                           $instance = '', $replace = ''){
        $this->check('submission');
...
            $xml .= ' replace="'.$replace.'"';
        $xml .= " />";
        $this->printData($xml);
        return $xml;
    }

    function triggerTagOpen($ref, $submission = '', $label = 'default'){
        $this->check('trigger', 'open');
        $xml = '<xforms:trigger ref="'.$ref.'"';
        if($submission != '')
            $xml .= ' submission="'.$submission.'"';
        $xml .= ' >';
        $this->incrementIndentation();
        $this->printData($xml);
        return $xml;
    }

    function triggerTagClose(){
        $this->check('trigger', 'close');
        $xml = '</xforms:trigger>';
        $this->decrementIndentation();
        $this->printData($xml);
        return $xml;
    }

Здесь в листинге 12 вы можете увидеть использование в каждой функции выражения $this->printData. Обратите внимание на то, что даже если данные уже отображаются браузером с помощью вызова printData, то данные XHTML все равно будут возвращены функции, которая использовалась для вызова данной функции. Обратите внимание также на то, как в функции triggerTagOpen используется функция incrementIndentation. Как мы видим, каждая строка кода, которая находится после открытого тега trigger, будет иметь дополнительный отступ до того момента, когда тег trigger не будет закрыт вызовом функции triggerTagClose. При этом перед вызовом функции triggerTagOpen величина отступа (выражаемая в количестве пробелов) будет уменьшена до исходного значения.

Добавьте также выражение $this->printData($xml); в соответствующую позицию остальных функций (вы можете воспользоваться исходным кодом, чтобы посмотреть, куда именно необходимо добавить). Также добавьте выражение $this->decrementIndentation(); во все функции tagClose и выражение $this->incrementIndentation(); во все функции tagOpen (можете воспользоваться листингом 12 и исходным кодом, чтобы посмотреть, куда именно необходимо добавить).

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


Листинг 13. Вспомогательные функции
                
    function doctypeTag(){
        $xml = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">';
        $this->printData($xml);
        return $xml;
    }

    function headTitle($title){
        $xml = "<head><title>$title</title>";
        $this->printData($xml);
        return $xml;
    }

    function closeHeadOpenBody(){
        $xml = "</head><body>";
        $this->printData($xml);
        return $xml;
    }

    function closeBodyCloseHtml(){
        $xml = "</body></html>";
        $this->printData($xml);
        return $xml;
    }

    function outputXHTMLheader(){
        header("Content-Type: application/xhtml+xml; charset=UTF-8");
    }

В следующем разделе для тестирования библиотеки XForms мы создадим форму. При ее разработке мы будем использовать все представленные выше функции. С их помощью будут создаваться теги и выводиться заголовки формата XHTML.



В начало


Создание формы с помощью библиотеки XForms, написанной на PHP

Настало время убедиться в удобстве использования библиотеки XForms. В данном разделе будут созданы несколько виджетов XForms, на примере которых будет показано использование библиотеки (при этом будет задействован плагин Firefox XForms).

Взгляните на начальный код новой страницы index, представленный в листинге 14.


Листинг 14: Начальный код страницы index
                
<?php
include('lib/xforms_lib.php');
$xformsDoc = new xforms_lib("http://www.w3.org/1999/xhtml",
                            "http://www.w3.org/2002/xforms",
                            "http://www.w3.org/2001/xml-events");

$xformsDoc->setPrint(1);

$xformsDoc->outputXHTMLheader();

$xformsDoc->doctypeTag();

$xformsDoc->htmlTag();
$xformsDoc->incrementIndentation();

$xformsDoc->headTitle('XForms served via PHP');

...

?>

В первой строке мы указываем на использование библиотеки в нашем файле PHP, присваиваем значение новому классу xforms_lib и передаем три пространства имен. Затем мы присваиваем переменной класса $print значение 1, сообщая библиотеке о том, что необходимо непосредственно приступать к выводу XHTML. После этого создается документ XHTML (путем вывода соответствующих заголовков, типа документа, тега HTML и названия).

Далее в листинге 15 вы увидите, как с помощью библиотеки создается модель XForms.


Листинг 15. Создание модели XForms
                
...

// начало отображения модели

$model1 = 'model';
$instance1 = 'instance';
$instance1data = '<root xmlns=""><data1>../here</data1><data2/>'.
    '<data3/><data4/><data5/></root>';
$instance2 = 'instance2';
$instance2data = '<root xmlns=""><data><datum>data1</datum>'.
    '<datum>d2</datum><datum>third data</datum></data>
	             </root>';
$submitButton1 = 'submit1';
$submitButton2 = 'submit2';

$xformsDoc->setTag('root');

$xformsDoc->modelTagOpen($model1);
$xformsDoc->setTag('model');
$xformsDoc->incrementIndentation();

$xformsDoc->instanceTag($instance1, $instance1data);

$xformsDoc->instanceTag($instance2, $instance2data);

$xformsDoc->submissionTag($submitButton1,
                          "receive.php", 'post', "instance('$instance1')");

$xformsDoc->submissionTag($submitButton2,
                          "receive.php", 'post', "instance('$instance2')");

$xformsDoc->bindTag("instance('$instance1')/data4",
                    "instance('$instance1')/data3='1'",
                    "instance('$instance1')/data2");

$xformsDoc->modelTagClose();
$xformsDoc->setTag('root');
$xformsDoc->decrementIndentation();

...

В первых нескольких строках файла PHP представлены переменные, содержащие имена модели, экземпляра класса и элементов, с помощью которых отправляются данные. Также определяются две копии данных документа XML. Затем происходит инициализация переменной класса $tag, которой присваивается значение 'root' путем вызова функции setTag.

Теперь все готово для открытия тега model, что и происходит в следующей строке. Опять используется переменная $tag, которая теперь принимает значение 'model' (поскольку только что был открыт тег model, и тег root уже не является тегом верхнего уровня). При этом также необходимо увеличить отступ, для чего вызывается функция incrementIndentation.

Далее приписываются значения двум экземплярам документов, после чего следуют два тега submission. Они оба будут использоваться для перенаправления с помощью метода POST одного из двух экземпляров документа странице receive.php, которую вы создали в первой части данной статьи. Также создается тег bind, с помощью которого осуществляется привязка поля data4 к data2 (значение которого соответствует параметру calculate), а значение поля data3 (передаваемое в качестве параметра relevant) делает значимым поле data4. Наконец, тег model закрывается, $tag опять принимает значение 'root', а отступ уменьшается.

Теперь мы можем приступить к созданию тела документа XHTML, как показано в листинге 16.


Листинг 16. Использование функций inputTag и outputTag
                
...

$xformsDoc->closeHeadOpenBody();
$xformsDoc->incrementIndentation();

// начало отображения формы

$xformsDoc->inputTag("instance('$instance1')//data1",
                     'data1 (new page input): ');
echo "<br />";
$xformsDoc->inputTag("instance('$instance1')//data2",
                     'data2 (data4 is bound to this field): ');
echo "<br />";
$xformsDoc->inputTag("instance('$instance1')//data3",
                     'data3 (1 makes data4 relevant): ');
echo "<br />data4 (bound to data2): ";
$xformsDoc->outputTag("instance('$instance1')//data4");
echo "<br />data5 (value of select menu shown here): ";
$xformsDoc->outputTag("instance('$instance1')//data5");
echo "<br />";

...

Вначале закрывается тег заголовка XHTML и открывается тег основной части документа. Затем создаются три тега input, в каждом из которых идет обращение к полям $instance1: data1, data2 и data3 соответственно. После этого создаются два тега output, в каждом из которых идет обращение к полям $instance1: data4 и data5 соответственно.

Изменяя эти значения в форме, вы можете убедиться в том, что привязка элементов, созданная в листинге 15, работает именно так, как ожидается.

Далее нам необходимо определить тег select1, как показано в листинге 17.


Листинг 17. Определение тега select1
                
...

$itemset['nodeset'] = "instance('$instance2')//datum";
$itemset['label'] = '.';
$itemset['value'] = '.';
$xformsDoc->select1Tag("instance('$instance1')//data5", 'select me',
                       '', $itemset);
echo "<br />";

...

Вначале в качестве значения массива $itemset мы устанавливаем nodeset, содержащий все элементы из $instance2. Затем тегу select1 приписывается значение и происходит обращение к полю data5 (принадлежащему $instance1). Обратите также внимание на то, что изменяя значение тега select1, вы тем самым будете изменять значение второго тега output, определенного в листинге 16.

Далее нам предстоит определить две кнопки submit. С помощью этих двух кнопок мы сможем увидеть настоящий код XML каждого объекта (листинг 18).


Листинг 18. Определение кнопок submit
                
...

$xformsDoc->submitTag($submitButton1, 'SubmitTextBoxes');
echo "<br />";

$xformsDoc->submitTag($submitButton2, 'SubmitSelect');
echo "<br />";

...

Изменяя значения в текстовых полях и в выпадающем списке select1, нажимая после этого на подписанные соответствующим образом кнопки, вы можете выводить код XML.

Теперь нам предстоит рассмотреть пример использования тега trigger, как показано в листинге 19.


Листинг 19. Пример использования тега trigger
                
...

$xformsDoc->triggerTagOpen("instance('$instance1')//data1", '', 'new page');
echo "<br />";
$xformsDoc->setTag('trigger');

$xformsDoc->actionTagOpen("DOMActivate");
$xformsDoc->setTag('action');

$xformsDoc->loadTag('', "instance('$instance1')/data1",
                    'new');

$xformsDoc->actionTagClose();
$xformsDoc->setTag('trigger');

$xformsDoc->triggerTagClose();
$xformsDoc->setTag('root');

...

Здесь мы создаем тег trigger с названием 'new page.' После его открытия мы присваиваем переменной $tag значение 'trigger', а внутри тега trigger мы создаем тег action, активируемый при возникновении события DOMActivate. После того как внутри данного тега мы установили 'action' в качестве значения тега $tag, мы создадим тег load, с помощью которого будет производиться загрузка новой страницы, основанной на значении поля data1. (Вы можете самостоятельно посмотреть на изменение выводимых результатов, вводя различные значения в поле data1 и вызывая событие, на которое реагирует код из тега trigger). Наконец, мы закрываем теги action и trigger и присваиваем исходное значение root переменной $tag.

Последний тег repeat, который нам предстоит проверить в работе, представлен в листинге 20.


Листинг 20. Создание тега repeat
                
...

echo "<br/>repeat data:";
$xformsDoc->repeatTagOpen("instance('$instance2')//datum", 'id1');
$xformsDoc->setTag('root');

$xformsDoc->outputTag(".");

$xformsDoc->setTag('repeat');
$xformsDoc->repeatTagClose();
$xformsDoc->setTag('root');

$xformsDoc->decrementIndentation();
$xformsDoc->decrementIndentation();
$xformsDoc->closeBodyCloseHtml();

?>

Здесь мы указываем все дочерние объекты $instance2 в качестве содержимого тега repeat. Поскольку repeat является эквивалентом root (при добавлении новых элементов), то мы устанавливаем 'root' в качестве значения $tag. Затем с помощью тега output мы отображаем текущее содержимое кода XML. Перед закрытием тега repeat переменная $tag принимает значение 'repeat', а после закрытия тега repeat переменная $tag принимает значение root.

После создания всех тегов XHTML XForms документ XHTML закрывается, при этом в 2 раза уменьшается отступ и закрываются теги body и html.

На рисунке 1 вы можете увидеть, как выглядит полученная форма.


Рисунок 1. Полученная форма
Рисунок 1. Полученная форма

Не забудьте щелкнуть правой кнопкой мыши по отображаемой XHTML-странице, чтобы убедиться в правильности вывода кода XHTML вашим PHP-кодом (рисунок 2).


Рисунок 2. Просмотр правильности форматирования полученного кода
Рисунок 2. Просмотр правильности форматирования полученного кода

Попробуйте немного поработать с формой и с виджетами XForms, которые вы создали с помощью PHP.



В начало


Заключение

Поделитесь ссылкой на данную статью...

digg Digg this story
del.icio.us Post to del.icio.us
Slashdot Slashdot it!

Поздравляю! Теперь у вас есть надежная библиотека XForms, написанная на PHP, которую вы можете использовать и продолжать развивать. Как видите, библиотеку и определенные теги XHTML XForms нельзя назвать полностью завершенными. В эту библиотеку все еще можно вносить дополнения и улучшать ее возможности по обработке различных ошибок. Например, вы можете добавить несколько новых функций, с помощью которых будут определяться новые теги XHTML XForms и т.д. На самом деле возможности по улучшению безграничны. Целый проект с открытым исходным кодом не может быть сосредоточен на решении только одной простой задачи, которую мы начали рассматривать в первой части данной статьи. Надеюсь, вы получили удовольствие от знакомства с PHP и XForms. Удачи!




В начало


Загрузка

ОписаниеИмяРазмерМетод загрузки
Пример кода (часть 2)code_part2.zip4 КБHTTP
Информация о методах загрузки


Ресурсы

Научиться
  • Оригинал статьи - «Use PHP to create XForms, Part 2: Using the PHP XForms library to create useful XForms» (EN).

  • Прочтите статью «Creating an XForms-based logo generator» (EN), чтобы узнать больше об интеграции XForms и изображений с помощью SVG.

  • Прочтите обзорную статью о XForms «Introduction to XForms, Part 1: The new Web standard for forms» (автор Крис Герборс, developerWorks, сентябрь 2006).

  • Изучите руководство по PHP (EN).

  • Посетите сайт PHP.NET (EN), на котором вы можете найти всю необходимую документацию по PHP.

  • Если вам необходимы руководства для изучающих PHP, вы можете их найти, выполнив поиск статей серии «Learning PHP» (EN) на сайте developerWorks.

  • Чтобы узнать больше о PHP, посетите раздел PHP project resources (EN) сайта IBM developerWorks.

  • Прочтите статью «XForms tip: Using form submission events» (EN), чтобы узнать больше о событиях XForms (автор Николас Чейз, developerWorks, ноябрь 2006).

  • Узнайте как обрабатывать данные XForms с помощью Java (EN) (автор Николас Чейз, developerWorks, октябрь 2006), Perl (EN) (автор Тайлер Андерсон, developerWorks, октябрь 2006) и PHP (автор Николас Чейз, developerWorks, октябрь 2006).

  • Посетите сайт IBM XML certification (EN), на котором вы узнаете, как пройти сертификацию по XML и смежным технологиям.

  • Посетите сайт технической библиотеки XML , на котором вы сможете найти большое количество технических статей, руководств, советов по использованию, стандартов и литературы IBM серии «Redbooks».

  • Будьте всегда в курсе событий с помощью сайта технических мероприятий и Web-трансляций developerWorks (EN).

  • В разделе XML на сайте developerWorks вы можете получить больше информации о XForms.


Получить продукты и технологии
  • Загрузите PHP V 5.2.3 (EN).

  • Загрузите плагин Firefox XForms (EN).

  • Рекомендация XForms (EN) поддерживается консорциумом W3C (EN).

Обсудить


Об авторе

Тайлер Андерсен (Tyler Anderson) получил степень бакалавра вычислительной техники в 2004 и степень магистра электротехники и проектирования ЭВМ компьютеров в 2005 в Brigham Young University. С мая 2005 по август 2006 года Тайлер работал в корпорации Stexar на должности инженер-разработчик, пока Stexar не закрылась. С начала сотрудничества Тайлера с Backstop Media LLC в начале 2005 года им было написано множество статей и обучающих руководств для IBM developerWorks и DevX.




Выскажите мнение об этой странице


Пожалуйста, найдите минутку и заполните форму, чтобы повысить уровень сервиса.



 


 


 


Поделиться этой статьей:

забобрить забобрить memori сохранить в memori




В начало


IBM обладает всеми авторскими правами касательно информации, расположенной на developerWorks. Использование информации приведенной на этом ресурсе без явного письменного разрешения от IBM или первоначального автора запрещены. Если Вы желаете использовать информацию с developerWorks, пожалуйста воспользуйтесь регистрационной формой для того, чтобы связаться с нами запрос на использование материалов developerWorks Россия.
    IBM в России Конфиденциальность Контакты