フォーム入力の確認画面をWebサイト上に設定する方法
目次
商品の注文や個人情報の送信などでフォームを送信する際に、事前に入力内容を確認したい方も多いのではないでしょうか。
HubSpotにはフォームを作成する機能がありますが、標準機能に確認画面はありません。ですが、コーディング上で工夫することで確認画面を実装することができます。
本記事で、HubSpotでフォームの確認画面を実装する手順をご紹介します。
HubSpotについて相談したい方へ
JBNについて(資料ダウンロード)
HubSpotフォームの確認画面の実装手順
HubSpotフォームで確認画面を生成するには、カスタムモジュール内のフォームフィールドを使用します。
今回は、Forms APIの1つであるSubmit form dataを用いてjQueryで実装します。
1.カスタムモジュールの作成
デザインツールでカスタムモジュールを新規作成し、フォームフィールドを追加します。
2.コードの記述
jQueryを読み込み、JavaScriptコードを記述します。必要があれば、CSSコードも記述します。
【実際のコード】
{% form form_to_use="{{ module.form.form_id }}" %}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
{% require_js %}
<script>
(function() {
const hsForm = (function () {
let inputData = [];
let $formWrapper;
let $rootElm;
let $formFields;
let $submitBtn;
/**
* 共通で使う変数のセット、HubSpot標準フォームの送信イベントを乗っ取るためのイニシャライズを行う
* @param {String} selector
*/
function initialize(selector) {
$formWrapper = $(selector);
$rootElm = $formWrapper.parent();
$submitBtn = $formWrapper.find('.actions input[type=submit]');
$submitBtn.on('click', function(e) {
e.preventDefault();
// 依存フィールドなども考慮しこのタイミングでフィールド収集
$formFields = $formWrapper.find('.hs-form-field');
validateForms().done(function (){
$('.js_hsFormErrorMessage').remove();
inputData = returnFormData();
showConfirmation(inputData);
});
validateForms().fail(function() {
if ($('.js_hsFormErrorMessage').length < 1) {
$('<p class="js_hsFormErrorMessage" style="color: #ff5722;">入力項目を確認してください</p>').appendTo($rootElm);
}
});
});
}
/**
* 各フォームパーツに.change()をかけ、HubSpotフォーム標準のバリデーションを呼び出す
*/
function validateForms() {
const defer = $.Deferred();
$formFields.each(function() {
if ($(this).find('select').length) {
$(this).find('select').trigger('change');
} else if ($(this).find('textarea').length) {
$(this).find('textarea').trigger('change');
} else if ($(this).find('input[type=radio]:checked').length) {
return true;
} else {
$(this).find('input').change();
// TODO: Eメールが漏れることある
}
});
// エラーメッセージを確実に出してから判定したいためsetTimeout
setTimeout(function() {
if ($('.hs-error-msg').length) {
defer.reject();
} else {
defer.resolve();
}
}, 100)
return defer.promise();
}
/**
* 確認画面の表示、またHubSpot CRMヘデータ送信するために各フォームからデータを収集し、オブジェクトを含んだ配列を返す
* @return {Array} 各オブジェクトはlabel, name, value, valueLabelをキーに持つ
*/
function returnFormData() {
return $formFields.map(function() {
let $formParts;
let name;
let valueLabel = [];
if ($(this).find('.hs-dateinput').length) {
$formParts = $(this).find('input');
} else if ($(this).find('select').length) {
$formParts = $(this).find('select');
const $option = $formParts.find('option[value=' + $formParts.val() + ']')
valueLabel.push($option.text());
} else if ($(this).find('textarea').length) {
$formParts = $(this).find('textarea');
} else if ($(this).find('input[type=radio]').length) {
$formParts = $(this).find('input[type=radio]:checked');
valueLabel.push($formParts.siblings('span').text());
// チェックしていないときのために、:checked以外でnameを取得
name = $(this).find('input[type=radio]').attr('name');
} else if ($(this).find('input[type=checkbox]').length) {
$formParts = $(this).find('input[type=checkbox]:checked');
name = $(this).find('input[type=checkbox]').attr('name');
$formParts.each(function() {
valueLabel.push($(this).siblings('span').text());
})
} else {
$formParts = $(this).find('input');
}
const label = $(this).find('label span:first').text().replace(/\*/, '');
const val = (function() {
if ($formParts.length > 1) { // チェックボックスなど複数の値がある場合
return $formParts.map(function() {
return $(this).val();
}).get();
} else {
return $formParts.val();
}
})();
return {
label: label,
name: name ? name : $formParts.attr('name'),
value: val,
valueLabel: valueLabel.join('、')
}
}).get();
}
/**
* 確認画面を生成する
* @param {Array} data
*/
function showConfirmation(data) {
// 現在のスクロール位置を保存
const scrollTop = $(window).scrollTop();
$formWrapper.hide();
// 確認用テーブルの生成、アペンド
let $confirmationWrapper = $('<div class="form-confirm"></div>');
let $table = $('<table></table>');
function generateConfirmationValue(inputDataItem) {
if (inputDataItem.value === 'true') {
return 'はい';
} else if (inputDataItem.value === 'false') {
return 'いいえ';
} else {
// プルダウンやラジオボタン、複数のチェックボックスなどはvalueに対応するラベルを表示する ex)man→男 woman→女
if (inputDataItem.valueLabel) {
return inputDataItem.valueLabel;
}
return inputDataItem.value ? inputDataItem.value : '';
}
}
// 入力のあった項目のみを表示するための変更
data.forEach(function (item) {
if (item.value) { // 入力がある場合のみ表示
const val = generateConfirmationValue(item);
$('<tr><th>' + item.label + '</th><td>' + val + '</td></tr>').appendTo($table);
}
});
$table.appendTo($confirmationWrapper);
$confirmationWrapper.appendTo($rootElm);
// 戻る/送信ボタンの生成、アペンド
let $btnWrapper = $('<div class="form-buttons"></div>')
const $prevBtn = $('<a href="#" class="form-buttons__button--return">戻る</a>');
const $submitBtn = $('<a href="#" class="form-buttons__button--submit">送信</a>');
$prevBtn.on('click', function() {
$confirmationWrapper.hide();
$formWrapper.show();
});
$submitBtn.on('click', function() {
sendDataToHS(data);
});
$prevBtn.appendTo($btnWrapper);
$submitBtn.appendTo($btnWrapper);
$btnWrapper.appendTo($confirmationWrapper);
// ページトップにスクロール
$(window).scrollTop(0);
updateConfirmationHeading();
}
/**
* HubSpot CRMへデータ送信
* @param {Array} data
*/
function sendDataToHS(data) {
// 入力のない項目を削除
let filteredFormData = data.filter(function (item) {
return item.value;
});
// HubSpot APIの形に合わせ不要なプロパティの削除、配列をセミコロンで結合
const formData = filteredFormData.map(function (item) {
delete item.label;
delete item.valueLabel;
if (Array.isArray(item.value)) {
item.value = item.value.join(';');
}
return item;
});
function getCookieAsObj(){
if(document.cookie === '') return false;
let obj = {}
document.cookie.split(';').forEach(function(str) {
const keyValArr = str.split('=');
obj[keyValArr[0].replace(/ +/g, '')] = decodeURIComponent(keyValArr[1])
})
return obj;
}
const sendData = {
fields: formData,
context: {
hutk: getCookieAsObj().hubspotutk,
pageUri: '{{ content.absolute_url }}',
pageName: '{{ page_meta.html_title }}'
},
}
$.ajax({
type: 'POST',
url: 'https://api.hsforms.com/submissions/v3/integration/submit/{{ hub_id }}/{{ module.form.form_id }}',
dataType: 'json',
headers: {
'Content-Type':'application/json'
},
data: JSON.stringify(sendData)
})
.done(function (data) {
afterSubmit();
})
.fail(function (jqXHR, textStatus, err) {
console.error(textStatus);
if ($('.js_hsFormErrorMessage').length < 1) {
$('<p class="js_hsFormErrorMessage" style="color: #ff5722;">データの送信に失敗しました。インターネットの接続状況をご確認いただくか、お手数ですが時間をおいて再度お試しください。</p>').appendTo($rootElm);
}
});
}
/**
* ページ編集画面のカスタムモジュールの設定に基づいた、フォーム送信後の挙動を実現
*/
function afterSubmit() {
if ('{{ module.form.response_type }}' === 'redirect') {
location.href = '{{ module.form.redirect_id ? page_by_id(module.form.redirect_id).absoluteUrl : module.form.redirect_url }}';
} else {
$rootElm.children().remove();
$('{{ module.form.message|replace("\n", "") }}').appendTo($rootElm);
}
}
return {
init: initialize
}
})()
window.addEventListener('message', event => {
if(event.data.type === 'hsFormCallback' && event.data.eventName === 'onFormReady') {
hsForm.init('.hsForm_{{ module.form.form_id }}');
}
});
})();
</script>
{% end_require_js %}
3.カスタムモジュールのページへの追加
確認画面を生成したいページに、先程作成したカスタムモジュールを追加し、該当のフォームを選択します。
フォームを選択すると、フォームの設定を変更することができますが、確認画面付きのフォームの場合、送信ボタンを押すと確認画面に遷移します。そのため送信ボタンのテキストは「入力内容を確認する」のようにしておくことをおすすめします。
4.ページを公開する
ページを公開して完成です。実際に以下のようなフォーム入力の確認画面が生成されます。
フォーム入力画面に戻って修正する際も、入力内容を保持したまま修正できるので、一から入力し直す必要はありません。
以上の手順で、確認画面がないHubSpotのフォームに確認画面を実装することが可能になります。
※掲載したソースコードをご利用される場合は、自己責任のもとご利用ください。
HubSpotの活用にお困りの方へ
JBNは多くの企業様のHubSpotの導入や運用を支援しており、多くの知見があります。HubSpotを導入しているが、活用しきれていないという方にも、お客様のニーズに合わせた支援を行うことが可能です。
どんなお悩みでもお気軽にご相談ください。
JBNはHubSpotの導入支援やAPI連携、システム開発も得意としています。
「HubSpotを便利に、効果的に使いたい」とお悩みの方はお気軽にご相談ください。
JBNについて(資料ダウンロード)
株式会社JBNの特徴や、HubSpotを用いたwebサイトの実績についてご確認いただけます。