カードには「key=""」で入力される値を操作する名称が必要となる、とお話ししたと思いますが、実はこれこそが「変数」の機能を表しています。そして、過去に指定された変数の値は、「$変数名」で後から簡単に呼び出すことができます。
<HDML version="3.0" public="true">
<ENTRY name="1" key="name">
<ACTION type="accept" task="go" dest="#2">
名前を入力してください:
</ENTRY>
<DISPLAY name="2">
入力された名前は$nameです。
</DISPLAY>
</HDML>
|
<ACTION>タグの内容については、次回に詳しく触れますので、ここでは次のカードに移るときに使用しているリンクのようなものとお考え下さい。
さて、この例の場合、「name="1"」の<ENTRY>カードで入力された文字列が「name="2"」の<DISPLAY>カードで呼び出されて表示されています。つまり、<ENTRY>カードでユーザーが入力した内容によって、「name="2"」の<DISPLAY>カードで表示される内容はまちまちになってくるということです。
|
→ |
|
これは、入力させながら確認のページ等をウイザード形式で作っていく場合、非常に便利な機能なのです。「変数」データは端末のメモリ内部に格納され、確認ページを表示するためにわざわざネットワークに接続に行く必要がありません。
さらに、
<HDML version="3.0" public="true">
<CHOICE name="1" key="sex">
性別を選んでください
<CE task="go" dest="#2" value="男">男
<CE task="go" dest="#2" value="女">女
</CHOICE>
<DISPLAY name="2">
あなたの性別は$sexです。
</DISPLAY>
</HDML>
|
のように、なにも<ENTRY>カードだけを使用する必要もありません。このようにリンクをはる際に変数を受け渡すことも可能です。
|
→ |
|
また、もっと手っ取り早く、「vars=""」というオプションを指定する方法があります。これは「vars="変数名=変数値&変数名=変数値…"」という形で、変数名とその値を一度に複数まとめて送ることができる機能です。これを使用すれば、
<HDML version="3.0" public="true">
<DISPLAY name="1" key="sex">
<A task="go" dest="#2" vars="name=Takashi&sex=man">情報を送ります</A>
</DISPLAY>
<DISPLAY name="2">
あなたの名前は$name、
あなたの性別は$sexです。
</DISPLAY>
</HDML>
|
とすることができます。ただし、この場合、「vars=""」の中には日本語のような2バイトの文字列を入れることはできません。
|
→ |
|
何か数学の方程式のようで面白いのですが、いくつか気をつけるべき点があります。
- 1つの<ENTRY>カードを使用して渡すことのできる文字列は最大255文字
- 変数のデータ全体(変数名+変数値)には上限がある
- 変数はアクティビティを終了しないとクリアされない
がその注意点です。上の2点は物理的な制約なので、守れば済んでしのまうと思うのですが、3つ目の点には特に留意する必要があります。ここでアクティビティの2つ目の機能の話に戻ってくるのです。
■ 変数の範囲
HDMLにおいて、使用する変数はアクティビティの中の1つのデータとして扱います。ブラウザーがアクティビティを終了したとか、新しいアクティビティに入ったということを理解しない限り、変数は端末に常に保存されるのです。
ここで1つ、困ったことが発生します。
例えば、あるカードでSSLを使用し、個人のクレジットカード番号を入力してもらうとしましょう。変数の機能を使用して、端末上でこの番号の使いまわしができるようなサイトを作ったとします。
さて、アクティビティの機能を使用しなかった場合、クレジットカードの番号を入力した後、他のサイトに行ったとしたらどうでしょう? 端末のメモリには、クレジットカード番号が入った変数の情報が残ったままです。容易に推測できるような変数名をつけていると、これを狙って悪意のある第三者が変数のデータをいとも簡単に取得してしまうということも考えられるのです。
というわけで、これは非常に危険な行為なので、必ず変数の機能を使用する場合はアクティビティを使用するようにすべきです。「task="return"」か「task="cancel"」で戻った場合、そのアクティビティで入力された変数情報はすべてクリアされるので安心です。もし心配だという方は「UP.Simulator」に変数を確認するツールがあります。「Info」メニューの「Vars」がそれにあたります。こうしたサイトを作った場合は、万が一に備えて、必ず確認するようにしましょう。
■変数のテクニック
【その1】
「dest=""」の部分に日本語の文字列を入れると、よくエラーが起こるのですが、これを回避する方法があります。
<HDML version="3.0" public="true">
<CHOICE name="1" key="1">
質問1(1/2)<BR>
この連載をどこで知りましたか?
<CE task="go" dest="#2" value="雑誌">雑誌
<CE task="go" dest="#2" value="PCインターネット">PCインターネット
<CE task="go" dest="#2" value="口コミ">口コミ
<CE task="go" dest="#2" value="メーリングリスト">メーリングリスト
<CE task="go" dest="#2" value="検索サイト">検索サイト
</CHOICE>
<DISPLAY name="2">
あなたは$1を選びましたね。これでよろしければ下の送信ボタンを押してくだい。<BR>
<A task="go" dest="http://xxxx.com/cgi-bin/test.cgi?1=$1">送信実行</A>
</DISPLAY>
</HDML>
|
のようにすることで、コンパイルエラーを防ぐことができます。
|
→ |
|
→ |
CGIで処理 |
<A task="go" dest="http://xxxx.com/cgi-bin/test.cgi?1=検索サイト">
となるとエラーが発生しますが、上の例のように変数の機能を使用すると大丈夫です。やや専門的な言い方になりますが、これは、いわゆるGETメソッドでサーバーにデータを送る場合にも特に問題なく利用できる方法です。
また、ここで使用した「$変数名」ですが、本当は「$(変数名:esc)」というのが正式な変数の表記方法ですが、通常は単に「$変数名」でOKです。「:esc」が入るとURLエスケープシーケンスが適用されたものが代入されまますが、ここを「$(変数名:noesc)」とすることで、そうしたURLエスケープシーケンスをオフにした形で情報を受け渡す事も可能です。
【その2】
1つのアクティビティとして端末が保持できるデータの最大容量は1000バイトです。これは、アクティビティの構造・履歴内容・変数データのすべてを含んだデータ量となります。アクティビティの中身が異常に大きくなると、アクティビティの戻り値がブラウザーのトップページになってしまい、変数のデータもクリアされてしまうのでご注意ください。
【その3】
変数を再起的に使用する方法は、ブラウザーに過度な負担をかけることに繋がるので、「UP.SDK」の「Developer’s Guide」では、この点が非推奨として書かれています。
【その4】
「入れ子アクティビティ」というものも使用できます。つまり、アクティビティの中にさらにアクティビティを設定することで、より効果的に戻る・進む機能を駆使したブラウジングの設定ができるのです。
【その5】
変数の機能をアクティビティと組み合わせて強制的に変数のデータを削除する方法があります。この場合、<NODISPLAY>カードをアクティビティの戻り値に指定してやればよいのです。この<NODISPLAY>カードについては次回触れる予定です。
■今回勉強したタグ(オプション)
task="gosub" |
新しいアクティビティに入るためのリンク設定の時に使用する。 |
task="return" |
アクティビティが終了した戻りを指定するときに使用。 |
task="cencel" |
アクティビティが途中で中断した時の戻りを指定するときに使用。 |
今回は、アクティビティがどのようなものなのかということと、その効用を中心に書いて見ました。
アクティビティを既に使用されている方にとっては、もっと詳しい内容、例えば、戻り値の詳細な設定であるとか、「next=""」など細かい部分についても是非書いてほしかったと思われたかもしれません。ただ、それをこの凝縮された連載で一気に書くこと自体に限界を感じますので、詳しくは書籍やガイドブック等で確認してみて、その方程式のようなからくりに慣れ親しんでみてみる、ということをオススメします。
私は個人的に検索エンジンを運営していますが、そこで思うのが、未だにオフィシャルサイトでもなかなかこのアクティビティの機能が使われていないものが多いということです。データベースの検索性や記事の閲覧性という観点から、多くのコンテンツ作成に携わる方がいち早くこのアクティビティの機能に慣れ親しんでいただきたいと心から祈っています。
■ URL
Phone.com Developer Program(HDML WMLコンテンツ制作支援サイト)
http://developer.phone.com/ja/
(佐藤 崇)
2000/10/06 00:00