Container Family: Dialog Quickstart Example

YAHOO.widget.Dialogオブジェクトは、YAHOO.widget.Panelのサブクラスで、DraggableなDialog Windowを生成する。
YUIのExampleのページでは、Dialog Windowを以下のように定義している。

Dialog provides an interface for easily gathering information from the user without leaving the underlying page context. The information gathered is collected via a standard HTML form(YUIのExampleのページから引用).
Dialogは、(その下になる)ページコンテンツから離れることなく、利用者から簡単に情報を収集するインターフェイスを提供する。収集される情報は、通常のHTMLのFormである。

また、YAHOO.widget.Panelから、width, fixedcenter, visible, とconstraintoviewportという属性を引き継いでいる。
Dialogに特徴的な以下の点である。

  • インスタンス化する際にbuttonsという属性があって、YUIのbuttonを使うことができる。
  • このbuttonを定義する際に、text(ボタンに表示する文字列)、handler(ボタンを押した際のハンドラー)、isDefault(trueにするとデフォルトのフォーカスが当たる)という属性定義ができる。
  • Connection Managerを用いてSubmitされる。この際のコールバック関数は、「ダイアログインスタンス名.callback」として、オブジェクト・リテラルで定義される。
  • Userサイドでの、Validation機構がある。これは、「ダイアログインスタンス名.validate」として利用することができる。入力値は、getData()メソッドによって取り出すことができる。

以下は、サンプルでダイアログを表示し、入力を行った画面である。

このように入力すると、YUIのExampleではassets/post.phpというphpプログラムが呼ばれるようになっている。このプログラムは、ダウンロードファイルのExample/Container/assetsにあり。入力値をそのまま、返すようにできている(以下)。

姓名を未入力にして、Validation機能を動かしたのが以下の画面である。

以下にJavascriptを含む、HTMLの全文を示す。
scriptはモジュールパターンで書き直した。

<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<TITLE>Ajax_Sampling</TITLE>
<style type="text/css">
body {
	margin:0;
	padding:0;
}
</style>

<link rel="stylesheet" type="text/css" href="scripts/yui/fonts/fonts-min.css" />
<link rel="stylesheet" type="text/css" href="scripts/yui/button/assets/skins/sam/button.css" />
<link rel="stylesheet" type="text/css" href="scripts/yui/container/assets/skins/sam/container.css" />
<script type="text/javascript" src="scripts/yui/utilities/utilities.js"></script>
<script type="text/javascript" src="scripts/yui/button/button-min.js"></script>
<script type="text/javascript" src="scripts/yui/container/container-min.js"></script>

<style type="text/css" id="defaultstyle">
#main {
	margin: 2px;
	padding: 3px;
	width: 400px;
	height: auto;
	border:1px dashed #999999;
}

#example {
	height:30em;
}

label { 
	display:block;
	float:left;
	width:45%;
	clear:left; 
}

.clear { 
	clear:both; 
}

#resp { 
	margin:10px;
	padding:5px;
	border:1px solid #ccc;
	background:#fff;
}

</style>

<script type="text/javascript">
// モジュールパターンで書く。
YAHOO.namespace("EGP");

YAHOO.EGP.DialogSample = function() {

	var Event = YAHOO.util.Event;
	var dialog1;
	
	// Dialogのsubmit時のハンドラー
	var handleSubmit = function() {
		this.submit();
	};
	
	// Dialogのcancel時のハンドラー
	var handleCancel = function() {
		this.cancel();
	};

	// Dialogのcallback関数(success)
	var handleSuccess = function(o) {
		var response = o.responseText;
		response = response.split("<!")[0];
		document.getElementById("resp").innerHTML = response;
	};

	// Dialogのcallback関数(success)
	var handleFailure = function(o) {
		alert("submit失敗: " + o.status);
	};

	return{
		init:function() {
			dialog1 
				= new YAHOO.widget.Dialog("dialog1", 
					{ width : "30em",
					  fixedcenter : true,
					  visible : false, 
					  constraintoviewport : true,
					  buttons : [ 
							{text:"Submit", 
							handler:handleSubmit, 
							isDefault:true },
							{text:"Cancel", 
							handler:handleCancel } ]
			});

			// DialogのValidate(自動的に発動する): 姓名の入力必須チェック
			dialog1.validate = function() {
				var data = this.getData();
				if (data.firstname == "" || data.lastname == "") {
					alert("姓名は入力必須です");
					return false;
				} else {
					return true;
				}
			};

			// Dialogのcallback関数
			dialog1.callback = {success: handleSuccess,
								failure: handleFailure };
	
			dialog1.render();

			Event.addListener("show", 
							"click", 
							dialog1.show, 
							dialog1, 
							true);
			Event.addListener("hide", 
							"click", 
							dialog1.hide, 
							dialog1, 
							true);
		}
	};
}();

//DOMが完全にloadされたら、サンプルを初期化する。
YAHOO.util.Event.onDOMReady(
		//DomReadyイベントで発火するハンドラ
		YAHOO.EGP.DialogSample.init,
		//ハンドラに渡すオブジェクト(関数)
		YAHOO.EGP.DialogSample,
		//ハンドラは、上記のオブジェクトのスコープをもつ。   
		true
);

</script>
</HEAD>

<BODY class="yui-skin-sam">
<div id="main">
<p>
YAHOO.widget.Dialogのサンプルです。
</p>
<div>
<button id="show">Show dialog1</button> 
<button id="hide">Hide dialog1</button>
</div>

<div id="dialog1">
<div class="hd">入力してください。</div>
<div class="bd">
<!-- 入力フォーム -->
<form method="POST" action="ajax_yui_container_dialog_quickstart.php">
	<label for="firstname"></label>
		<input type="textbox" name="firstname" />
	<label for="lastname"></label>
		<input type="textbox" name="lastname" />
	<label for="email">E-mail:</label>
		<input type="textbox" name="email" /> 

	<label for="state[]">都道府県:</label>
		<select multiple name="state[]">
			<option value="Hokkaido">北海道</option>
			<option value="Tokyo">東京</option>
		</select> 

	<div class="clear"></div>

	<label for="radiobuttons">ラジオボタン:</label>
		<input type="radio" name="radiobuttons[]" value="1" checked/> 1
		<input type="radio" name="radiobuttons[]" value="2" /> 2
	
	<div class="clear"></div>

	<label for="check">チェックボックス(single):</label>
		<input type="checkbox" name="check" value="1" /> 1
	
	<div class="clear"></div>
		
	<label for="textarea">テキスト・エリア:</label>
		<textarea name="textarea"></textarea>

	<div class="clear"></div>

	<label for="cbarray">チェックボックス(multi):</label>

	<input type="checkbox" name="cbarray[]" value="1" /> 1
	<input type="checkbox" name="cbarray[]" value="2" /> 2
</form>
</div>
</div>

<div id="resp">サーバーからのレスポンスがここに表示されます。</div>
</div>
</BODY>
</HTML>