Учебное пособие (1075724), страница 47
Текст из файла (страница 47)
Переменная сценария $current_data хранитназвание сессионной переменной.let$PostData := request:get-data(),Чтение данных из HTTP-запроса.$Data := fn:root($PostData)//computerФункция fn:root возвращает корневой элемент XML-данных, далее поискэлемента computer.returnsession:set-attribute($current_data, $Data)Сохранение в сессионной переменной.};(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Удаление данных :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function local:DeleteData($deleteidParam as xs:string,$DataListURI as xs:string) as node()*{xrx_example:DeleteFileInCollection(xrx_example:PathURI_data_list_in_db($module_id), $deleteidParam),xrx_example:redirect($DataListURI)При удалении данных о компьютере происходит удаление файла изсоответствующей коллекции БД.};7.3.5.5.4 Взаимодействие между сценариями справочника «Компьютер»4457.
Отменить редактирование (добавление)1. Добавить новый компьютерHTTP-параметр:new=1list_computer.xqldata_processor.xql6. Вернуть списокпроцессоровHTTP-параметр:list=1edit_computer.xql2. РедактироватьHTTP-параметр:id=id компьютера3. Вернуть данные оновом компьютереHTTP-параметр:new=14. Вернуть данные оредактируемомкомпьютереHTTP-параметр:id=id компьютера5.
Вернуть данные оновой модернизациикомпьютераHTTP-параметр:newupgrade=111. Успешноесохранение(удаление)8. ПредварительноесохранениеHTTP-параметры:presave=1,XML-данные формы9. СохранениеHTTP-параметр:save=112. УдалитьHTTP-параметр:deleteid=id компьютера10. Отменасохранения(в случае ошибокввода данных)data_computer.xqlРис. 7.11. Взаимодействие между сценариями справочника «Компьютер».Переход из начального состояния диаграммы осуществляется на сценарий«list_computer.xql», так как пользователь начинает работу со справочникомкомпьютеров со списка данных.Также из этого сценария осуществляется переход на конечное состояние.Этому переходу соответствует кнопка «Вернуться в главное меню».В случае нажатия кнопки добавления нового элемента (1) осуществляетсявызов сценарияредактированияэлемента «edit_computer.xql».Приэтомпередается HTTP-параметр «new=1».446В случае нажатия кнопки редактирования элемента (2) также осуществляетсявызов сценарияредактированияэлемента «edit_computer.xql».Приэтомпередается HTTP-параметр «id=id редактируемого компьютера».Получив этот параметр, сценарий «edit_computer.xql» генерирует XFormsформу ввода (редактирования) данных.
В обоих случаях XForms-формаобращается к сценарию «data_computer.xql» для чтения данных.В случае добавления нового компьютера (3) сценарию «data_computer.xql»передается HTTP-параметр «new=1», и сценарий возвращает незаполненныйXML-элемент для ввода нового компьютера.Вслучаередактированияданныхокомпьютере(4)сценарию«data_computer.xql» передается HTTP-параметр «id=id компьютера», и сценарийвозвращает данные о компьютере.Для получения незаполненного элемента «upgrade», который используетсяпри добавлении данных о модернизации компьютера, (5) XForms-форма вызываетсценарий «data_computer.xql» с HTTP-параметром «newupgrade=1».Для получения списка процессоров (6) XForms-форма обращается к модулю«тип процессора», вызывая сценарий «data_processor.xql» с HTTP-параметром«list=1».В случае нажатия в форме редактирования (добавления) кнопки «Отменить»(7) осуществляется возврат в список данных.В случае нажатия в форме редактирования (добавления) кнопки «Сохранить»сначала происходит асинхронная передача заполненной формы на сервер ипредварительное сохранение данных в переменной сессии (8).
Затем происходитсинхронный вызов сценария (9), при котором данные читаются из сессионнойпеременной, проверяются и сохраняются в БД.Если данные введены неправильно, то выводится сообщение об ошибке ипроисходит возврат в форму редактирования (10).Если данные введены правильно, то после сохранения данных в БДосуществляется переход в форму списка (11).447Если в форме списка «list_computer.xql» нажата кнопка удаления данных(12), то осуществляется вызов сценария «data_computer.xql». Ему передаетсяпараметр HTTP-запроса «deleteid=id удаляемого компьютера». После удаленияданных осуществляется переход в форму списка (11).7.3.5.6 Модуль формирования отчетаМодуль формирования отчета используется для ввода параметров отчета,формирования запроса к БД на основе параметров, получения данных и выводаданных в виде HTML.Рис.
7.12. Ввод параметров отчета.448Рис. 7.13. Сформированный отчет.В модуле формирования отчета также используется вариант архитектуры II,(технология XForms). Однако особенностью этого модуля является то, что всенеобходимые действия выполняет единственный XQuery-сценарий.Для реализации модуля необходимо разработать: report.xql – серверный XQuery-сценарий. report.xsl–XSLT-преобразование,котороеиспользуетсядляформатирования результирующих данных.7.3.5.6.1 Сценарий report.xqlСерверный сценарий для формирования отчета.449Пролог сценария:xquery version "1.0";(: Импорт стандартных модулей :)declare namespace request="http://exist-db.org/xquery/request";declare namespace session="http://exist-db.org/xquery/session";(: Импорт модулей приложения :)import module namespace xrx_example ="http://iu5.bmstu.ru/edu/xrx_example" at "module.xqm";(: Формат, в котором результат должен отображаться в браузере :)declare option exist:serialize "method=xhtml media-type=text/htmlindent=no";(: Идентификатор модуля :)declare variable $module_id {"report"};(: Версия модуля :)declare variable $module_ver {""};(: Для вызова модуля процессора :)declare variable $module_processor_id {"processor"};declare variable $module_processor_ver {"1.2"};(: Для вызова модуля компьютера :)declare variable $module_computer_id {"computer"};declare variable $module_computer_ver {"1.1"};(: Название сессионной переменной для хранения данных с параметрамиотчета :)declare variable $report_params_data {"report_params_data"};Основной запрос сценария:(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Основной запрос :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Если не заполнен справочник типов процессоров, то формированиеотчета невозможно :)if (xrx_example:ModuleDataCount($module_processor_id,$module_processor_ver) = 0)then450(: Вывод сообщения об ошибке :)(xrx_example:ShowErrorButton("Невозможно формирование отчета, таккак не заполнен справочник типов процессоров", "", ""))(: Если не заполнен справочник компьютеров, то формирование отчетаневозможно :)else if (xrx_example:ModuleDataCount($module_computer_id,$module_computer_ver) = 0)then(: Вывод сообщения об ошибке :)(xrx_example:ShowErrorButton("Невозможно формирование отчета, таккак не заполнен справочник компьютеров", "", ""))Формирование отчета возможно, только если заполнены справочники типовпроцессоров и компьютеров.else(: Выполнение основных действий :)(let$reportParam := xs:string(request:get-parameter("report","0")),$prereportParam := xs:string(request:getparameter("prereport","0")),$DataListURI := xrx_example:PathURI_list($module_id, $module_ver)Чтение HTTP-параметров и сохранение во временные переменные.returnif($reportParam = '1')(: Формирование отчета :)then(local:CheckErrorsAndMakeReport($DataListURI))Если был передан HTTP-параметр «report=1», то производится чтениепредварительносохраненныхпараметровизсессионнойпеременной,451выполняется проверка корректности ввода параметров.
Если параметры введеныкорректно, то формируется отчет.else if($prereportParam = '1')(: Сохранение условий для формирования отчета :)then(local:PreReport())Если был передан HTTP-параметр «prereport=1», то заполненные XMLданные из формы параметров отчета предварительно сохраняются в сессионнойпеременной.else(: Генерация формы ввода данных :)(local:ReportForm())Если сценарию не были переданы HTTP-параметры, то по умолчаниюсценарий генерирует XForms-форму ввода параметров отчета.)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Сообщения об ошибках при вводе параметров отчета :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function local:CheckReportErrors($Data as node()) as node()*{Функция осуществляет поиск ошибок в заполненных XML-данных формыпараметров отчета.В качестве параметра функция получает XML-элемент «report_params»,содержащий заполненные данные формы.Функция возвращает последовательность элементов «p», содержащихсообщение об ошибках.
Если ошибок нет, то последовательность пустая.(452(: Проверка диапазона имеет смысл, только если заданы оба значения:)if(($Data//op1 castable as xs:integer) and ($Data//op2 castable asxs:integer))Проверка для полей «минимальное и максимальное ограничение для объемаОП». Если оба элемента «op1» и «op2» можно привести к целому типу, тоосуществляется проверка, что минимальное значение диапазона («op1») меньшеили равно максимальному значению диапазона («op2»).Далее такая же проверка производится для минимального и максимальногозначения поля «Были модернизации в диапазоне».then(let$op1 := xs:integer($Data//op1),$op2 := xs:integer($Data//op2)returnif($op1 > $op2)then (<p>Минимальное ограничение для объема ОП должно бытьменьше или равно максимальному</p>)else ())else ()),((: Проверка диапазона имеет смысл, только если заданы оба значения:)if(($Data//upgrade_date1 castable as xs:date) and($Data//upgrade_date2 castable as xs:date))then(let$upgrade_date1 := xs:date($Data//upgrade_date1),$upgrade_date2 := xs:date($Data//upgrade_date2)returnif($upgrade_date1 > $upgrade_date2)453then (<p>Минимальное ограничение для даты модернизациидолжно быть меньше или равно максимальному</p>)else ())else ())};(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Проверка ошибок и формирование отчета :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function local:CheckErrorsAndMakeReport($DataListURI asxs:string) as node()*{let(: В сессионной переменной хранится строка, поэтому необходимосделать преобразование к элементу :)$TempData := element temp {session:getattribute($report_params_data)},$Data := $TempData//report_params,Данные читаются из сессионной переменной.Функция session:get-attribute возвращает значение сессионной переменной,параметром функции является название переменной.Поскольку функция session:get-attribute возвращает значение сессионнойперменной в виде строки, то для преобразования в XML-элемент используетсяконструкция element.$Errors := local:CheckReportErrors($Data)Поискошибокспомощьюприведеннойвышефункцииlocal:CheckReportErrors и сохранение в переменную $Errors.returnif(count($Errors) = 0)(: Формирование отчета :)then(454local:Report($Data)Если нет ошибок, то производится формирование отчета.)(: Сообщения об ошибках :)else(xrx_example:ShowErrorReturnForm("", "", "Ошибка при вводепараметров отчета", $Errors)В переменную $Errors сохраняются сообщения об ошибках.














