サンプル 4 では、現在の選択内容の所有者を表示したり編集できるようにするダイアログを作成します。更新された所有者名は Web 層のページに送信され、フィーチャ ソースで更新されます。C:\Program Files\Autodesk\Autodesk Infrastructure Web Server Extension 2016\www\fusionフォルダ中の次のファイルが使用されます:
サンプル 4 の構造は「サンプル 3: ダイアログとイベント」とよく似ています。このサンプルは、Fusion.Event.MAP_SELECTION_ON イベントと Fusion.Event.MAP_SELECTION_OFF イベントに基づいて更新されるダイアログを使用します。ただし、このダイアログは単に選択情報を表示するのではなく、入力フィールドを備えているため、現在選択されている区画の所有者をユーザが編集できます。
Example4.js に記述されているこのダイアログの初期化コードによって、入力テキスト フィールドやボタンを備えたフォームが作成され、そのボタンの onclick アクションが設定されます。
this.messageDiv = document.createElement('div'); this.formInput = document.createElement('form'); this.formInput.innerHTML = '<p><label>Property owner: <input type="text" ' + 'name="propertyOwner" ' + 'value="propertyowner" size="30" / ></label></p>' + '<p><input name="inputButton" type="button" value="Update" ' + 'style="width: 70px;" class="Ctrl" /></p>'; this.formInput.inputButton.onclick = this.updatePropertyOwner; this.messageDiv.appendChild(this.formInput); this.domObj.appendChild(this.messageDiv);
このウィジェットは、選択内容が変わるたびにダイアログを更新します。
ユーザが更新ボタンをクリックすると、このウィジェットは Prototype JavaScript フレームワークから Ajax.Request オブジェクトを使用して、新しい所有者名を Web 層のページに送信します。このウィジェットは、Web ページが結果を JSON オブジェクトで返すことを求めます。
updatePropertyOwner : function() { var thisWidget = Fusion.getWidgetById('Example4'); var theMap = Fusion.getWidgetById('Map'); var reqParameters = {}; reqParameters.session = Fusion.sessionId; reqParameters.mapname = theMap.getMapName(); reqParameters.layer = 'Parcels'; reqParameters.propName = 'RNAME'; // Must use name from feature source, not display name reqParameters.newValue = thisWidget.formInput.propertyOwner.value; this.sBaseUrl = '/widgets/Example4/Example4.php'; Fusion.ajaxRequest(this.sBaseUrl, { method:'post', parameters: reqParameters, onSuccess: function(transport) { var jsonContent = eval("(" + transport.responseText + ")"); // Optionally, write the results to the Firebug console console.group('Returned values'); for (var prop in jsonContent) { console.log(prop + ': ' + jsonContent[prop]); } console.groupEnd(); if (jsonContent.error) { alert('There was an error:\n' + jsonContent.errorMsg); } else { alert('Update successful!'); } }, onFailure: function(ajaxResponse) { alert('Error:\n' + ajaxResponse.status + ' ' + ajaxResponse.statusText); } } ); }
クライアント側の JavaScript は、Infrastructure Studio の画層定義で定義されたプロパティの表示名を使用します。Infrastructure Map Server の Web API は、フィーチャ クラスで定義されたプロパティ名を使用します。このサンプルでは、フィーチャ クラス内のプロパティは「RNAME」であり、表示名は「Owner」です。
Web ページ「Example4.php」は、選択されたフィーチャのプロパティを更新します。これは、「マップと画層を修正する」や他のサンプル プログラムに記述されている Web API の標準的な用途です。ただし、フレキシブル Web レイアウト専用のアイテムもいくつかあります。
これには、ウィジェットのいくつかの標準的な初期化を実行する Common.php ファイルが含まれます(MgResourceService オブジェクトの $resourceService の作成や $mapName 変数の設定など)。
$fusionMGpath = '../../layers/MapGuide/php/'; include $fusionMGpath . 'Common.php';
クライアント側の JavaScript 関数では JSON 形式の結果を受け取ることが求められるため、Web ページには適切なヘッダが設定されている必要があります。
header('Content-type: text/x-json'); header('X-JSON: true');
また、それによって結果が正しくフォーマットされる必要もあります。この場合、Web ページは元の POST 引数といくつかの追加メンバを返すことにより、要求の成功または失敗を示します。追加メンバは、単に引数配列に追加されます。次に例を示します。
$args['error'] = false;
引数配列全体がクライアントに返されます。
echo json_encode($args);
$reader = $resourceService->GetResourceContent($layerFeatureResource); $xmlString = $reader->ToString(); $domDoc = DOMDocument::loadXML($xmlString); $xpath = new DOMXPath($domDoc); $query = "//Parameter[Name='ReadOnly']"; $nodes = $xpath->query($query); foreach ($nodes as $node) { $query = "Value"; $subNodes = $xpath->query($query, $node); foreach ($subNodes as $subNode) { $subNode->nodeValue = 'FALSE'; } } $newXml = $domDoc->saveXML(); $resourceService->SetResource($layerFeatureResource, new MgByteReader($newXml, MgMimeType::Xml), NULL);