index.html
これまで患者リスト(patientList)や患者受診リスト(visitData)はJSON形式でしたがここではXML形式で取得する場合のプログラムを示します。最初にindex.htmlですが,これはJSON-Ajax版と変わりありません。<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> <meta http-equiv="Content-Security-Policy" content="default-src *; style-src * 'unsafe-inline'; script-src * 'unsafe-inline' 'unsafe-eval'"> <script src="components/loader.js"></script> <link rel="stylesheet" href="components/loader.css"> <link rel="stylesheet" href="css/style.css"> <script src="js/app.js"></script> <script> ons.bootstrap() </script> <style> .item, .detail-item { padding: 10px; line-height: 1; } .item-thum { background-color: #ccc; width: 50px; height: 50px; border-radius: 4px; } .item-id, .detail-item-id { font-size: 15px; font-weight: 500; } .item-name, .item-birthdate, .item-address, .detail-item-dept, .detail-item-diseaseName { font-size: 14px; color: #666; line-height: 1.3; margin: 4px 0 0 0; padding: 0 30px 0 0; } .item-gender { font-size: 12px; color: #999; float: right; } </style> </head> <body> <ons-navigator page="list.html" var="app.navi"></ons-navigator> </body> </html>
list.html
次に,患者一覧用のHTMLファイルであるlist.htmlですが,これもこれまでと同じで変わりありません。<ons-page id="list-page"> <ons-toolbar> <div class="center">Master Details</div> </ons-toolbar> <ons-list id="item-list"> </ons-list> </ons-page>次に,患者の受診一覧用のHTMLファイルであるdetail.htmlですが,これもこれまでと同じで変わりありません。
detail.html
<ons-page id="detail-page"> <ons-toolbar> <div class="left"><ons-back-button>Back</ons-back-button></div> <div class="center">Details</div> </ons-toolbar> <ons-list modifier="inset" style="margin-top: 10px"> <ons-list-item class="item"> <ons-row> <ons-col width="60px"> <div class="item-thum"> <img src="" class="item-thum-photo" width="50px"></img> </div> </ons-col> <ons-col> <header> <span class="item-id">id</span> <span class="item-gender">gender</span> </header> <p class="item-name">name</p> <p class="item-birthdate">birthdate</p> <p class="item-address">address</p> </ons-col> </ons-row> </ons-list-item> <ons-list-item modifier="chevron" id="add-note-action" class="add-note-action-item"> <ons-icon icon="ion-chatboxes" fixed-width="true" style="color: #ccc"></ons-icon> Add a note </ons-list-item> </ons-list> <ons-list id="detail-item-list" style="margin-top: 10px"> </ons-list> </ons-page>
app.js
次に,javascriptのプログラムを集めたapp.jsです。これはXML仕様に変更しなければなりません。 大きな修正点はAjaxでサーバからXML形式のデータを取得する関数getPatientList()とgetVisitData()です。 Ajaxのコールバック関数function(xml, status, error)は3つの引数を取りますが,その先頭の引数にXML形式のレスポンスデータが入っています。 JSON形式の場合と違ってパースする必要がありません。 XML形式のデータがそのまま返されます。 そこで,statusを確認してエラーでなければ大域変数(patientListやvisitData)に代入して画面レンダリングに利用できるようにします。 ただし,getVisitData()では,全患者の受診データが戻ってくるので,引数に指定された患者ID(patientId)に一致する患者の受診データのみ抽出して大域変数visitDataに設定している(108~112行目)ことに注意してください。XMLデータの場合,もう一つ注意しなければならないことがあります。 JSON形式の場合は,いったんパース(JSON.parse)してしまえばレスポンスメッセージをjavascriptオブジェクトとして利用できますが,XMLデータの場合はそうはいきません。 XMLデータをjQueryで扱う場合は$(XMLオブジェクト).find(タグ名).text()などとしてタグ要素のデータを取り出します。 また,属性値を取り出したい場合は$(XMLオブジェクト).find(タグ名).attr(属性名)とします。
下記のプログラム内の11行目~19行目がその処理です。ここでは、$(visitData).find('visit')によって患者受診一覧XMLデータ(このページの最後にあります)から、<visit>要素を取り出し、その一つ一つに対してhtmlの作成処理を行っています(.each(function(){ htmlの作成処理 })。その中ではXML要素が$(this)と表現されています。これは、.eachメソッドの無名関数内では、XMLデータから抜き取ったvisit要素の一つ一つを$(this)という変数で扱うことができるからです。
(function(){ 'use strict'; var currentItem = {}; var patientList = null; var visitData = null; $(document).on('pageinit', '#detail-page', function() { getVisitData(currentItem.id); var html = ''; $(visitData).find('visit').each(function(){ html += '<ons-list-item class="detail-item">'; html += '<header>'; html += '<span class="detail-item-date">' + $(this).find('date').text() + '</span>'; html += '</header>'; html += '<p class="detail-item-dept">' + $(this).find('dept').text() + '</p>'; html += '<p class="detail-item-diseaseName">' + $(this).find('diseaseName').text() + '</p>'; html += '</ons-list-item>'; }); $("#detail-item-list").html(html); var content = $("#detail-item-list").get(0); ons.compile(content); $('.item-id', this).text(currentItem.id); $('.item-gender', this).text(currentItem.gender); $('.item-name', this).text(currentItem.name); $('.item-birthdate', this).text(currentItem.birthdate); $('.item-address', this).text(currentItem.address); $('.add-note-action-item', this).click(function () { alert('dummy message'); }); }); $(document).on('pageinit', '#list-page', function() { getPatientList(); var html = ''; $(patientList).find('patient').each(function(){ html += '<ons-list-item modifier="chevron" class="item">'; html += '<ons-row>'; html += '<ons-col width="60px"> '; html += '<div class="item-thum">'; html += '</div>'; html += '</ons-col>'; html += '<ons-col>'; html += '<header>'; html += '<span class="item-id">' + $(this).find('id').text() + '</span>'; html += '<span class="item-gender">' + $(this).find('gender').text() + '</span>'; html += '</header>'; html += '<p class="item-name">' + $(this).find('name').text() + '</p>'; html += '<p class="item-birthdate">' + $(this).find('birthdate').text() + '</p>'; html += '<p class="item-address">' + $(this).find('address').text() + '</p>'; html += '</ons-col>'; html += '</ons-row> '; html += '</ons-list-item>'; } ); $("#item-list").html(html); var content = $("#item-list").get(0); ons.compile(content); $('.item', this).on('click', function() { currentItem = { id : $('.item-id', this).text(), gender : $('.item-gender', this).text(), name : $('.item-name', this).text(), birthdate : $('.item-birthdate', this).text(), address : $('.item-address', this).text() }; app.navi.pushPage('detail.html'); }); }); function getPatientList() { var url = 'http://172.16.108.250/~semi2015/XML/getPatientList.php'; patientList = null; $.ajax({ type: 'GET', url: url, async: false, cache: false, dataType: "xml" }).done(function(xml, status, error){ if (status == 'success') { patientList = xml; } else { alert('文書データ取得失敗'); } }).fail(function(xhr, status, error){ var message = "xhr.status = " + xhr.status + ", xhr.statusText = " + xhr.statusText + ", status = " + status + ", error = " + error; alert('サーバから応答がありません: ' + message); }); } function getVisitData(patientId) { var url = 'http://172.16.108.250/~semi2015/XML/getVisitData.php'; visitData = null; $.ajax({ type: 'GET', url: url, async: false, cache: false, dataType: "xml" }).done(function(xml, status, error){ if (status == 'success') { $(xml).find('patient').each(function(){ if($(this).attr('id') == patientId) { visitData = this; } }); return null; } else { alert('文書データ取得失敗'); return null; } }).fail(function(xhr, status, error){ var message = "xhr.status = " + xhr.status + ", xhr.statusText = " + xhr.statusText + ", status = " + status + ", error = " + error; alert('サーバから応答がありません: ' + message); return null; }); } })();
患者一覧XMLデータ
Ajaxで取得する患者一覧のXMLデータです。このデータは次のURLで取得します。http://172.16.108.250/~semi2015/XML/getPatientList.phpJSON形式と違ってXMLタグで各データ要素の意味が明確です。
<?xml version="1.0" encoding="UTF-8"?> <patientList> <patient> <id>A0001</id> <name>在本 璃奈</name> <gender>female</gender> <birthdate>1996/4/1</birthdate> <address>岡山県倉敷市山田町1丁目-2-3</address> </patient> <patient> <id>A0002</id> <name>清水 伸平</name> <gender>male</gender> <birthdate>1995/5/10</birthdate> <address>岡山県岡山市苦米地3丁目-5-6</address> </patient> <patient> <id>A0003</id> <name>田中 昌昭</name> <gender>male</gender> <birthdate>1958/7/6</birthdate> <address>岡山県瀬戸内市大岡5丁目-9-8</address> </patient> </patientList>
患者受診一覧XMLデータ
続いて患者受診一覧のXMLデータです。このデータは、以下のURLで取得します。http://172.16.108.250/~semi2015/XML/getVisitData.php
<?xml version="1.0" encoding="UTF-8"?> <visitData> <patient id="A0001"> <visit> <date>2016/5/20</date> <dept>内科</dept> <diseaseName>気管支炎</diseaseName> </visit> <visit> <date>2014/1/29</date> <dept>外科</dept> <diseaseName>大腿骨骨折</diseaseName> </visit> <visit> <date>2015/8/6</date> <dept>耳鼻科</dept> <diseaseName>中耳炎</diseaseName> </visit> </patient> <patient id="A0002"> <visit> <date>2016/3/19</date> <dept>内科</dept> <diseaseName>インフルエンザ</diseaseName> </visit> <visit> <date>2015/2/10</date> <dept>外科</dept> <diseaseName>虫垂炎</diseaseName> </visit> </patient> <patient id="A0003"> <visit> <date>2016/4/8</date> <dept>眼科</dept> <diseaseName>白内障</diseaseName> </visit> <visit> <date>2013/2/5</date> <dept>内科</dept> <diseaseName>心筋梗塞</diseaseName> </visit> <visit> <date>2011/11/4</date> <dept>皮膚科</dept> <diseaseName>アトピー性皮膚炎</diseaseName> </visit> <visit> <date>2014/12/15</date> <dept>精神科</dept> <diseaseName>気分障害</diseaseName> </visit> </patient> </visitData>
0 件のコメント:
コメントを投稿