FormFlowのカスタマイズ
FormFlowがダイアログに組み込めたところで、本格的に使えるようにカスタマイズしてみましょう。まずは選択項目が一つでは物足りないので、追加します。
リスト8:選択項目を追加
01 | public enum CurryOptions { ビーフ, チキン, ポーク, ベジタブル }; |
02 | public enum RiceOptions { ライス, バターライス, ナン }; |
03 | public enum SizeOptions { 大, 中, 小 }; |
04 | public enum ToppingOptions { トンカツ, コーン, ゆで卵, チーズ }; |
07 | public class CurryFormQuery |
09 | public CurryOptions? Curry; |
10 | public RiceOptions? Rice; |
11 | public SizeOptions? Size; |
12 | public ToppingOptions? Topping; |
今回は、上記のリストのような選択項目を追加してみました。エミュレーターで確認してみましょう。
追加された選択項目を確認
だんだんとカレーの注文らしくなってきました。
次にカレーダイアログ終了後、Rootダイアログに戻る際のメッセージ(現状では「カレーはビーフですね」)も修正しておきましょう。RootDialog.csを開き、CurryResumeAfterDialogメソッドを修正します。
リスト9:ダイアログに戻る際のメッセージを修正
01 | private async Task CurryResumeAfterDialog(IDialogContext context, IAwaitable<CurryFormQuery> result) |
03 | var curry = await result; |
05 | await context.PostAsync($@"カレーは {curry.Curry.ToString()} ですね。 |
07 | ライスは {curry.Rice.ToString()} ですね。 |
09 | サイズは {curry.Size.ToString()} ですね。 |
11 | トッピングは {curry.Topping.ToString()} ですね。 |
CurryFormQuery型で受け渡された戻り値には、各選択項目が含まれています。それぞれヒア文字列を使って、文字列型で表示しています。
ダイアログに戻る際に選択結果が受け渡されている
上記の実行結果で、カレーダイアログでの選択結果がきちんと受け渡されていることを確認できました。
今の設定では、選択項目の表示が「rice」「size」「topping」のように英語表記のままになっています。今度は、こちらをカスタマイズしてみましょう。
現状では選択項目が英語表記のままになっている
リスト10:選択項目の表示を日本語に
02 | public class CurryFormQuery |
05 | public CurryOptions? Curry; |
07 | public RiceOptions? Rice; |
09 | public SizeOptions? Size; |
11 | public ToppingOptions? Topping; |
CurryFormQueryクラスで定義している属性に「Describe」で説明を追加することができます。それぞれに分かりやすく日本語名を追加しました。
選択項目の表示が日本語になっている
選択項目の表示が分かりやすくなりました。
複数選択を可能にする
選択項目の中には、複数の項目を選択できるようにしたいものもあります。その場合の設定方法を紹介します。例として、トッピングの種類を増やして、複数選択できるようにしてみましょう。ポイントは、「public List<ToppingOptions> Topping」の記述で、こちらはList型の属性を定義しています。
リスト11:トッピングを複数選べるようにする
01 | public enum CurryOptions { ビーフ, チキン, ポーク, ベジタブル }; |
02 | public enum RiceOptions { ライス, バターライス, ナン }; |
03 | public enum SizeOptions { 大, 中, 小 }; |
04 | public enum ToppingOptions { トンカツ, コーン, ゆで卵, チーズ, トマト, 辛さ増し, ハラペーニョ }; |
07 | public class CurryFormQuery |
10 | public CurryOptions? Curry; |
12 | public RiceOptions? Rice; |
14 | public SizeOptions? Size; |
16 | public List<ToppingOptions> Topping; |
この記述だけで複数選択が可能となります。実行してみましょう。
トッピングは複数選べるようになった
トッピングの選択がボタン形式ではなく、数字入力となっています。半角スペースで区切って数字を入力すれば、複数項目の選択が可能です。
上記の変更に合わせて、カレーダイアログを終了してRootダイアログに戻る際のメッセージも修正しておきましょう。RootDialog.csを開きCurryResumeAfterDialogメソッドを修正します。
for文でList型のcurry.Topping.Countから選択されたトッピングを取り出します。
リスト12:ダイアログに戻る際のメッセージも修正
01 | private async Task CurryResumeAfterDialog(IDialogContext context, IAwaitable<CurryFormQuery> result) |
03 | var curry = await result; |
06 | for (int i = 0; i < curry.Topping.Count; i++) |
08 | topping += " " + curry.Topping[i]; |
11 | await context.PostAsync($@"カレーは {curry.Curry.ToString()} ですね。 |
13 | ライスは {curry.Rice.ToString()} ですね。 |
15 | サイズは {curry.Size.ToString()} ですね。 |
ダイアログに戻る際に、複数選択したトッピングが受け渡されている
Rootダイアログに戻る際に、複数選択の結果が取得できました。
以上紹介してきた内容以外にも、FormFlowには数多くのカスタマイズ項目が用意されています。テンプレート的な型にはまった機能とはいえ、ご希望のスタイルにかなり近づけることが可能です。開発効率アップには欠かせないFormFlow、ぜひお試しださい。