Учебное пособие (1075724), страница 43
Текст из файла (страница 43)
В основном запросе читаются возможные HTTP-параметры,по ним производится ветвление с помощью вложенных операторов IF ивызываются необходимые функции обработки данных (добавление, удаление ит.д.).(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Основной запрос :)407(: ++++++++++++++++++++++++++++++++++++++++++++++ :)let$newParam := xs:string(request:get-parameter("new","0")),$saveParam := xs:string(request:get-parameter("save","0")),$idParam := xs:string(request:get-parameter("id","0")),$nameParam := xs:string(request:getparameter("processor_name","0")),$deleteidParam := xs:string(request:getparameter("deleteid","0")),$listParam := xs:string(request:get-parameter("list","0")),$DataListURI := xrx_example:PathURI_list($module_id, $module_ver)Чтение HTTP-параметров и сохранение во временные переменные.returnif($saveParam = '1')(: Сохранение данных :)then(local:SaveData($idParam, $nameParam, $DataListURI))Если был передан HTTP-параметр «save=1», то читаются HTTP-параметры,переданныеизHTML-формыредактирования«id=id процессора»и«processor_name=наименование процессора» и вызывается функция сохраненияданных.else if($deleteidParam != '0')(: Удаление данных :)then(local:DeleteData($deleteidParam, $DataListURI))Если был передан HTTP-параметр «deleteid=id удаляемого процессора», товызывается функция удаления данных.else if($listParam = '1')(: Выборка данных из справочника с сортировкой по наименованию :)then408(for $data in doc(xrx_example:ProcessorsFileName())//processororder by $data/processor_namereturn $data)Если был передан HTTP-параметр «list=1», то процессоры возвращаются ввиде множества элементов processor с сортировкой по наименованию процессора.Этот вызов используется для получения списка процессоров в модулекомпьютера.else ()(: ++++++++++++++++++++++++++++++++++++++++++++++ :)Локальные функции:(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Создание элемента данных для процессора :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function local:NewData($idParam as xs:string, $nameParam asxs:string) as node(){<processor id="{$idParam}"><processor_name>{$nameParam}</processor_name></processor>};Функция формирует XML-элемент, соответствующий процессору, на основепереданных параметров: id процессора и наименование процессора.(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Сообщения об ошибках :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function local:CheckErrors($nameParam as xs:string) asnode()*{if(string-length(normalize-space($nameParam)) = 0)then (<p>Наименование не может быть пустой строкой</p>)else ()409};Если название процессора не было введено, то функция возвращаетсообщение об ошибке в виде элемента <p>, иначе возвращает пустое множествоузлов.(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Сохранение данных :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function local:SaveData($idParam as xs:string, $nameParam asxs:string, $DataListURI as xs:string) as node()*{let$Errors := local:CheckErrors($nameParam)returnif(count($Errors) != 0)(: Сообщения об ошибках :)then(xrx_example:ShowErrorReturnForm($module_id, $module_ver, "Ошибкапри сохранении данных", $Errors))В переменную $Errors сохраняются сообщения об ошибках.
Если количествоошибок больше нуля, то выводится сообщение об ошибках с помощью функцииxrx_example:ShowErrorReturnForm().(: Сохранение данных :)else((Если ошибок не выявлено, то производится сохранение данных.if($idParam = 'new')then(: Добавление данных :)(let$newDataId := xrx_example:MakeUniqueName(),410$newData:= local:NewData($newDataId, $nameParam)returnupdate insert $newData intodoc(xrx_example:ProcessorsFileName())//processors)Еслидобавляютсяновыеданные,тоспомощьюфункцииxrx_example:MakeUniqueName() генерируется уникальный идентификатор новогоэлемента и сохраняется в переменную $newDataId. С помощью функцииlocal:NewData генерируется новый элемент processor и сохраняется в переменную$newData.
Далее с помощью команды добавления данных «update insert $newDatainto doc(xrx_example:ProcessorsFileName())//processors» производится добавлениесгенерированного элемента (который хранится в переменной $newData) в XMLфайл,содержащийинформациюопроцессорах.Функцияxrx_example:ProcessorsFileName() возвращает название файла с информацией опроцессорах, функция doc() загружает файл, после этого в файле осуществляетсяпоиск элемента //processors, в который и добавляется новый элемент processor изпеременной $newData.Конструкция «update insert» (несколько непривычная с точки зрения SQL)добавляет один XML-элемент внутрь другого XML-элемента.else(: Обновление данных :)(let$newData:= local:NewData($idParam, $nameParam)returnupdate replacedoc(xrx_example:ProcessorsFileName())//processor[@id=$idParam] with$newDataЕсли данные о процессоре уже существовали, то с помощью команды «updatereplace» существующий элемент processor замещается новым элементом.С помощью этой команды можно было бы замещать только названиепроцессора.
Но для того, чтобы сделать добавление и редактирование «почти411одинаковыми» действиями, в обоих случаях элемент processor генерируетсязаново с помощью функции local:NewData (на основе id процессора и названияпроцессора) и в одном случае добавляется в XML-файл, а в другом случаезамещает существующий в XML-файле элемент processor.)),((: После успешного добавления или обновления данных переход ксписку :)xrx_example:redirect($DataListURI)После успешного добавления или обновления данных с помощью функцииxrx_example:redirect() осуществляется перенаправление на XQuery-сценарий,реализующий вывод списка процессоров.При этом у пользователя возникает ощущение, что он после редактированияданных вернулся в список данных, в котором отображается отредактированноезначение. Промежуточный вызов сценария сохранения данных для пользователянезаметен.))};Перед удалением процессора из справочника необходимо проверить, что онне используется при описании компьютеров.(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Сообщения об ошибках :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function local:CheckDeleteErrors($deleteidParam asxs:string) as node()*{(: Проверка того, что удаляемый тип процессора не используется вкомпьютерах :)let$ComputersList :=collection(xrx_example:PathURI_data_list_in_db($module_computer_id)),412$cnt := count($ComputersList//computer[processor_id =$deleteidParam])Определение количества компьютеров, в которых используется удаляемыйпроцессор.returnif($cnt > 0)then (<p>Этот тип процессора не может быть удален, так как ониспользуется при описании {$cnt} компьютера(ов)</p>)else ()Если это количество больше 0, то формируется сообщение об ошибке.};(: ++++++++++++++++++++++++++++++++++++++++++++++ :)(: Удаление данных :)(: ++++++++++++++++++++++++++++++++++++++++++++++ :)declare function local:DeleteData($deleteidParam as xs:string,$DataListURI as xs:string) as node()*{let$Errors := local:CheckDeleteErrors($deleteidParam)returnif(count($Errors) != 0)(: Сообщения об ошибках :)then(xrx_example:ShowErrorReturnList($module_id, $module_ver, "Ошибкапри удалении данных", $Errors))Если процессор используется при описании компьютеров, то его нельзяудалять, выводится сообщение об ошибке.(: Удаление данных :)else((413let $del :=doc(xrx_example:ProcessorsFileName())//processor[@id=$deleteidParam]return update delete $delИначе с помощью команды «update delete» элемент processor удаляется изXML-файла.),((: После удаления данных переход к списку :)xrx_example:redirect($DataListURI)ПослеэтогоосуществляетсяперенаправлениенаXQuery-сценарий,реализующий вывод списка процессоров.))};7.3.5.4.4 Взаимодействие между сценариями справочника «Тип процессора»Взаимодействие между сценариями справочника покажем с помощьюдиаграммы состояний (statechart diagram) в нотации UML.Состоянию соответсвует XQuery-сценарий, переходу – HTTP-запрос.Здесь предполагается, например, что XQuery-сценарий, отображающийсписок данных, полностью отработает, выведет в браузер сгенерированныйHTML-документ, который будет содержать кнопку добавления нового элемента.Если пользователь нажимает эту кнопку, то происходит HTTP-запрос к сценариюдобавления (редактирования) данных.
Этому HTTP-запросу соответствуетпереход из состояния «список данных» в состояние «редактирование данных».Над стрелкой перехода указано выполняемое действие и параметры HTTPзапроса.4143. Отменить редактирование (добавление)1. Добавить новый элементHTTP-параметр:new=1list_processor.xql8. Успешноесохранение(удаление)6. УдалитьHTTP-параметр:deleteid=id удаляемогопроцессора7. Отменитьудаление(если процессориспользуетсяпри описаниикомпьютеров)edit_processor.xql2. РедактироватьHTTP-параметр:id=id процессора4. СохранитьHTTP-параметры:save=1, id=id процессора,processor_name=название процессора5. Отменитьсохранение(в случае ошибокввода данных)data_processor.xql9. Вернуть списокпроцессоровHTTP-параметр:list=1Модуль«компьютер»Рис. 7.8. Взаимодействие между сценариями справочника «Тип процессора».Переход из начального состояния диаграммы осуществляется на сценарий«list_processor.xql», так как пользователь начинает работу со справочникомпроцессоров со списка данных.Также из этого сценария осуществляется переход на конечное состояние.Этому переходу соответствует кнопка «Вернуться в главное меню».415В случае нажатия кнопки добавления нового элемента (1) осуществляетсявызов сценария редактированияпередаетсяHTTP-параметрэлемента «edit_processor.xql».
При«new=1».Получивэтотпараметр,этомсценарий«edit_processor.xql» отображает пустую форму ввода данных.В случае нажатия кнопки редактирования элемента (2) также осуществляетсявызов сценария редактированияэлемента «edit_processor.xql». Приэтомпередается HTTP-параметр «id=id редактируемого процессора». Получив этотпараметр, сценарий «edit_processor.xql» на основе параметра id читает данные изБД и отображает форму редактирования данных, которая заполнена даннымиредактируемого процессора.В случае нажатия в форме редактирования (добавления) кнопки «Отменить»(3) осуществляется возврат в список данных.В случае нажатия в форме редактирования (добавления) кнопки «Сохранить»(4) осуществляется вызов сценария для работы с данными «data_processor.xql».Ему передаются следующие параметры HTTP-запроса: «save=1» – признаксохранения данных, «id=id сохраняемого процессора» (в случае добавлениянового элемента вместо id сохраняемого процессора передается значение «new»,этоявляетсяпризнакомдобавленияданных),«processor_name=название сохраняемого процессора».Если данные введены неправильно (например, не задано названиепроцессора), то выводится сообщение об ошибке и происходит возврат в формуредактирования (5).Если данные введены правильно, то после сохранения данных в БДосуществляется переход в форму списка (8).Если в форме списка «list_processor.xql» нажата кнопка удаления данных (6),то осуществляется вызов сценария «data_processor.xql».
Ему передается параметрHTTP-запроса«deleteid=id удаляемого процессора».Далеепроверяетсявозможность удаления данных. Если процессор с указанным id используется приописании компьютеров, то выводится сообщение об ошибке и происходит возврат416в форму списка (7). Если ошибок нет, то после удаления данных такжеосуществляется переход в форму списка (8).Сценарий «list_processor.xql» также может вызываться из сценариев модуля«компьютер» с параметром «list=1» для получения списка процессоров (9).7.3.5.5 Справочник «Компьютер»Так как справочник содержит несколько полей ввода, то будем использоватьвариант архитектуры II, то есть технологию XForms.Для реализации справочника необходимо разработать три сценария: list_computer_1.1.xql – список компьютеров (вид). edit_computer_1.1.xql – редактирование данных о компьютере (вид). data_computer_1.1.xql – редактирование данных (контроллер).7.3.5.5.1 Сценарий list_computer_1.1.xqlСценарий предназначен для вывода списка компьютеров и кнопокдобавления, редактирования, удаления.















