flex DBのデータの修正
FlexでDBにデータを新規追加できたので、今度は修正する。
教えてもらってなんとかできた。
なんとかできたけど、半分以上理解できないし、何が理解できないかが分からない。
とりあえず新しいファイルで一からやり直す。
※新規追加は正直なトコロ、不要なので今回は放置する。(必要なら「flex データの新規追加」を見る)
私の場合
DBはWinでXAMPPにあったMySQL。
「test」って名前のデータベースを作成して「test」って名前のテーブルを作成ずみ。
カラムはid(int),name(text),comment(text)
ファイルの追加
- プロジェクトの上で右クリック
- 新規:MXML アプリケーション
- 名前は任意。
- 「終了」ボタンを押す。
DBの内容を表示
DataGridをいれて、DBとバインドする。
- 「デザイン」モードにする
- パネルの「コンポーネント」にある「コントロール:DataGrid」をドラッグAndドロップ。
※適当にサイズを修正 - パネルの「データとサービス」の中にある「getALLTest():Test[]」を「DataGrid」へドラッグAndドロップ。
※とりあえず何も気にせず「OK」しておく。
※「戻り値の型のフォーム」は不要なのでチェックを外している。 - データグリッドを選択しパネルの「プロパティ」の「id」を変更する。
※変更しなくてもいいけど、あとで分かりづらくなるので「targetDataGrid」としておく
修正用フォームの作成
- 「デザイン」モードにする
- パネルの「データとサービス」の中にある「updateTest(item: Test):void」の上で右クリック。
- 「フォームを作成」を選択
- 何も気にせずに「終了」ボタンを押す。
※「フォームを生成する対象:サービスの呼び出し」「新規サービスの呼び出し:サービス(TestService)、操作(updateTest(item: Test):void)、(作成:入力パラメーターのフォームにチェック)」
※「次へ」ボタンは押してもいいし押さなくてもいい。でも、項目は全部必要。PHPの方で全部の項目を上書きするってあるため。PHP側でクエリを修正するならいらないかも。
IDの値を書き換え不可にする
きっと方法はあるんだろうけど、見える必要がないので隠す。
- 「ソース」モードに切り替える
- 「<s:FormItem label="Id">」を「<s:FormItem label="Id" visible="false" includeInLayout="false">」に変換
選択したデータをフォーム内に表示するように修正
データグリッドのデータを選択したときに修正用フォームに値を表示する
表示完了したときに関数(?)を実行
「データグリッドのデータを選択したとき」の処理を追加
<fx:Script>内に下記を追加
- protected function application1_creationCompleteHandler(event:FlexEvent):void
- {
- targetDataGrid.addEventListener(GridSelectionEvent.SELECTION_CHANGE,onSelectedItem);
- }
意味合いとしては下記。
内容は「ID:targetDataGrid」で適当な行が選択されたたとき(GridSelectionEvent.SELECTION_CHANGE)、onSelectedItemを実行する
onSelectedItemの設定
onSelectedItemで実行するのは「dataGridの各値をフォームにセット」。
項目が3つしかないので下記のような感じ。
- private function onSelectedItem(e:GridSelectionEvent):void{
- idTextInput.text = targetDataGrid.selectedItem.id;
- nameTextInput.text = targetDataGrid.selectedItem.name;
- commentTextInput.text = targetDataGrid.selectedItem.comment;
- }
フォームの中の「UpdateTest」ボタンを押したときの処理
内容を修正したあとにDBに反映させる。そのための処理。
<fx:Script>内にbutton_clickHandler()が勝手に追加してくれているはずだけど、追加されていなければ追加。以下、記載済みの部分は飛ばし読みする。
button_clickHandler()の追加
- protected function button_clickHandler(event:MouseEvent):void
- {
- }
オブジェクトのTest()を追加して、各項目をセット
オブジェクトのTest()はDataGridでデータにバインドした際に作成されたPHPのClass。
前回の分に追加記載したもの。
- protected function button_clickHandler(event:MouseEvent):void
- {
- // 各項目をセット
- var test:Test = new Test();
- test.id = parseInt(idTextInput.text);
- test.name = nameTextInput.text;
- test.comment = commentTextInput.text;
- }
updateのクエリ実行
前回の分に追加記載したもの。
- protected function button_clickHandler(event:MouseEvent):void
- {
- // 各項目をセット
- var test:Test = new Test();
- test.id = parseInt(idTextInput.text);
- test.name = nameTextInput.text;
- test.comment = commentTextInput.text;
- // updateの実行をする
- updateTestResult.token = testService.updateTest(test);
- testService.commit();
- }
修正後、dataGridの表示を更新
前回の分に追加記載したもの。
- protected function button_clickHandler(event:MouseEvent):void
- {
- // 各項目をセット
- var test:Test = new Test();
- test.id = parseInt(idTextInput.text);
- test.name = nameTextInput.text;
- test.comment = commentTextInput.text;
- // updateの実行をする
- updateTestResult.token = testService.updateTest(test);
- testService.commit();
- // 修正後、dataGridの表示を更新
- getAllTestResult.token = testService.getAllTest();
- }
これで、終了。
全ソース
あれこれ調査したけどほとんど役に立たない情報が多すぎる。
知ってる人にとっては役立つかもしれないけど…。
ソースを全部載せてくれていたら、何が違うのかとかも検証できたよかったのに。
ということで全ソース。
- <?xml version="1.0" encoding="utf-8"?>
- <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
- xmlns:s="library://ns.adobe.com/flex/spark"
- xmlns:mx="library://ns.adobe.com/flex/mx"
- xmlns:testservice="services.testservice.*"
- xmlns:valueObjects="valueObjects.*"
- creationComplete="application1_creationCompleteHandler(event)"
- minWidth="955" minHeight="600">
- <fx:Script>
- <![CDATA[
- import mx.controls.Alert;
- import mx.events.FlexEvent;
- import spark.events.GridSelectionEvent;
- // テーブルにデータを表示
- protected function dataGrid_creationCompleteHandler(event:FlexEvent):void
- {
- getAllTestResult.token = testService.getAllTest();
- }
- // テーブルのデータを修正
- protected function button_clickHandler(event:MouseEvent):void
- {
- var test:Test = new Test();
- test.id = parseInt(idTextInput.text);
- test.name = nameTextInput.text;
- test.comment = commentTextInput.text;
- updateTestResult.token = testService.updateTest(test);
- testService.commit();
- getAllTestResult.token = testService.getAllTest();
- }
- // データグリッドが選択されたときの処理
- protected function application1_creationCompleteHandler(event:FlexEvent):void
- {
- targetDataGrid.addEventListener(GridSelectionEvent.SELECTION_CHANGE,onSelectedItem);
- }
- // データグリッドが選択せれたら、修正用フォームに値を表示する
- private function onSelectedItem(e:GridSelectionEvent):void{
- idTextInput.text = targetDataGrid.selectedItem.id;
- nameTextInput.text = targetDataGrid.selectedItem.name;
- commentTextInput.text = targetDataGrid.selectedItem.comment;
- }
- ]]>
- </fx:Script>
- <fx:Declarations>
- <s:CallResponder id="getAllTestResult"/>
- <testservice:TestService id="testService"
- fault="Alert.show(event.fault.faultString + '\n' + event.fault.faultDetail)"
- showBusyCursor="true"/>
- <valueObjects:Test id="test"/>
- <s:CallResponder id="updateTestResult"/>
- <!– 非ビジュアルエレメント (サービス、値オブジェクトなど) をここに配置 –>
- </fx:Declarations>
- <s:DataGrid id="targetDataGrid" x="7" y="5" width="677" height="163"
- creationComplete="dataGrid_creationCompleteHandler(event)" requestedRowCount="4">
- <s:columns>
- <s:ArrayList>
- <s:GridColumn dataField="id" headerText="id"></s:GridColumn>
- <s:GridColumn dataField="name" headerText="name"></s:GridColumn>
- <s:GridColumn dataField="comment" headerText="comment"></s:GridColumn>
- </s:ArrayList>
- </s:columns>
- <s:typicalItem>
- <fx:Object id="id1" comment="comment1" name="name1"></fx:Object>
- </s:typicalItem>
- <s:AsyncListView list="{getAllTestResult.lastResult}"/>
- </s:DataGrid>
- <s:Form x="10" y="180" defaultButton="{button}">
- <s:FormItem width="241" label="Id" visible="false" includeInLayout="false">
- <s:TextInput id="idTextInput" text="{test.id}"/>
- </s:FormItem>
- <s:FormItem label="Name">
- <s:TextInput id="nameTextInput" text="{test.name}"/>
- </s:FormItem>
- <s:FormItem label="Comment">
- <s:TextInput id="commentTextInput" text="{test.comment}"/>
- </s:FormItem>
- <s:Button id="button" label="UpdateTest" click="button_clickHandler(event)"/>
- </s:Form>
- </s:Application>