- ベストアンサー
Flashでのメールフォーム作成方法とは?
- Flashでメールフォームを作成する際、LoadVarsを利用して変数名をCGIに送信することができます。
- テキストエリアの値はプロパティで指定できるため、送信することができます。
- しかし、チェックボックスの値を受け渡す方法がわかりません。Flashのメールフォームでチェックボックスの情報を送信する方法について教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
CheckBox コンポーネントは Flash MX(現在最新版である Flash 8 の、2世代前にあたる Flash )から登場しましたが、Flash MX と、MX 2004 および Flash 8 とでは扱い方が異なります。 問題は CheckBox コンポーネントの選択状況を取得する方法だと思いますので、紙面の都合上、その方法だけご紹介します。 どの Flash をお使いの場合も、まず、CheckBox コンポーネントのインスタンスに名前を付けてください。 ここでは仮に、” mail_send ”とします。 Flash MX 2004 と Flash 8 の CheckBox コンポーネントは、CheckBox というクラスで制御します。 CheckBox クラスには、選択状態を管理している selected というプロパティがあります。選択されている場合は true 、選択されていない時は false が入っています。 例えば checked = mail_send.selected; このようにすると、変数 checked に mail_send の選択状態( true または false )が代入されます。 Flash MX の CheckBox コンポーネントは FCheckBox オブジェクトで制御できますが、FCheckBox オブジェクトには selected プロパティがありません。 代わりに、選択状況を取得する getValue という関数(メソッド)が用意されています。 先述の MX 2004 や Flash 8 の CheckBox と同じことをするスクリプトは、 checked = mail_send.getValue(); このようになります。 MX 2004 ・Flash 8 ではプロパティを参照するので ( ) は不要でしたが、Flash MX の getValue はメソッドですので、( ) をお忘れなく。 --------------------------------------------------- CheckBox コンポーネントの選択状況が取得できれば、後は、どのようにでも加工して送信できます。 CGIプログラムに直接ブール値で送ると上手く送信できないこともありますから、予め”true”や”false”といった文字列に変換して送るのも1つの方法です。 String 関数を使うと、様々な表現を文字列に変換することができます。 例えば checked = String( mail_send.selected ); とすると、変数 checked には、ブール値ではなく”true”または”false”という文字列が入ります。 HTML のように、ある決まったテキストとして送信する場合は、 if( mail_send.selected ) { checked = "希望する"; } などとすればできますけれど、日本語での送信は文字コードの問題や容量が多いこともあり、半角文字で済むものをわざわざ全角に直して送信するのは、あまりおすすめしません。 LoadVars の使い方については、今回は割愛させていただきました。 上記の要領で取得した CheckBox の選択状況を LoadVars オブジェクトに設定して、CGIに送信してください。 CheckBox コンポーネントはムービークリップの一種で、ActionScript では独立した1つの階層として見なされます。 選択状況を取得したり、LoadVars オブジェクトに送信する内容を設定する際は、ターゲットパスにもご注意ください。
その他の回答 (1)
- DPE
- ベストアンサー率85% (666/776)
#1です。 上手くいかない理由はいろいろ考えられます。 特にCGIと連携する場合は、Flash から正常に送信できていてもCGIの都合で上手くいかない可能性も考えられます。 まず、CGI側で利用する変数名を確認してください。 この変数名と Flash から送信する変数名が一致していないと、CGIに情報が渡りません。 日本語を送信して文字化けが発生する場合は、文字コードの不一致が原因と思われます。 Flash からは、何も指定しなければ UTF-8 という文字コードで送信されます。 --------------------------------------------- 先述の通り、CGIとの連携が上手くいかない理由はいろいろと考えられますので、何が悪いとは一言では言えません。 Flash からの送信がそもそも上手くいかないなら、大抵はターゲットパスの誤りやCGIでの変数名が一致していないことなどが原因です。 仮に、ステージに「テキスト入力」のテキストフィールドと CheckBox コンポーネントのインスタンス” check1 ”、送信ボタンであるボタンシンボルのインスタンスがあるとします。 ( Flash MX ではムービークリップをボタンとして使用できますが、ターゲットパスが必要になります。単純な送信ボタンなら、ボタンシンボルでも充分です) テキストフィールドの「プロパティ」で設定する変数名(入力された文字を格納する変数)は” mail_body ”とします。 この変数名は Flash の中だけで使いますので、CGIで受け取る変数名と一致していなくても構いません。 CGIでは、メールの本文を” body ”、CheckBox の選択状況を” mail_send ”という変数で受け取るとします。 この変数名は呼び出すCGIによって異なりますので、事前に確認し、適宜変更してください。 送信ボタンがクリックされた時にテキストフィールドに入力した内容と CheckBox の内容を送信するスクリプトは、大体、次のようになります。 このスクリプトは、送信ボタンに設定してください。 (↓各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください。このまま使うとシンタックスエラーになります) on(release) { //チェックボックスの選択状況を取得 if( check1.getValue() == true ) { checked = "希望する"; } else { checked = "希望しない"; } //送信する情報の準備 send_obj = new LoadVars(); send_obj.body = mail_body; send_obj.mail_send = checked; //情報を送信 send_obj.send( "***.cgi" , "_blank" , "POST" ); } まず、ターゲットパスについてですが。 ActionScript では、参照するインスタンスや変数・関数がどの階層にあるかを正確に指定しなければなりません。この指定のことを、ターゲットパスと言います。 階層とは一言で言いますと、個々のタイムラインのことです。 ムービークリップにはタイムラインがあるので、ムービークリップは1つの階層になります。 CheckBox はコンポーネントですが、コンポーネントは編集可能なパラメータを持っている”ムービークリップ”というだけでタイムラインを持っていますから、CheckBox コンポーネントのインスタンスも1つの階層と見なされます。 しかし、ボタンシンボルには特殊なフレームが4つあるだけで、タイムラインがありません。 ですから、ボタンインスタンスは1つの階層とは見なされません。 Flash ではムービー自体も1つのムービークリップとして扱い、通常は _root という名前で識別します。 ステージに配置されたムービークリップやボタン・テキストフィールドは、全て _root 階層の子になります。 ターゲットパスは、自分の階層までは省略することができます。 ただし、ボタンインスタンスは1つの階層ではないため、ボタンインスタンスに書いた on アクション内では、ターゲットパスを省略すると親の階層(自分が存在しているタイムライン)のことを指します。 今回の例ですと、テキストフィールド・ CheckBox ・送信ボタンは、全て _root の子です。 そして、送信ボタンはボタンインスタンスであるため1つの階層ではなく、このボタンの on アクション内でターゲットパスが省略されているものは、自分が存在しているタイムラインにあるもの、つまり _root の持ち物を指します。 要するに、このボタンに書いた on アクションの中では、CheckBox やテキストフィールドに設定された変数名のターゲットパスを省略して参照することができるということです。 LoadVars でCGIに送信する時は、まず、 LoadVars オブジェクト.CGIが受け取る変数名 = 値; として情報を用意します。 言うなれば、LoadVars というカゴの中に情報を入れ、カゴごとまとめてCGIに渡すようなものですね。 上記のスクリプトでは、LoadVars オブジェクトの” send_obj ”という変数を作り、この中に送信する情報を準備して送信しています。 LoadVars オブジェクトに正しく情報がセットされているかどうかは、デバッガという機能か for in を使って確認できます。 先のスクリプトの send_obj.send(・・・); の前に for( name in send_obj ) { trace( name + " = " + send_obj[ name ] ); } このようなスクリプトを入れて、「ムービープレビュー」で確認してみてください。 送信する情報の数だけ、” LoadVars で定義した変数名 = 値”という形で「出力」パネルに表示されます。 上手くいかない時は、CGIで利用している変数名と LoadVars で送る変数名が正しく一致しているかどうかや、値が undefined (未定義)になっていないかどうか、送信前にチェックしてみてください。 値が undefined になるのは、ターゲットパスや Flash で使っている変数名が間違っていて変数を正しく参照できていない場合が殆どです。
お礼
今確認したところ格納変数名を変えたにもかかわらず、CGIのほうを修正していませんでした。 お手数をおかけして申し訳ありませんでした。。。 親切に回答してくださってありがとうございました。 また何かありましたらよろしくお願いいたします。
お礼
ご回答ありがとうございます。 大変参考になりました。 私はMXユーザーなので チェックボックス名=check1として フォームの送信ボタンのon(press)内に if(check1.getValue() == ture){ checked="希望する"; } というif文をいれてみたのですが、うまくいきませんでした。 そもそも全く使い方が間違っているのか、パスが通っていないのか、原因がよくわかりません。 パスの指定の仕方がよくわからないのですが、どのようにすればよいのでしょうか?