フォームの入力値に応じて、次のフォームを出し分ける
例えば最初のフォームにラジオボタンがあったとして、
- Aを選択した場合→続けてAフォームを出したい
- Bを選択した場合→続けてBフォームを出したい
という場合に使えるものです。アイデア次第でステップフォームの入力とかに使えるやつですね。カスタムモジュールのフィールドとしては
- フォーム選択(フォームセレクタフィールド)
- 出し分けに利用するプロパティ名(テキストフィールド)
- 出し分けフォーム(グループ&リピート)
- プロパティ値(テキストフィールド)
- フォーム選択(フォームセレクタフィールド)
という感じです。
コードはおおよそ次の通りです。最初のデータ整形の部分が少しゴチャゴチャしてしまっていますが……redirectUrlを<script>内で後からHubLで取れないので仕方ないですね。
{%- set forms = module.conditional_form|map('form') -%} {%- set content_ids = forms|map('redirect_id') -%} {%- set contents = content_by_ids(content_ids) -%} {%- set conditional_forms_with_url = [] -%} {%- for obj in module.conditional_form -%} {%- set url = [obj.form.redirect_url] -%} {%- if obj.form.redirect_id -%} {%- for cont in contents -%} {%- if cont.id == obj.form.redirect_id -%} {%- do url.clear() -%} {%- do url.append(cont.absolute_url) -%} {%- endif -%} {%- endfor -%} {%- endif -%} {%- do conditional_forms_with_url.append({ property_value: obj.property_value, form_id: obj.form.form_id, response_type: obj.form.response_type, redirect_url: url[0], message: obj.form.message|escape, }) -%} {%- endfor -%} <script charset="utf-8" type="text/javascript" src="//js.hsforms.net/forms/v2.js" ></script> <script> const firstFormId = "{{ module.form.form_id }}" const conditonalForms = {{ conditional_forms_with_url|tojson }} let valForCondition let currentFormId = firstFormId window.addEventListener('message', event => { if( event.data.type !== 'hsFormCallback' || firstFormId !== currentFormId ) { return false; } if(event.data.eventName === 'onFormSubmit') { const prop = event.data.data.find(obj => obj.name === '{{ module.propety_for_condition }}') valForCondition = prop.value } if(event.data.eventName === 'onFormSubmitted') { const form = conditonalForms.find(obj => obj.property_value === valForCondition) currentFormId = form.form_id const formOption = { region: "na1", portalId: "{{ hub_id }}", formId: form.form_id, } if(form.response_type === 'redirect') { formOption.redirectUrl = form.redirect_url } else if (form.response_type === 'inline') { formOption.inlineMessage = form.message } hbspt.forms.create(formOption); } }); </script>
この例では1つ目のフォーム送信後はインラインメッセージを表示させ、そのまま2つ目のフォームを表示させることを想定していますが、1つ目送信後に遷移させたページの方で出し分けを行うことも可能です。
フォームを分けるのが嫌で、全体として1つのステップフォームとしたい場合はスクラッチでフォームをマークアップして、Submit data to a formのAPI経由でフォーム送信することになるでしょう。