XMLデータバインド問い合わせ

  mxml



http://lightbox.on.coocan.jp/php/flex2/req.swf

httpSrv.request.name = sname.text; で、UTF-8 で URL エンコードされているようです。
コードで URLエンコードすると、PHP では、$_GET の中に URL エンコードされた値が入っていました。
( つまり、URLデコードが必要だった )

1) HTTPService による、DB問い合わせ( 応答の非同期 )。
2) 画面の画像化 ( PNG )
3) flash 右クリックメニューのカスタマイズ
4) メニュー処理

  
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"
	creationComplete="initApp()"
	paddingTop="25"
	viewSourceURL="http://winofsql.jp/VA003334/flex2071129234745.htm"
>
<mx:Script>
<![CDATA[

	import mx.controls.Alert;
	import mx.rpc.AsyncToken;
	import mx.rpc.events.FaultEvent;
	import mx.rpc.events.ResultEvent;
	import mx.collections.ArrayCollection;
	import mx.events.*;
	import flash.net.*;
	import flash.display.*;
	import PNGEncoder;
	import mx.utils.Base64Encoder;

	private var post:URLLoader;

	// *****************************************************
	// 初期化
	// *****************************************************
	private function initApp():void {

		post = new URLLoader();

		// IO エラー
		post.addEventListener(IOErrorEvent.IO_ERROR, systemError);

		// 処理終了
		post.addEventListener(Event.COMPLETE, completeUpload);


		// 右クリックメニュー
		var cMenu:ContextMenu = new ContextMenu();
		cMenu.hideBuiltInItems();

		var cMenuItem:ContextMenuItem =
			new ContextMenuItem("保存された画像の表示");
		cMenuItem.addEventListener(
			ContextMenuEvent.MENU_ITEM_SELECT, dispImage
		);
		cMenu.customItems.push(cMenuItem);

		var cMenuItem2:ContextMenuItem =
			new ContextMenuItem("ソースコード");
		cMenuItem2.addEventListener(
			ContextMenuEvent.MENU_ITEM_SELECT, dispSource
		);
		cMenu.customItems.push(cMenuItem2);

		this.contextMenu = cMenu;


	}

	// *************************************************
	// 保存された画像の表示
	// *************************************************
	private function dispImage(event:ContextMenuEvent):void {

		var req:URLRequest = new URLRequest("./upload.png");
		navigateToURL(req, "_blank");

	}
	// *************************************************
	// ソースの表示
	// *************************************************
	private function dispSource(event:ContextMenuEvent):void {

		var req:URLRequest = new URLRequest(
			"http://winofsql.jp/VA003334/flex2071129234745.htm"
		);
		navigateToURL(req, "_blank");

	}

	// *****************************************************
	// HTTPServiceを使用してHTTPリクエスト(GET)を行う
	// *****************************************************
	private function getXML(
		httpSrv:HTTPService,
		targetURL:String,
		test:Number=-1
	):void {
		// リクエストするURLをセット
		httpSrv.url = targetURL;

		httpSrv.request.test = test;
		httpSrv.request.name = "";
		if ( sname.text != "" ) {
			httpSrv.request.name = sname.text;
		}


		// レスポンス結果のデータフォーマット
		httpSrv.resultFormat = "e4x";
		
		httpSrv.method = "GET";
		
		// リクエストを実行
		var at:AsyncToken = httpSrv.send();

		at.reqId = test;

	}
	
	// *****************************************************
	// HTTPServiceが成功
	// *****************************************************
	private function resultHandler(e:ResultEvent):void
	{
		var dataSet:Object = null;

		dataSet = e.result.row;

		dg1.dataProvider = dataSet;

		rid.text = e.token.reqId;
		dg1.selectedIndex = 0;
	}
	
	// *****************************************************
	// HTTPServiceでエラーが発生した
	// *****************************************************
	private function faultHandler(e:FaultEvent):void
	{
		Alert.show("HTTPService失敗\n\n理由 : " + e.fault.message);
	}


	// *****************************************************
	// メニュー処理
	// *****************************************************
	private function menuHandler(event:MenuEvent):void  {

		if ( event.item.@data == "req_1" ) {
			getXML(srv, './data.php');
		}
		if ( event.item.@data == "req_2" ) {
			getXML(srv, './data.php', 0);
		}
		if ( event.item.@data == "req_3" ) {
			getXML(srv, './data.php', 1);
		}
		if ( event.item.@data == "act_1" ) {
			dg1.dataProvider = new ArrayCollection();
		}
		if ( event.item.@data == "act_2" ) {
			var e:ContextMenuEvent = 
				new ContextMenuEvent(
					ContextMenuEvent.MENU_ITEM_SELECT
				);
			dispImage( e );
		}
		if ( event.item.@data == "act_3" ) {
			var e2:ContextMenuEvent = 
				new ContextMenuEvent(
					ContextMenuEvent.MENU_ITEM_SELECT
				);
			dispSource( e2 );
		}
	}

	// *****************************************************
	// Panel を画像化してアップロード
	// Windows 2000 の IIS では応答が帰らず、IE 死亡
	// AN ATTPD では、データが渡らない
	// *****************************************************
	private function uploadImage(target:DisplayObject):void
	{
		var bmp:BitmapData = new BitmapData(target.width, target.height);
		bmp.draw(target);
		var png:ByteArray = PNGEncoder.encode(bmp);

		var req:URLRequest = new URLRequest("./savePng.php");
		req.data = png;
		req.method = URLRequestMethod.POST;

		post.load(req);

		bmp.dispose();

	}

	// *************************************************
	// 処理終了
	// *************************************************
	private function completeUpload(event:Event):void {

		Alert.show(post.data);

	}
			
	// *************************************************
	// IO エラー
	// *************************************************
	private function systemError(event:IOErrorEvent):void{
		Alert.show("IOError:" + event.text);
	}

]]>
</mx:Script>

<mx:HTTPService id="srv" showBusyCursor="true"
		 result="resultHandler(event)"
		 fault="faultHandler(event)" />

<mx:XML format="e4x" id="myMenuModel">
	<root label="Menu">
		<menuitem label="問合せ">
			<menuitem label="ロード" data="req_1"/>
			<menuitem label="男性" data="req_2"/>
			<menuitem label="女性" data="req_3"/>
		</menuitem>
		<menuitem label="処理">
			<menuitem label="クリアデータ" data="act_1"/>
			<menuitem type="separator"/>
			<menuitem label="保存された画像の表示" data="act_2"/>
			<menuitem label="ソースコード" data="act_3"/>
		</menuitem>
	</root>
</mx:XML>

<mx:Panel
	id="panel"
	title="社員問合せ" width="660" height="550"
	paddingTop="10"
	paddingBottom="10"
	paddingLeft="10"
	paddingRight="10"
>
	<mx:MenuBar
		id="myMenu"
		labelField="@label"
		showRoot="false"
		itemClick="menuHandler(event);"
		width="100%"
		fontWeight="bold"
	>
		<mx:dataProvider>
			{myMenuModel}
		</mx:dataProvider>
	</mx:MenuBar>

	<mx:HBox>
		<mx:Label text="氏 名"/>
		<mx:TextInput id="sname" text=""/>
		<mx:Button label="ロード" click="getXML(srv, './data.php')" />
		<mx:Button label="男性" click="getXML(srv, './data.php', 0)" />
		<mx:Button label="女性" click="getXML(srv, './data.php', 1)" />
		<mx:Button
			label="クリアデータ"
			click="dg1.dataProvider = new ArrayCollection()"
		/>
		<mx:Button
			label="現在の状態を画像化"
			click="uploadImage(panel)"
		/>
	</mx:HBox>

	<mx:DataGrid id="dg1" height="400">
	<mx:columns>
	<mx:DataGridColumn headerText="CD" dataField="COL_1" width="46"/>
	<mx:DataGridColumn headerText="氏名" dataField="COL_2" width="70"/>
	<mx:DataGridColumn headerText="フリガナ" dataField="COL_3" width="100"/>
	<mx:DataGridColumn headerText="所属" dataField="COL_4" width="46"/>
	<mx:DataGridColumn headerText="性別" dataField="COL_5" width="40"/>
	<mx:DataGridColumn headerText="作成日" dataField="COL_6" width="70"/>
	<mx:DataGridColumn headerText="更新日" dataField="COL_7" width="70"/>
	<mx:DataGridColumn
		headerText="給与"
		dataField="COL_8"
		width="60"
		textAlign="right"
	/>
	<mx:DataGridColumn
		headerText="手当"
		dataField="COL_9"
		width="60"
		textAlign="right"
	/>
	<mx:DataGridColumn headerText="管理者" dataField="COL_10" width="46"/>
	</mx:columns>
	</mx:DataGrid>

	<mx:HBox>
		<mx:Label text="Request ID => "/>
		<mx:Label id="rid" text=""/>
	</mx:HBox>


</mx:Panel>
</mx:Application>
  



  サーバー側( PHP )



XML の表示

  
<?
ini_set( 'display_errors', "1" );
$conf_client_charset = "utf-8";
$conf_db_charset = "euc-jp";
$conf_db_type = 1;
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Content-Type: text/xml; Charset=$conf_client_charset" );

mb_language( "ja" );
mb_internal_encoding("utf-8");

print "<?xml version=\"1.0\" encoding=\"$conf_client_charset\"?>";
print "<data>";

# **********************************************************
# 外部ファイル
# **********************************************************
inc( "http://homepage2.nifty.com/lightbox/gen/db.php" );

$SQL = new DB( "localhost", "lightbox", "root", "" );

$Cond = "";

$str='';
$str.="select 社員コード \n	,氏名 \n	,フリガナ \n	,所属 ";
$str.="\n	,case 性別  \n	when 1 then '女性' \n	when ";
$str.="0 then '男性' \n	end as 性別 \n	,作成日 \n	,更新日 ";
$str.="\n	,case   \n	when 給与 < 1000 then \n		給与 ";
$str.="\n	when 給与 < 1000000 then \n		concat( \n";
$str.="truncate(給与/1000,0),',',right(給与,3) ";
$str.="\n		) \n	when 給与 < 1000000000 then \n		concat( ";
$str.="\n			truncate(給与/1000000,0),',' \n";
$str.=", right(concat('00',mod(truncate(給与/1000,0),1000)),3) ";
$str.=",',' \n			,right(給与,3) \n		) \n	end as 給与 ";
$str.="\n	,手当 \n	,管理者  \n from 社員マスタ ";
$Query .= $str;

if ( $_GET['test'] == 1 ) {
	$Cond .= " where 性別 = 1";
}
if ( $_GET['test'] == 0 ) {
	$Cond .= " where 性別 = 0";
}

if ( $_GET['name'] != "" ) {
	if ( $Cond != "" ) {
		$Cond .= " and ";
	}
	else {
		$Cond .= " where ";
	}
	$Cond .= " 氏名 like '%{$_GET['name']}%'";
}

$Column = $SQL->QueryEx( $Query . $Cond );

while( $Column ) {

	print el(0,"row");
	for( $i = 0; $i < 11; $i++ ) {
		print elset(1,"COL_" . ($i+1), $Column[$i] );
	}
	print el(0,"/row");
	print "\n";

	$Column = $SQL->QueryEx( );

}

# **********************************************************
# 接続解除
# **********************************************************
$SQL->Close();

print "</data>";


# **********************************************************
# URL によるコード取得
# **********************************************************
function inc( $path ) {
	$inc = @file( $path );
	array_shift($inc);
	array_pop($inc);
	$GLOBALS['inc_eval_txt'] = implode( "", $inc );
	eval($GLOBALS['inc_eval_txt']);
}

# **********************************************************
# 要素
# **********************************************************
function el( $lv, $ename ) {

	$tab = "";
	for( $i = 0; $i < $lv; $i++ ) {
		$tab .= "\t";
	}

	return "$tab<$ename>\n";

}

# **********************************************************
# 要素とデータ
# **********************************************************
function elset( $lv, $ename, $edata ) {

	$tab = "";
	for( $i = 0; $i < $lv; $i++ ) {
		$tab .= "\t";
	}

	return "$tab<$ename>$edata</$ename>\n";

}
?>
  




  画像保存用 PHP

savePng.php
  
<?

$fp = fopen( "php://input", "rb" );
$wfp = fopen( "upload.png", "wb" );

while( $ret = fread( $fp, 4096 ) ) {

	fwrite( $wfp, $ret );

}

fclose($wfp);
fclose($fp);


?>
画像が保存されました
  










  infoboard   管理者用   
このエントリーをはてなブックマークに追加





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ