EZウェブの旧型機種(WAP 1.0端末)のネイティヴ言語であるHDMLでは、入力フォームをHTMLの<form>要素とは全く異なる方法で記述しなければなりません。
HDMLでは、HTMLとは根本的に異なった方式で入力フォームを実現します。
HDMLでは、基本的に一つのファイル(デッキ)に、複数のページ(カード)を入れられます。
通常、<display>要素(表示カード)でコンテンツを表しますが、入力フォームの各項目は、特殊なカード(入力用カード)を用いて実現します。
基本的に、1入力用カードには1項目しか入力出来ません。
入力用に使えるカードは、以下の二つです。
この二つのカードを組合わせて、入力フォームを実現させます。
入力用カードからデータを受取るにはどうしたらいいでしょうか。
その答えは、変数を用いる事です。
変数はHTMLには無い概念ですが、HDMLでフォームを実現するには欠かせない概念です。
予め、入力用カードに入力された値を入れる変数を指定しておくと、その変数に入力された値が代入されます。
<entry>要素は、任意の文字列を入力出来るカードです。
考えられるフォーマットは以下の通りです。
<entry key="変数名" name="カード名"><action type="accept" task="go" dest="入力完了後に移動すべきURL" label="表示すべき文字列"><action type="soft1" task="go" dest="入力を取止める場合に移動すべきURL" label="表示すべき文字列">(メッセージ)</entry>
ここで、(メッセージ)
は実際に表示させたいメッセージを記述します(例:名前を入力して下さい)。
また、<action>要素は<choice>要素でも出てくるので、<choice>要素の解説の後に纏めて解説致します。
<entry>要素ではkey属性で入力された文字列を収める変数名を指定します。
変数名は英字で始まる英数字列です。
また、name属性でカードの名前を決めておきます。
この名前をURLに続けて記述する事で、この名前を持つカードへのアクセスが可能になります。
#カード名」とするだけでアクセス出来ます。#カード名」を記述する事でアクセス出来ます。この他にも、いくつかの属性があります。
主なものを挙げておきましょう。
noecho="true"属性を入れておくと、入力された文字列は伏字で表示されます。emptyok="true"属性を指定します。具体的には、以下のようになるでしょう。
<entry key="name" name="input1"><action type="accept" task="go" dest="#input2" label="次へ"><action type="soft1" task="go" dest="#top" label="戻る">お名前を入れて下さい。</entry>
<entry>要素にnoecho属性が付く事に注意して下さい。
<entry key="name" name="input2" noecho="true"><action type="accept" task="go" dest="#input3" label="次へ"><action type="soft1" task="go" dest="#input1" label="戻る">パスワードを入れて下さい。</entry>
<choice>要素は、予め用意した選択肢から一つを選択するカードです。
考えられるフォーマットは以下の通りです。
<choice key="変数名" name="カード名"><action type="accept" task="go" dest="入力完了後に移動すべきURL" label="表示すべき文字列"><action type="soft1" task="go" dest="入力を取止める場合に移動すべきURL" label="表示すべき文字列">(メッセージ)<ce value="クエリ値1">選択肢1<ce value="クエリ値2">選択肢2 …<ce value="クエリ値n">選択肢n</choice>
ここで、(メッセージ)
は実際に表示させたいメッセージを記述します(例:以下からお撰び下さい)。
また、<action>要素は<entry>要素でも出てきたので、この要素の解説の後に纏めて解説致します。
<choice>要素ではkey属性で選択肢に対応するクエリ値を収める変数名を指定します。
変数名は英字で始まる英数字列です。
また、name属性でカードの名前を決めておきます。
この名前をURLに続けて記述する事で、この名前を持つカードへのアクセスが可能になります。
#カード名」とするだけでアクセス出来ます。#カード名」を記述する事でアクセス出来ます。各選択肢は<ce>要素を頭に付けます。
value属性で、当該選択肢が撰ばれた場合に変数に代入されるべきクエリ値を指定します。
例えば、以下の場合、一番目の選択肢が指定された場合、変数には「Apple」が代入され、二番目が指定されたら「Orange」が代入されます。
<choice key="fruit" name="fruitChoice">どちらがお好きですか?<ce value="Apple">りんご<ce value="Orange">みかん</choice>
<entry>要素及び<choice>要素開始タグ直後の<action>属性は、端末のソフトキーによる動作を指定します。
<entry>カード及び<choice>カードに入った場合、閲覧者は以下ように考えると予想出来ます。
この為、通常acceptキーが押下されたら次のステップへ進み、soft1キーが押されたら前のステップへ戻るようにしております。
<action>要素はカードの開始タグ直後にのみ記述出来る要素で、type属性で対応するソフトキー、task属性で処理方法(通常はtask="go"属性にする)、dest属性で移動先のURL、label属性で画面に表示させる文字列を指定します。
例えば、以下のように書けるでしょう。
<action type="accept" task="go" dest="#next" label="次へ"><action type="soft1" task="go" dest="#top" label="戻る">
この場合、acceptキーを押されたら、「next」カードに移動し、soft1キーが押されたら「top」カードに移動するようになります。
<action>要素は、ソフトキーによる動作を指定しますが、またCGIにデータを送信するのにも用います。
データを送信する場合、dest属性には送信先CGIのURLを指定します。
この場合、dest属性で指定するURLの後ろにクエリで記述します。
具体的には、以下のようになります。
<action type="accept" task="go" dest="CGIのURL?クエリ名1=$(変数名1);クエリ名2=$(変数名2);…">
この様に、実際に<entry>要素及び<choice>要素で指定した変数名を「$(」「)」で挟む事で、変数に入れられたクエリ値がdest属性の値に反映されるようになります。
この場合、method="post"属性とpostdata属性を加えます。
postdata属性は、実際にCGIにポストされるクエリを記述するものです。
具体的には、以下のようになります。
<action type="accept" task="go" dest="CGIのURL" method="post" postdata="クエリ名1=$(変数名1);クエリ名2=$(変数名2);…">
この様に、実際に<entry>要素及び<choice>要素で指定した変数名を「$(」「)」で挟む事で、変数に入れられたクエリ値がpostdata属性の値に反映されるようになります。
もう一つ、<action>要素には変数に値を代入する機能もあります。
この為には<action>要素にvars属性を付けます。
vars属性の書式は以下の通りです。
vars="変数名1=値1&変数名2=値2&…&変数名n=値n"
この様に、複数の変数に値を入れたい場合は、代入式を「&」で繋ぎます。
尚、変数の値に日本語文字を入れる場合は、URLエンコードしておく必要があります。
HDMLでは入力フォームのデータのやり取りに変数を用いますが、その変数を初期設定するには、<nodisplay>要素による非表示カードを使います。
書式は以下の通りです。
<nodisplay name="カード名"><action type="accept" task="go" dest="#次のカード名" vars="変数名1=初期値1&変数名2=初期値2&…"></nodisplay>
<action type="accept">要素のvars属性で変数に代入する事が出来ます。
尚、<nodisplay>カード内の<action type="accept">要素はacceptキーを押下しなくても自動的に実行されます。
実際に入力フォームを組む場合、以下のようにすればよいでしょう。
この場合、入力用の<entry>要素及び<choice>要素から直接送信しても良いでしょう。
例えば、POSTメソッドなら以下のようにすれば良いでしょう。
<nodisplay name="enterPassword"><action type="accept" task="go" dest="#enterPwd2" vars="pwd="></nodisplay><entry key="pwd" name="enterPwd2" noecho="true"><action type="accept" task="go" dest="http://www.uso800.ne.jp/cgi/certify.cgi" method="post" postdata="password=$(pwd)" label="認証"><action type="soft1" task="go" dest="prev.hdml" label="戻る">パスワードを入力して下さい。</entry>
この場合、先行する<nodisplay>要素でパスワードを収めておくpwd変数に空文字列を代入しておき、その上で後続の<entry>カードに移動します。
そして、<entry>カードで入力されると、acceptキーの押下で当該パスワードが送信される事になります。
この場合、一番目の項目から順番に入力するようにして、最後の入力が終わったら送信すると形で良いでしょう。
以下に、HTMLの入力フォーム関連要素で紹介したフォームをHDMLで書き直してみました。
<nodisplay name="BBS"><action type="accept" task="go" dest="#form" vars="name=&mail=&sex=&place=&text="></nodisplay><entry key="name" name="form"><action type="accept" task="go" dest="#form2" label="次へ"><action type="soft1" task="go" dest="prev.hdml" label="戻る">お名前を入力して下さい。</entry><entry key="mail" name="form2" emptyok="true"><action type="accept" task="go" dest="#form3" label="次へ"><action type="soft1" task="go" dest="#form" label="戻る">メールアドレスを入力して下さい(省略可)。</entry><choice key="sex" name="form3"><action type="accept" task="go" dest="#form4" label="次へ"><action type="soft1" task="go" dest="#form2" label="戻る">性別を撰んで下さい。<ce value="m">男性<ce value="f">女性</choice><choice key="place" name="form3"><action type="accept" task="go" dest="#form5" label="次へ"><action type="soft1" task="go" dest="#form3" label="戻る">お住まいの地域を撰んで下さい。<ce value="North">北海道・東北<ce value="East">関東・甲信越<ce value="Central">中部・北陸<ce value="West">関西・中四国<ce value="South">九州・琉球<ce value="Foreign">日本国外</choice><entry key="text" name="form5" emptyok="true"><action type="accept" task="go" dest="http://www.uso800.ne.jp/cgi/bbs.cgi" method="post" postdata="name=$(name);mail=$(mail);sex=$(sex);place_=$(place);text=$(text)" label="投稿"><action type="soft1" task="go" dest="#form4" label="戻る">最後に、本文を入力して下さい。</entry>
HDMLでは、<entry>要素と<choice>要素しか利用出来ません。
これだけでも大抵の事は出来ますが、複数選択が可能な<input type="checkbox">要素や<select multiple="multiple">要素を再現するのはちょっと難しいです。
複数選択を出来ないようにするなど工夫すると良いでしょう。