サンプル 4: サイト リポジトリを更新する

サンプル 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);
注:
最初にロードされる際には、Sheboygan データ内の SDF 画層のフィーチャ ソースが読み取り専用に設定される可能性があります。Example4.php には、そのフィーチャ ソースを書き込み可能にするコードが含まれています。これは他のフィーチャ ソースには適用されない場合があります。
$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);