(31) 【HTTPServiceを使ってサンプルを拡張する 後半】

hirossy19772007-02-14


郵便番号から住所検索を行うボタンを追加しています。
HTTPServiceを使用して、RESTで検索します。

今回は、Event、Command、BusinessLogicを新規作成し、View及びViewHelperを修正して完成させます。

では、順に作成してゆきます。

event.AddressSelectZipEvent.as
新規作成します。

package event
{
  import com.adobe.cairngorm.control.CairngormEvent;
  import control.AddressController;
  import vo.Address;
  /**
   * 郵便番号から住所検索イベントクラス。
   */
  public class AddressSelectZipEvent extends CairngormEvent{
    public var zipcode :String;
    /**
     * コンストラクタ。
     */
    public function AddressSelectZipEvent( zipcode : String ){
      this.zipcode = zipcode;
      super( AddressController.EVENT_ADDRESS_SELECTZIP );
    }
  }
}

command.AddressSelectZipCommand.as
新規作成します。
REST実行結果は、提供するAPIによって異なりますので変更してください。

package command
{
  import business.ZipCodeLogic;
  import com.adobe.cairngorm.commands.ICommand;
  import com.adobe.cairngorm.control.CairngormEvent;
  import event.AddressSelectZipEvent;
  import model.AddressModelLocator;
  import mx.collections.ArrayCollection;
  import mx.controls.Alert;
  import mx.rpc.IResponder;
  import vo.Address;
  /**
   * 郵便番号から検索コマンド。
   */
   public class AddressSelectZipCommand implements ICommand,IResponder{
    public var model:AddressModelLocator = AddressModelLocator.getInstance();
    /**
     * 実行
     */
    public function execute(cairngormEvent:CairngormEvent):void{
      var addressEvent:AddressSelectZipEvent = cairngormEvent as AddressSelectZipEvent;
      var logic:ZipCodeLogic = new ZipCodeLogic(this);
      logic.select(addressEvent.zipcode);
    }
    /**
     * 実行結果
     */
    public function result(data:Object):void{
      var res : ArrayCollection = data.token.result as ArrayCollection;
      if(res != null ){
        // ここは提供するAPIに合わせてください。
        this.model.zipcode = res[0].gd_zip.zip[0].code;
        this.model.address =
        res[0].gd_zip.zip[0].pref +
        res[0].gd_zip.zip[0].city +
        res[0].gd_zip.zip[0].town;
      }
    }
    /**
     * 実行失敗
     */
    public function fault(info:Object):void{
      Alert.show('失敗', 'Fault');
    }
  }
}

business.ZipCodeLogic.as
新規作成します。

package business
{
  import com.adobe.cairngorm.business.ServiceLocator;
  import mx.controls.Alert;
  import mx.rpc.AbstractService;
  import mx.rpc.AsyncToken;
  import mx.rpc.IResponder;
  import mx.rpc.http.HTTPService;
  import vo.Address;
  /**
   * ビジネスロジック
   */
  public class ZipCodeLogic{
    private var service : HTTPService;
    private var responder : IResponder;
    /**
     * コンストラクタ。
     */
    public function ZipCodeLogic(callingCommand : IResponder){
      this.service = ServiceLocator.getInstance().getHTTPService("feedRequest");
      this.responder = callingCommand;
    }
    /**
     * 検索
     */
    public function select(zipcode : String):void{
      var obj:Object = new Object();
      obj.q = zipcode;
      var token : AsyncToken = this.service.send(obj);
      token.resultHandler = responder.result;
      token.faultHandler = responder.fault;
    }
  }
}

view.AddressFormViewHelper.as
以下のように修正します。
変更点は、onSctZipBtn()の追加と、各メソッド内でzipcodeを追加した点です。

    ・・・

  import event.AddressSelectZipEvent;

    ・・・

    /**
     * 登録処理
     */
    private function insert():void{
      // 画面の入力値を取得
      var dto:Address = new Address();
      dto.name = this.view.txtName.text;
      dto.zipcode = this.view.txtZipcode.text;
      dto.address = this.view.txtAddress.text;
      dto.telno = this.view.txtTelno.text;
      // イベント送出
      CairngormEventDispatcher.getInstance().dispatchEvent( new AddressInsertEvent(dto) );
      // 画面を一覧に戻します
      this.onReturnBtn();
    }

    ・・・

    /**
     * 修正処理
     */
    private function update():void{
      // 画面の入力値を取得
      var dto:Address = new Address();
      dto.addressid = this.view.lblId.text;
      dto.name = this.view.txtName.text;
      dto.zipcode = this.view.txtZipcode.text;
      dto.address = this.view.txtAddress.text;
      dto.telno = this.view.txtTelno.text;
      // イベント送出
      CairngormEventDispatcher.getInstance().dispatchEvent( new AddressUpdateEvent(dto) );
      // 画面を一覧に戻します
      this.onReturnBtn();
    }

    ・・・

    /**
     * 郵便番号から検索ボタン押下
     */
    public function onSctZipBtn():void{
      var zipcode:String = this.view.txtZipcode.text;
      CairngormEventDispatcher.getInstance().dispatchEvent( new AddressSelectZipEvent(zipcode) );
    }

view.AddressListViewHelper.as
以下のように修正します。
変更点は、各メソッド内でzipcodeを追加した点です。

    ・・・
    
    /**
     * 修正ボタン押下
     */
    public function onUpdateBtn():void{
      if (this.view.grdAddress.selectedIndex == -1) {
        Alert.show('修正する行が選択されていません。', 'おしらせ');
        return;
      }
      // フォームに値をセット
      this.view.parentDocument.addressForm.lblId.text
          = this.view.grdAddress.selectedItem.addressid;
      this.view.parentDocument.addressForm.txtName.text
          = this.view.grdAddress.selectedItem.name;
      this.view.parentDocument.addressForm.txtZipcode.text
          = this.view.grdAddress.selectedItem.zipcode;
      this.view.parentDocument.addressForm.txtAddress.text
          = this.view.grdAddress.selectedItem.address;
      this.view.parentDocument.addressForm.txtTelno.text
          = this.view.grdAddress.selectedItem.telno;
      this.view.parentDocument.addressForm.btnRegist.label
          = "修正";
      // ViewStackをAddressForm.mxmlへ切り替え
      this.view.parentDocument.viewstack1.selectedChild
        = this.view.parentDocument.vsAddressForm;
    }
    
    ・・・
    
    /**
     * データグリッド押下
     */
    public function onClickDataGrid():void{
    }
    private function clearForm():void{
      // フォームの初期化
      this.view.parentDocument.addressForm.lblId.text = "";
      this.view.parentDocument.addressForm.txtName.text = "";
      this.view.parentDocument.addressForm.txtZipcode.text = "";
      this.view.parentDocument.addressForm.txtAddress.text = "";
      this.view.parentDocument.addressForm.txtTelno.text = "";
      this.view.parentDocument.addressForm.btnRegist.label = "登録";
    }

    ・・・

AddressList.mxml
以下のように修正します。
変更点は、DataGridのカラムにzipcodeを追加した点です。




  
    
      
      
      
      
      
    

  

  
  
  
  

AddressForm.mxml
以下のように修正します。





  
    
      
    

    
      
    

    
      
    

    
      
    

    
      
    

    
      
    

  

  
  

今回はえらく長くなってしまいましたが、なんとか完成しました。ソースは前回同様、FxUG様CVSにてお願いいたします。


次回は、最終回(32)Cairngorm 2.1 まとめです。

え?ネタ切れ?

いえいえ

違いますよ




違いますとも