SPIRAL ver.2では内覧の予約受付から内覧後のアンケート、検討状況の確認対応やメール配信を行うモデルルーム予約管理アプリの構築が可能です。
アプリ(DB・メール)設計・構築 / サイト設計・構築 / ユーザ・アプリロール・グループ設定
に各工程を分け、ポイントやおすすめ機能・強化ガジェットを紹介いたします。
この記事は サイト設計・構築 のフェーズとなります。
関連記事はこちら
SPIRAL ver.2はプログラミング経験がなくても、オリジナルの業務アプリの制作・カスタマイズができるローコード開発プラットフォームです。
詳しくは SPIRAL ver.2 とはをご覧ください。
アプリ(DB・メール)設計・構築 / サイト設計・構築 / ユーザ・アプリロール・グループ設定
に各工程を分け、ポイントやおすすめ機能・強化ガジェットを紹介いたします。
この記事は サイト設計・構築 のフェーズとなります。
関連記事はこちら
- アプリ(DB・メール)設計・構築
- サイト設計・構築
- ユーザ・アプリロール・グループ設定
SPIRAL ver.2はプログラミング経験がなくても、オリジナルの業務アプリの制作・カスタマイズができるローコード開発プラットフォームです。
詳しくは SPIRAL ver.2 とはをご覧ください。
サイト機能
SPIRAL ver.2 のサイト管理機能では、静的なWebページを作成したり、
データベースに対して登録・更新するフォーム や データベースの情報を一覧形式で表示させるページなどを作成できます。
詳細は、サイト機能の全体像を確認してください。
今回は、サイト機能を使って、「内覧予約ページ」「登録情報変更ページ、予約キャンセルページ」「アンケートページ」「資料請求・ダウンロードページ」を作成します。
データベースに対して登録・更新するフォーム や データベースの情報を一覧形式で表示させるページなどを作成できます。
詳細は、サイト機能の全体像を確認してください。
今回は、サイト機能を使って、「内覧予約ページ」「登録情報変更ページ、予約キャンセルページ」「アンケートページ」「資料請求・ダウンロードページ」を作成します。
注意
設定の説明部分にて、ソースコードを記載しております。
ソースコードに記載されている 各種リンク や name値、規約含めて文言などは、デモの環境に合わせたものとなります。
実際に同様のものを作成する際は、変更が必要となる箇所がありますので、ご注意ください。
「siteClient.record[○○]」という箇所には、フィールドID(name属性から「f0」を除いた数字)が入ります。
「p0○○」という箇所には、ページIDが入ります。
サイト管理 > ページ > 対象のページ > 基本設定 > IDからご確認ください。
ソースコードに記載されている 各種リンク や name値、規約含めて文言などは、デモの環境に合わせたものとなります。
実際に同様のものを作成する際は、変更が必要となる箇所がありますので、ご注意ください。
ソース内の「f0○○」と「record[○○]」、「siteClient.record[○○]」、「p0○○」について
ソース内の「f0○○」、「record[○○]」という箇所には、ブロックのフィールド一覧に記載されている識別名が入ります。「siteClient.record[○○]」という箇所には、フィールドID(name属性から「f0」を除いた数字)が入ります。
「p0○○」という箇所には、ページIDが入ります。
サイト管理 > ページ > 対象のページ > 基本設定 > IDからご確認ください。
フロー・使用機能の整理
内覧予約フロー
▼ 内覧予約で使用する機能
ページ機能 | 内覧予約トップページなどの各ページ |
---|---|
ブロック機能 | レコードリスト ※ 内覧予約トップページで予約物件一覧と物件詳細ページで予約可能日一覧を表示するために使用しています |
ブロック機能 | レコード検索 ※ 予約可能日一覧から、希望の日付で検索するために使用しています |
ブロック機能 | レコードアイテム ※ 物件の詳細情報を表示するために使用しています |
ブロック機能 | 登録フォーム ※ 内覧予約ページで使用しています |
ブロック機能 | フリーコンテンツ ※ ヘッダ と フッター を共通化するために使用しています |
登録情報変更、予約キャンセルフロー
▼ 内覧予約後の登録情報変更とキャンセルで使用する機能
認証エリア | 内覧予約後の登録情報変更とキャンセルで使用するための認証機能 ※ メール本文中にある専用リンクからアクセス可能なクリックログイン認証を使用します |
---|---|
ページ機能 | 登録情報変更、キャンセルページ |
ブロック機能 | 更新フォーム ※ 登録情報変更ページ、予約キャンセルページで使用しています |
ブロック機能 | フリーコンテンツ ※ 内覧予約フローで作成した ヘッダ と フッター を使用します |
資料請求フロー
▼ 資料請求して、ダウンロードする機能
認証エリア | 資料請求後の資料ダウンロードページ表示用の認証機能 ※ メール本文中にある専用リンクからアクセス可能なクリックログイン認証を使用します |
---|---|
ページ機能 | 資料請求、ダウンロードページ |
ブロック機能 | レコードリスト ※ 資料ダウンロードページでダウンロードする資料を表示するために使用しています |
ブロック機能 | 登録フォーム ※ 資料請求ページで使用しています |
ブロック機能 | フリーコンテンツ ※ 内覧予約フローで作成した ヘッダ と フッター を使用します |
アンケートフロー
▼ 内覧案内後や検討状況を確認するためのアンケート機能
【完成イメージ】
認証エリア | アンケート表示用の認証機能 ※ 登録情報変更、キャンセルフローで作成した認証エリアを使用します |
---|---|
ページ機能 | 案内後アンケート、検討状況アンケートページ |
ブロック機能 | 登録フォーム ※ 案内後アンケートページで使用しています |
ブロック機能 | 更新フォーム ※ 検討状況アンケートページで使用しています |
ブロック機能 | フリーコンテンツ ※ 内覧予約フローで作成した ヘッダ と フッター を使用します |
内覧予約トップページ
物件詳細ページ
全体のフォルダ構成


内覧予約認証エリアと公開ページの作成
手順1:サイトファイルの設置
内覧予約アプリで使用する画像を設置します。
内覧予約フローの内覧予約トップページで使用します。
メインビジュアル:
ヘッダ用ブロックで使用します。
ロゴ画像:
サイトファイルの設置に関しては、下記を参照ください。
サイトファイル
内覧予約フローの内覧予約トップページで使用します。
メインビジュアル:

ロゴ画像:

サイトファイルの設置に関しては、下記を参照ください。
サイトファイル
手順2:内覧予約認証エリアを作成
内覧予約アプリを作成するため、認証エリアのタブより認証エリアの作成を行います。
識別名がURLのディレクトリ名になるので、使用したいURLの階層に合わせて設定してください。
認証エリアの中でも認証が不要なページも作成できます。
今回は、認証エリア内にクリックログインページと誰でも見ることができる非認証のページを作成します。
識別名がURLのディレクトリ名になるので、使用したいURLの階層に合わせて設定してください。
認証エリアの中でも認証が不要なページも作成できます。
今回は、認証エリア内にクリックログインページと誰でも見ることができる非認証のページを作成します。
手順3:内覧予約トップページを作成
手順2で作成した認証エリアの「+」ボタンから新規ページを作成します。
内覧予約トップページは公開ページのため、認証はなしで設定します。
設定方法は、ソース設定を選択します。
内覧予約トップページは公開ページのため、認証はなしで設定します。
設定方法は、ソース設定を選択します。
手順4:ヘッダ と フッターのフリーコンテンツの作成
手順3で作成したページの BODY から「+」ボタンを押下し、フリーコンテンツブロックで共通となるヘッダを作成します。
すぐに使える!ヘッダ&フッター テンプレートを元に作成しています。
フッターも同様の手順で作成してください。
すぐに使える!ヘッダ&フッター テンプレートを元に作成しています。
フッターも同様の手順で作成してください。
ヘッダ用HTML
<header class="header"> <a th:href="${pages['p0xxxx']?.path ?:'/404'}" class="header-logo"> <img src="/_media/roomApp/img/logo.png" alt="logo.png"> </a> <nav class="header-nav"> <input id="header-nav-input" type="checkbox"> <label class="header-nav-menu" for="header-nav-input"></label> <ul> <li> <a href="https://knowledge-search.spiral-site.com/bizpro_contact?category=demo" target="_blank" rel="noopener">お問い合わせ</a> </li> </ul> </nav> </header>
ヘッダ用CSS
:root { /*============================= カスタムプロパティ ==============================*/ --footer-color: #F6F6F6; /* フッターの背景色 */ --footer-menu-color: #333333; /* メニューの文字色 */ --footer-copyright-color: #4B4B4B; /* コピーライトの文字色 */ --header-color: #FFFFFF; /* ヘッダの背景色 */ --header-logo-align: unset; /* ロゴの位置 */ --header-logoimg-size: 34px; /* ロゴ画像のサイズ */ --header-logotxt-color: #333333; /* ロゴテキストの文字色 */ --header-menu-color: #333333; /* メニューの文字色 */ --header-fix: fixed; /* ヘッダの固定表示(PC表示時) */ } body { margin: 0; } .footer { position: relative; padding-top: 24px; padding-bottom: 16px; background: var(--footer-color); font-size: 16px; } .footer ul { margin: 0 auto 46px; text-align: left; } .footer ul li { display: block; margin-bottom: 20px; } .footer ul li a { color: var(--footer-menu-color); font-weight: bold; font-size: .9em; letter-spacing: .1em; text-decoration: none; transition: opacity .3s ease; } .footer ul li a:hover { opacity: .7; } .footer .footer-copyright { color: var(--footer-copyright-color); font-size: .6em; letter-spacing: .1em; text-align: center; } .header { display: flex; justify-content: var(--header-logo-align); align-items: center; position: fixed; top: 0; z-index: 1000; width: 100%; height: 50px; margin-bottom: -50px; padding: 0 20px 0 16px; border-bottom: .5px solid #E1E5EB; box-sizing: border-box; box-shadow: 0 0 3px rgba(0, 43, 107, .1); background: var(--header-color); font-size: 16px; } .header+* { margin-top: 70px !important; } .header .header-logo { color: #333333; font-weight: bold; font-size: 1.3em; line-height: 0; letter-spacing: .05em; text-decoration: none; } .header .header-logo img { height: calc(var(--header-logoimg-size) * .83); vertical-align: middle; } .header .header-login { position: absolute; right: 0; margin-right: 20px; } .header .header-login a { display: inline-block; padding: 16px 12px; color: var(--header-menu-color); font-weight: bold; font-size: .8em; letter-spacing: .1em; text-decoration: none; transition: opacity .3s ease; } .header .header-login a:hover { opacity: .7; } .header .header-nav { position: absolute; right: 0; margin-right: 20px; } .header .header-nav #header-nav-input { display: none; } .header .header-nav .header-nav-menu { display: block; width: 25px; height: 23px; background: url("data:image/svg+xml;utf-8,<svg fill=\"%23333\" fill-opacity=\"0.3\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 50 46\"><g id=\"Group_3711\" transform=\"translate(10829.996 -7618)\"><path d=\"M-10828.4,7618h46.8c0.9,0,0.9,6,0,6h-46.8C-10829.3,7624-10829.3,7618-10828.4,7618z\"/><path d=\"M-10828.4,7638h46.8c0.9,0,0.9,6,0,6h-46.8C-10829.3,7644-10829.3,7638-10828.4,7638z\"/><path d=\"M-10828.4,7658h46.8c0.9,0,0.9,6,0,6h-46.8C-10829.3,7664-10829.3,7658-10828.4,7658z\"/></g></svg>"); background-position: center center; background-size: contain; background-repeat: no-repeat; } .header .header-nav #header-nav-input:checked+.header-nav-menu { background: url("data:image/svg+xml;utf-8,<svg fill=\"%23333\" fill-opacity=\"0.3\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 43.8 43.8\"><path d=\"M42.5,38.3L26.1,21.9L42.4,5.5c0.7-0.7-3.5-4.9-4.2-4.2L21.9,17.7L5.5,1.3c-0.7-0.7-5,3.5-4.2,4.2l16.4,16.4L1.2,38.3c-0.7,0.7,3.6,4.9,4.2,4.2l16.5-16.5l16.4,16.4C39,43.2,43.2,39,42.5,38.3z\"/></svg>"); background-position: center center; background-size: contain; background-repeat: no-repeat; } .header .header-nav ul { position: fixed; top: 50px; left: 0; width: 100vw; max-height: 0; margin: 0; padding: 0; overflow: hidden; box-shadow: none; background: rgba(245, 247, 250, .9); } .header .header-nav #header-nav-input:checked+.header-nav-menu+ul { height: auto; max-height: 100vh; box-shadow: 0 0 3px rgba(0, 43, 107, .1); } .header .header-nav ul li { list-style-type: none; width: 100%; border-bottom: .5px solid #E0E0E0; text-align: center; } .header .header-nav ul li a { display: block; width: 100%; padding: 20px 0; color: var(--header-menu-color); font-weight: bold; font-size: .9em; letter-spacing: .1em; text-decoration: none; transition: opacity .3s ease; } .header .header-nav ul li a:hover { opacity: .7; } .wrapper .contents { min-height: calc(100vh - 298px); margin-top: 75px; margin-bottom: 50px; } .wrapper .mainVisual{ margin-top: 60px; margin-bottom: 0; padding: 0; position: relative } .wrapper .mainVisual img{ height: 100%; width: 100%; } .wrapper .mainVisual h1{ -webkit-text-stroke-width: 0.5px; -webkit-text-stroke-color: black; color: #ffffff; text-align: center; font-size: 42px; position: absolute; top: 50%; left: 50%; -ms-transform: translate(-50%,-50%); -webkit-transform: translate(-50%,-50%); transform: translate(-50%,-50%); margin: 0; padding: 0; width: 80%; } @media (min-width: 768px) { .footer { padding-top: 32px; padding-bottom: 28px; } .footer ul { text-align: center; } .footer ul li { display: inline-block; margin: 0 24px; } .header { height: 60px; margin-bottom: -60px; position: var(--header-fix); } .header+* { margin-top: 90px !important; } .header .header-logo { margin-left: 0; } .header .header-logo img { height: var(--header-logoimg-size); } .header .header-nav { position: absolute; right: 0; } .header .header-nav .header-nav-menu { display: none; } .header .header-nav ul, .header .header-nav #header-nav-input:checked+.header-nav-menu+ul { all: unset; } .header .header-nav ul li { display: inline; margin-right: 12px; border-bottom: unset; } .header .header-nav ul li:last-child { margin-right: 20px; } .header .header-nav ul li a { display: inline-block; width: unset; padding: 16px 12px; font-size: .8em; } } @media screen and (max-width: 1000px) { .wrapper .mainVisual h1{ font-size: 32px; } } @media (max-width: 1024px) { .header { height: 5.86vw; } .header+form { margin-top: 5.86vw; } .header .header-logo img { height: calc(4.10vw - (42px - var(--header-logoimg-size))) ; min-height: 20px; } .header .header-nav ul li { margin-right: 1.17vw; } .header .header-login a, .header .header-nav ul li a { font-size: 1.25vw; } }
フッター用HTML
<footer class="footer"> <ul> <li> <a href="https://www.spiral-platform.co.jp/company/outline/" target="_blank" rel="noopener">企業情報</a> </li> <li> <a href="https://www.spiral-platform.co.jp/company/privacypolicy/" target="_blank" rel="noopener">個人情報保護方針</a> </li> <li> <a href="https://spiral.pi-pe.co.jp/">SPIRAL ver.2</a> </li> <li> <a href="https://knowledge.spirers.jp/">ナレッジサイト</a> </li> <li> <a href="https://knowledge-search.spiral-site.com/bizpro_contact?category=demo" target="_blank" rel="noopener">お問い合わせ</a> </li> </ul> <p class="footer-copyright">Copyright © SPIRAL Inc. All Rights Reserved</p> </footer>
フッター用CSS
:root { /*============================= カスタムプロパティ ==============================*/ --footer-color: #F6F6F6; /* フッターの背景色 */ --footer-menu-color: #333333; /* メニューの文字色 */ --footer-copyright-color: #4B4B4B; /* コピーライトの文字色 */ --header-color: #FFFFFF; /* ヘッダの背景色 */ --header-logo-align: unset; /* ロゴの位置 */ --header-logoimg-size: 34px; /* ロゴ画像のサイズ */ --header-logotxt-color: #333333; /* ロゴテキストの文字色 */ --header-menu-color: #333333; /* メニューの文字色 */ --header-fix: fixed; /* ヘッダの固定表示(PC表示時) */ } body { margin: 0; } .footer { position: relative; padding-top: 24px; padding-bottom: 16px; background: var(--footer-color); font-size: 16px; } .footer ul { margin: 0 auto 46px; text-align: left; } .footer ul li { display: block; margin-bottom: 20px; } .footer ul li a { color: var(--footer-menu-color); font-weight: bold; font-size: .9em; letter-spacing: .1em; text-decoration: none; transition: opacity .3s ease; } .footer ul li a:hover { opacity: .7; } .footer .footer-copyright { color: var(--footer-copyright-color); font-size: .6em; letter-spacing: .1em; text-align: center; } .header { display: flex; justify-content: var(--header-logo-align); align-items: center; position: fixed; top: 0; z-index: 1000; width: 100%; height: 50px; margin-bottom: -50px; padding: 0 20px 0 16px; border-bottom: .5px solid #E1E5EB; box-sizing: border-box; box-shadow: 0 0 3px rgba(0, 43, 107, .1); background: var(--header-color); font-size: 16px; } .header+* { margin-top: 70px !important; } .header .header-logo { color: #333333; font-weight: bold; font-size: 1.3em; line-height: 0; letter-spacing: .05em; text-decoration: none; } .header .header-logo img { height: calc(var(--header-logoimg-size) * .83); vertical-align: middle; } .header .header-login { position: absolute; right: 0; margin-right: 20px; } .header .header-login a { display: inline-block; padding: 16px 12px; color: var(--header-menu-color); font-weight: bold; font-size: .8em; letter-spacing: .1em; text-decoration: none; transition: opacity .3s ease; } .header .header-login a:hover { opacity: .7; } .header .header-nav { position: absolute; right: 0; margin-right: 20px; } .header .header-nav #header-nav-input { display: none; } .header .header-nav .header-nav-menu { display: block; width: 25px; height: 23px; background: url("data:image/svg+xml;utf-8,<svg fill=\"%23333\" fill-opacity=\"0.3\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 50 46\"><g id=\"Group_3711\" transform=\"translate(10829.996 -7618)\"><path d=\"M-10828.4,7618h46.8c0.9,0,0.9,6,0,6h-46.8C-10829.3,7624-10829.3,7618-10828.4,7618z\"/><path d=\"M-10828.4,7638h46.8c0.9,0,0.9,6,0,6h-46.8C-10829.3,7644-10829.3,7638-10828.4,7638z\"/><path d=\"M-10828.4,7658h46.8c0.9,0,0.9,6,0,6h-46.8C-10829.3,7664-10829.3,7658-10828.4,7658z\"/></g></svg>"); background-position: center center; background-size: contain; background-repeat: no-repeat; } .header .header-nav #header-nav-input:checked+.header-nav-menu { background: url("data:image/svg+xml;utf-8,<svg fill=\"%23333\" fill-opacity=\"0.3\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 43.8 43.8\"><path d=\"M42.5,38.3L26.1,21.9L42.4,5.5c0.7-0.7-3.5-4.9-4.2-4.2L21.9,17.7L5.5,1.3c-0.7-0.7-5,3.5-4.2,4.2l16.4,16.4L1.2,38.3c-0.7,0.7,3.6,4.9,4.2,4.2l16.5-16.5l16.4,16.4C39,43.2,43.2,39,42.5,38.3z\"/></svg>"); background-position: center center; background-size: contain; background-repeat: no-repeat; } .header .header-nav ul { position: fixed; top: 50px; left: 0; width: 100vw; max-height: 0; margin: 0; padding: 0; overflow: hidden; box-shadow: none; background: rgba(245, 247, 250, .9); } .header .header-nav #header-nav-input:checked+.header-nav-menu+ul { height: auto; max-height: 100vh; box-shadow: 0 0 3px rgba(0, 43, 107, .1); } .header .header-nav ul li { list-style-type: none; width: 100%; border-bottom: .5px solid #E0E0E0; text-align: center; } .header .header-nav ul li a { display: block; width: 100%; padding: 20px 0; color: var(--header-menu-color); font-weight: bold; font-size: .9em; letter-spacing: .1em; text-decoration: none; transition: opacity .3s ease; } .header .header-nav ul li a:hover { opacity: .7; } .wrapper .contents { min-height: calc(100vh - 298px); margin-top: 75px; margin-bottom: 50px; } .wrapper .mainVisual{ margin-top: 60px; margin-bottom: 0; padding: 0; position: relative } .wrapper .mainVisual img{ height: 100%; width: 100%; } .wrapper .mainVisual h1{ -webkit-text-stroke-width: 0.5px; -webkit-text-stroke-color: black; color: #ffffff; text-align: center; font-size: 42px; position: absolute; top: 50%; left: 50%; -ms-transform: translate(-50%,-50%); -webkit-transform: translate(-50%,-50%); transform: translate(-50%,-50%); margin: 0; padding: 0; width: 80%; } @media (min-width: 768px) { .footer { padding-top: 32px; padding-bottom: 28px; } .footer ul { text-align: center; } .footer ul li { display: inline-block; margin: 0 24px; } .header { height: 60px; margin-bottom: -60px; position: var(--header-fix); } .header+* { margin-top: 90px !important; } .header .header-logo { margin-left: 0; } .header .header-logo img { height: var(--header-logoimg-size); } .header .header-nav { position: absolute; right: 0; } .header .header-nav .header-nav-menu { display: none; } .header .header-nav ul, .header .header-nav #header-nav-input:checked+.header-nav-menu+ul { all: unset; } .header .header-nav ul li { display: inline; margin-right: 12px; border-bottom: unset; } .header .header-nav ul li:last-child { margin-right: 20px; } .header .header-nav ul li a { display: inline-block; width: unset; padding: 16px 12px; font-size: .8em; } } @media screen and (max-width: 1000px) { .wrapper .mainVisual h1{ font-size: 32px; } } @media (max-width: 1024px) { .header { height: 5.86vw; } .header+form { margin-top: 5.86vw; } .header .header-logo img { height: calc(4.10vw - (42px - var(--header-logoimg-size))) ; min-height: 20px; } .header .header-nav ul li { margin-right: 1.17vw; } .header .header-login a, .header .header-nav ul li a { font-size: 1.25vw; } }
手順5:トップページ用のフリーコンテンツの作成
手順3で作成したページの BODY から「+」ボタンを押下し、トップページ用にサイトファイルを載せるブロックを作成します。
設定方法は、ソース設定を選択します。
設定方法は、ソース設定を選択します。
HTML
<div class="wrapper"> <div class="mainVisual"> <!-- サイトファイルに設置したものを【ファイル挿入】 --> <img src="/_media/roomApp/img/mainVisual2.png" alt="mainVisual2.png"> </div> </div>
CSS
:root { /*============================= カスタムプロパティ ==============================*/ --footer-color: #F6F6F6; /* フッターの背景色 */ --footer-menu-color: #333333; /* メニューの文字色 */ --footer-copyright-color: #4B4B4B; /* コピーライトの文字色 */ --header-color: #FFFFFF; /* ヘッダの背景色 */ --header-logo-align: unset; /* ロゴの位置 */ --header-logoimg-size: 34px; /* ロゴ画像のサイズ */ --header-logotxt-color: #333333; /* ロゴテキストの文字色 */ --header-menu-color: #333333; /* メニューの文字色 */ --header-fix: fixed; /* ヘッダの固定表示(PC表示時) */ } body { margin: 0; } .footer { position: relative; padding-top: 24px; padding-bottom: 16px; background: var(--footer-color); font-size: 16px; } .footer ul { margin: 0 auto 46px; text-align: left; } .footer ul li { display: block; margin-bottom: 20px; } .footer ul li a { color: var(--footer-menu-color); font-weight: bold; font-size: .9em; letter-spacing: .1em; text-decoration: none; transition: opacity .3s ease; } .footer ul li a:hover { opacity: .7; } .footer .footer-copyright { color: var(--footer-copyright-color); font-size: .6em; letter-spacing: .1em; text-align: center; } .header { display: flex; justify-content: var(--header-logo-align); align-items: center; position: fixed; top: 0; z-index: 1000; width: 100%; height: 50px; margin-bottom: -50px; padding: 0 20px 0 16px; border-bottom: .5px solid #E1E5EB; box-sizing: border-box; box-shadow: 0 0 3px rgba(0, 43, 107, .1); background: var(--header-color); font-size: 16px; } .header+* { margin-top: 70px !important; } .header .header-logo { color: #333333; font-weight: bold; font-size: 1.3em; line-height: 0; letter-spacing: .05em; text-decoration: none; } .header .header-logo img { height: calc(var(--header-logoimg-size) * .83); vertical-align: middle; } .header .header-login { position: absolute; right: 0; margin-right: 20px; } .header .header-login a { display: inline-block; padding: 16px 12px; color: var(--header-menu-color); font-weight: bold; font-size: .8em; letter-spacing: .1em; text-decoration: none; transition: opacity .3s ease; } .header .header-login a:hover { opacity: .7; } .header .header-nav { position: absolute; right: 0; margin-right: 20px; } .header .header-nav #header-nav-input { display: none; } .header .header-nav .header-nav-menu { display: block; width: 25px; height: 23px; background: url("data:image/svg+xml;utf-8,<svg fill=\"%23333\" fill-opacity=\"0.3\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 50 46\"><g id=\"Group_3711\" transform=\"translate(10829.996 -7618)\"><path d=\"M-10828.4,7618h46.8c0.9,0,0.9,6,0,6h-46.8C-10829.3,7624-10829.3,7618-10828.4,7618z\"/><path d=\"M-10828.4,7638h46.8c0.9,0,0.9,6,0,6h-46.8C-10829.3,7644-10829.3,7638-10828.4,7638z\"/><path d=\"M-10828.4,7658h46.8c0.9,0,0.9,6,0,6h-46.8C-10829.3,7664-10829.3,7658-10828.4,7658z\"/></g></svg>"); background-position: center center; background-size: contain; background-repeat: no-repeat; } .header .header-nav #header-nav-input:checked+.header-nav-menu { background: url("data:image/svg+xml;utf-8,<svg fill=\"%23333\" fill-opacity=\"0.3\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 43.8 43.8\"><path d=\"M42.5,38.3L26.1,21.9L42.4,5.5c0.7-0.7-3.5-4.9-4.2-4.2L21.9,17.7L5.5,1.3c-0.7-0.7-5,3.5-4.2,4.2l16.4,16.4L1.2,38.3c-0.7,0.7,3.6,4.9,4.2,4.2l16.5-16.5l16.4,16.4C39,43.2,43.2,39,42.5,38.3z\"/></svg>"); background-position: center center; background-size: contain; background-repeat: no-repeat; } .header .header-nav ul { position: fixed; top: 50px; left: 0; width: 100vw; max-height: 0; margin: 0; padding: 0; overflow: hidden; box-shadow: none; background: rgba(245, 247, 250, .9); } .header .header-nav #header-nav-input:checked+.header-nav-menu+ul { height: auto; max-height: 100vh; box-shadow: 0 0 3px rgba(0, 43, 107, .1); } .header .header-nav ul li { list-style-type: none; width: 100%; border-bottom: .5px solid #E0E0E0; text-align: center; } .header .header-nav ul li a { display: block; width: 100%; padding: 20px 0; color: var(--header-menu-color); font-weight: bold; font-size: .9em; letter-spacing: .1em; text-decoration: none; transition: opacity .3s ease; } .header .header-nav ul li a:hover { opacity: .7; } .wrapper .contents { min-height: calc(100vh - 298px); margin-top: 75px; margin-bottom: 50px; } .wrapper .mainVisual{ margin-top: 60px; margin-bottom: 0; padding: 0; position: relative } .wrapper .mainVisual img{ height: 100%; width: 100%; } .wrapper .mainVisual h1{ -webkit-text-stroke-width: 0.5px; -webkit-text-stroke-color: black; color: #ffffff; text-align: center; font-size: 42px; position: absolute; top: 50%; left: 50%; -ms-transform: translate(-50%,-50%); -webkit-transform: translate(-50%,-50%); transform: translate(-50%,-50%); margin: 0; padding: 0; width: 80%; } @media (min-width: 768px) { .footer { padding-top: 32px; padding-bottom: 28px; } .footer ul { text-align: center; } .footer ul li { display: inline-block; margin: 0 24px; } .header { height: 60px; margin-bottom: -60px; position: var(--header-fix); } .header+* { margin-top: 90px !important; } .header .header-logo { margin-left: 0; } .header .header-logo img { height: var(--header-logoimg-size); } .header .header-nav { position: absolute; right: 0; } .header .header-nav .header-nav-menu { display: none; } .header .header-nav ul, .header .header-nav #header-nav-input:checked+.header-nav-menu+ul { all: unset; } .header .header-nav ul li { display: inline; margin-right: 12px; border-bottom: unset; } .header .header-nav ul li:last-child { margin-right: 20px; } .header .header-nav ul li a { display: inline-block; width: unset; padding: 16px 12px; font-size: .8em; } } @media screen and (max-width: 1000px) { .wrapper .mainVisual h1{ font-size: 32px; } } @media (max-width: 1024px) { .header { height: 5.86vw; } .header+form { margin-top: 5.86vw; } .header .header-logo img { height: calc(4.10vw - (42px - var(--header-logoimg-size))) ; min-height: 20px; } .header .header-nav ul li { margin-right: 1.17vw; } .header .header-login a, .header .header-nav ul li a { font-size: 1.25vw; } }
手順6:内覧予約トップページに埋め込む内覧予約物件一覧を作成
内覧予約トップページ内に物件マスタDBに登録されている物件情報を表示します。
手順3で作成したページの BODY から「+」ボタンを押下し、レコードリストブロックを作成します。
物件情報を表示するためにはレコード公開範囲を設定する必要があります。
サイト管理から、レコード公開範囲を設定します。
レコード公開範囲から「+」ボタンを押下し、物件マスタDBを選択します。
公開範囲は一般公開およびエリア認証時公開とし、一般公開は条件抽出を抽出しないに、エリア認証時公開範囲で抽出方法をログインフィルタ、
フィールド値関係抽出を「物件ID」「等しい」「物件ID」に設定します。
レコードアイテムブロックは手順8で使用するため、作成するに設定ください。
設定方法は、ソース設定を選択します。
公開するレコードを絞りたいので、レコードリストブロックからリスト設定を設定します。
リスト設定のアクセス日との関係抽出は「公開日時」「年月日」「の〇日後以降」「0」、
フィールド条件抽出は「公開フラグ」「等しい」「公開」に設定ください。
レコードリストで使えるコピペCSS「カスタムデザイン」を元にデザインを当てています。
HTML
CSS
HTMLの「"rlb0xxxx_q_f0xx=${record['f0xx']}"」の「"record['f0xx']"」には、物件マスタDBの物件IDのフィールドIDを記載ください。
「'f0xx'」には、物件マスタDB内の対応するフィールドIDを記載ください。
「"p0xxxx"」には、物件詳細ページと資料請求ページを作成後にそれぞれのページIDを追記ください。
「rlb0xxxx_q_f0xx」には、物件詳細ページでレコードリストを絞り込むために、手順10で作成する予約可能日一覧のIDとカレンダーDBの物件IDのフィールドのIDを記載します。
設定方法の詳細については、レコード検索ブロックを使用したレコードリストブロック フィルタ設定方法
をご覧ください。
手順3で作成したページの BODY から「+」ボタンを押下し、レコードリストブロックを作成します。
物件情報を表示するためにはレコード公開範囲を設定する必要があります。
サイト管理から、レコード公開範囲を設定します。
レコード公開範囲から「+」ボタンを押下し、物件マスタDBを選択します。
公開範囲は一般公開およびエリア認証時公開とし、一般公開は条件抽出を抽出しないに、エリア認証時公開範囲で抽出方法をログインフィルタ、
フィールド値関係抽出を「物件ID」「等しい」「物件ID」に設定します。
レコードアイテムブロックは手順8で使用するため、作成するに設定ください。
設定方法は、ソース設定を選択します。
公開するレコードを絞りたいので、レコードリストブロックからリスト設定を設定します。
レコードリストブロックのリスト設定は下記のように設定ください。
フィルタ | 抽出方法 | 条件抽出 | 初期ソート | 初期表示件数 |
---|---|---|---|---|
あり | 条件抽出 | ※ 設定詳細は下記に記載 | (ID) 降順 | 50件 |
リスト設定のアクセス日との関係抽出は「公開日時」「年月日」「の〇日後以降」「0」、
フィールド条件抽出は「公開フラグ」「等しい」「公開」に設定ください。
レコードリストで使えるコピペCSS「カスタムデザイン」を元にデザインを当てています。
HTML
<div class="sp-record-list-container"> <h3 style = "text-align: center;">物件一覧の各物件の「予約」から内覧予約、「資料請求」から資料請求を行うことができます。<br>資料請求は入力したメールアドレス宛に資料ダウンロードページを送信いたしますので、ページよりダウンロードをお願いいたします。</h3> <div class="sp-record-list-parts sp-record-list-pagination"> <div class="sp-record-list-pagination-left"></div> <div class="sp-record-list-pagination-center"></div> <div class="sp-record-list-pagination-right"> <div> <span th:text="${pagination.startIndex}"></span> - <span th:text="${pagination.endIndex}"></span> / </div> <div> <span th:text="${recordList.totalRecordCount}">Total count</span> </div> <div class="sp-form-dropdown-inline"> <select class="sp-form-control sp-url-switcher"> <option value="20" th:selected="${pagination.currentPageSize == 20}" th:attr="data-link=${pagination.getLinkWithPageSize(20)}">20件</option> <option value="50" th:selected="${pagination.currentPageSize == 50}" th:attr="data-link=${pagination.getLinkWithPageSize(50)}">50件</option> </select> <span class="sp-form-dropdown-icon"></span> </div> </div> </div> <!--/* 物件ID (propertyID) */--> <sp:record-data-field name="f0xx"></sp:record-data-field> <div class="sp-record-list-parts"> <div class="sp-record-list-cards" th:style="'grid-template-columns: repeat(auto-fill, minmax(240.0px, 1fr));'"> <!-- <div th:each="record, stat : ${pageRecords}" th:class="sp-record-list-card-item"> --> <div th:each="record, stat : ${pageRecords}" class="sp-record-list-card-item"> <!--/* 物件画像 (propertyImage) */--> <sp:record-data-field name="f0xx"></sp:record-data-field> <th:block th:with="files=${record['f0xx']}" th:remove="${files == null ? 'body' : 'none'}"> <a class="img_design" th:href="|${pages['p0xxxx']?.path ?:'/404'}?${record.linkParam}&rlb0xxxx_q_f0xx=${record['f0xx']}|" > <img th:if="${files.size == 1}" th:with="file=${files[0]}" class="imgBox" th:src="${file.fileUrl}" alt="" /> </a> </th:block> <!--/* 物件名 (propertyName) */--> <sp:record-data-field name="f0xx"></sp:record-data-field> <!-- <div> --> <span class="sp-card-title" th:text="${record['f0xx']}">Title</span> <div class="sp-record-list-card-actions"> <a class="reserve_color" th:href="|${pages['p0xxxx']?.path ?:'/404'}?${record.linkParam}&rlb0xxxx_q_f0xx=${record['f0xx']}|">予約</a> <a class="material_color" th:href="|${pages['p0xxxx']?.path ?:'/404'}?${record.linkParam}|">資料請求</a> </div> </div> </div> <div class="sp-record-list-no-records" th:if="${recordList.totalRecordCount == 0}"> 表示できるデータがありません </div> </div> <div class="sp-record-list-parts sp-record-list-pagination"> <div class="sp-record-list-pagination-left"></div> <div class="sp-record-list-pagination-center"> <ul class="sp-page-navs" th:with="pageNavItemSize = 5" th:if="${recordList.totalRecordCount != 0}"> <li class="sp-page-nav-item" th:if="!${pagination.isFirstPage}"> <a th:href="${pagination.firstPageLink}"><<</a> </li> <li class="sp-page-nav-item" th:if="!${pagination.isFirstPage}"> <a th:href="${pagination.prevPageLink}"><</a> </li> <li class="sp-page-nav-item" th:each="item : ${pagination.getPrevPageNavItems(pageNavItemSize)}"> <a th:text="${item.pageNum}" th:href="${item.link}">Page Number</a> </li> <li class="sp-page-nav-item sp-page-nav-current"> <span th:text="${pagination.currentPageNum}">Page Number</span> </li> <li class="sp-page-nav-item" th:each="item : ${pagination.getNextPageNavItems(pageNavItemSize)}"> <a th:text="${item.pageNum}" th:href="${item.link}">Page Number</a> </li> <li class="sp-page-nav-more" th:if="${pagination.showEllipsis}">...</li> <li class="sp-page-nav-item" th:if="!${pagination.isLastPage}"> <a th:href="${pagination.nextPageLink}">></a> </li> <li class="sp-page-nav-item" th:if="!${pagination.isLastPage} and !${recordList.recordCountLimitExceeded}"> <a th:href="${pagination.lastPageLink}">>></a> </li> </ul> </div> <div class="sp-record-list-pagination-right"></div> </div> </div>
CSS
:root { /*============================= カスタムプロパティ ==============================*/ --background-color: #FFFFFF; /* ページの背景色 */ --main-color: #0D60DB; /* メインカラー */ --table-border: 1.5px solid #EBEBEB; /* レコードリストの枠線(外周) */ --table-shadow: 0 2px 5px rgba(0,0,0,0.2); /* レコードリストの影 */ --mobile-table-width: 200%; /* スマホ表示時のレコードリストの横幅 */ --th-color:#FFFFFF; /* ヘッダ行の背景色 */ --th-txtcolor:#333333;/* ヘッダ行の文字色 */ --th-col-border: none; /* ヘッダ行の縦線 */ --th-bottom-border: 1.5px solid #EBEBEB; /* ヘッダ行の下線 */ --data-color: #FFFFFF; /* データ行の背景色 */ --even-color: #FFFFFF; /* データ行の背景色(偶数行) */ --hover-color: #E9F6FF; /* データ行の背景色(マウスオーバー時) */ --data-padding: 16px; /* データ行の余白(上下) */ --link-color: #4286F4; /* リンク列の文字色 */ --row-border: 1.5px solid #EBEBEB; /* リストの横線 */ --col-border: none; /* リストの縦線 */ --border-radius: 12px; /* 角の丸さ */ word-break: break-all; /* 改行 */ /*------ 項目ごとの横幅を固定したい場合は合計100%になるよう調整 -------*/ --col01-width: ; /* 項目1 */ --col02-width: ; /* 項目2 */ --col03-width: ; /* 項目3 */ --col04-width: ; /* 項目4 */ --col05-width: ; /* 項目5 */ --col06-width: ; /* 項目6 */ --col07-width: ; /* 項目7 */ --col08-width: ; /* 項目8 */ --col09-width: ; /* 項目9 */ --col10-width: ; /* 項目10 */ } body{ background: var(--background-color); } .img_design a { /* postition: relative; */ } .sp-record-list-container { color:#333333; width:80%; margin:0 auto; } .sp-record-list-container .sp-html-parts p { margin:0; } .sp-record-list-container .sp-record-list-parts { margin: 0 1rem .5rem; } .sp-record-list-container .sp-record-list-table { line-height:1.15; border-collapse:collapse; width:80%; height: 100%; margin-bottom:1rem; color:#333333; border-radius: var(--border-radius); border: var(--table-border); border-collapse: separate; border-spacing: 0; box-shadow: var(--table-shadow); overflow: hidden; } .sp-record-list-container .sp-record-list-table caption { padding-top:0.75rem; padding-bottom:0.75rem; color:#6c757d; text-align:left; caption-side:bottom; } .sp-record-list-container .sp-record-list-table a { text-decoration:none; } .sp-record-list-container .sp-record-list-table a:hover { text-decoration:underline; } .sp-record-list-container .sp-record-list-table th, .sp-record-list-container .sp-record-list-table td { vertical-align:top; border-top:var(--row-border); } .sp-record-list-container .sp-record-list-table td:not(:last-child) { border-right: var(--col-border); } .sp-record-list-container .sp-record-list-table th { text-align:inherit; padding: 1.0rem 0.75rem; } .sp-record-list-container .sp-record-list-table td { padding: var(--data-padding) 0.75rem; } .sp-record-list-container .sp-record-list-table thead th { background: var(--th-color); color:var(--th-txtcolor); padding: calc(var(--data-padding) * 1.2) 0.75rem; font-weight:bold; vertical-align:top; border-bottom:var(--th-bottom-border); text-align:left; } .sp-record-list-container .sp-record-list-table thead th:not(:last-child){ border-right: var(--th-col-border); } .sp-record-list-container .sp-record-list-table thead th:nth-child(1) { width: var(--col01-width);} .sp-record-list-container .sp-record-list-table thead th:nth-child(2) { width: var(--col02-width);} .sp-record-list-container .sp-record-list-table thead th:nth-child(3) { width: var(--col03-width);} .sp-record-list-container .sp-record-list-table thead th:nth-child(4) { width: var(--col04-width);} .sp-record-list-container .sp-record-list-table thead th:nth-child(5) { width: var(--col05-width);} .sp-record-list-container .sp-record-list-table thead th:nth-child(6) { width: var(--col06-width);} .sp-record-list-container .sp-record-list-table thead th:nth-child(7) { width: var(--col07-width);} .sp-record-list-container .sp-record-list-table thead th:nth-child(8) { width: var(--col08-width);} .sp-record-list-container .sp-record-list-table thead th:nth-child(9) { width: var(--col09-width);} .sp-record-list-container .sp-record-list-table thead th:nth-child(10) { width: var(--col10-width);} .sp-record-list-container .sp-record-list-table thead th.sp-nowrap { white-space:nowrap; } .sp-record-list-container .sp-record-list-table thead th.sp-nowrap-truncate { white-space:nowrap; } .sp-record-list-container .sp-record-list-table thead th.sp-nowrap-truncate a>span:first-child { display:inline-block; vertical-align:middle; max-width:12rem; overflow:hidden; text-overflow:ellipsis; } .sp-record-list-container .sp-record-list-table thead th a { color:inherit; text-decoration:none; } .sp-record-list-container .sp-record-list-table thead th a .sp-sorting-asc, .sp-record-list-container .sp-record-list-table thead th a .sp-sorting-desc { color: var(--th-txtcolor); } .sp-record-list-container .sp-record-list-table thead th a .sp-sorting-asc .fa, .sp-record-list-container .sp-record-list-table thead th a .sp-sorting-desc .fa { font-weight:bold; } .sp-record-list-container .sp-record-list-table thead th a .sp-sorting-desc { visibility:hidden; } .sp-record-list-container .sp-record-list-table thead th a .sp-sorting-asc { display:none; } .sp-record-list-container .sp-record-list-table thead th a.sp-desc-sorted .sp-sorting-desc { visibility:visible; } .sp-record-list-container .sp-record-list-table thead th a.sp-asc-sorted .sp-sorting-asc { display:inline; } .sp-record-list-container .sp-record-list-table thead th a.sp-asc-sorted .sp-sorting-desc { display:none; } .sp-record-list-container .sp-record-list-table thead th a:hover { color:#333333; text-decoration:none; } .sp-record-list-container .sp-record-list-table thead th a:hover:not(.sp-sorted) .sp-sorting-desc { visibility:visible; } .sp-record-list-container .sp-record-list-table tbody+tbody { border-top:2px solid #dddddd; } .sp-record-list-container .sp-record-list-table tbody tr td{ transition: .1s; } .sp-record-list-container .sp-record-list-table tbody tr:hover td{ background:var(--hover-color); } .sp-record-list-container .sp-record-list-table tbody tr{ background: var(--data-color); } .sp-record-list-container .sp-record-list-table tbody tr:nth-child(even){ background: var(--even-color); } .sp-record-list-container .sp-record-list-table tr:first-child th, .sp-record-list-container .sp-record-list-table tr:first-child td { border-top:0; } .sp-record-list-container .sp-record-list-table td a:not(.sp-form-file-bold-link) { color: var(--link-color); font-weight:bold; display: inline-block; width: 100%; height: 100%; padding: var(--data-padding) 0.75rem; margin: calc(-1 * var(--data-padding)) -0.75rem; transition: .1s; } .sp-record-list-container .sp-record-list-table td span:nth-child(n+2) { margin-left:.1rem; } .sp-record-list-container .sp-record-list-table a.sp-form-file-bold-link { text-decoration:none; color: var(--link-color); cursor:pointer; font-weight:bold; } .sp-record-list-container .sp-record-list-table a.sp-form-file-bold-link:hover { text-decoration:underline; } .sp-form-file-text-label { color:#6c757d; } .sp-record-list-container .sp-table-sm th, .sp-record-list-container .sp-table-sm td { padding:0.3rem; } .sp-record-list-container .sp-table-bordered { border:1px solid #dddddd; } .sp-record-list-container .sp-table-bordered th, .sp-record-list-container .sp-table-bordered td { border:1px solid #dddddd; } .sp-record-list-container .sp-table-bordered thead th, .sp-record-list-container .sp-table-bordered thead td { border-bottom-width:2px; } .sp-record-list-container .sp-table-borderless th, .sp-record-list-container .sp-table-borderless td, .sp-record-list-container .sp-table-borderless tbody+tbody { border:0; } .sp-record-list-container .sp-record-list-no-records { margin:6.25rem auto; text-align:center; color:#808080; } .sp-record-list-pagination { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-pack:justify; -ms-flex-pack:justify; justify-content:space-between; -webkit-box-align:center; -ms-flex-align:center; align-items:center; } .sp-record-list-pagination .sp-record-list-pagination-left, .sp-record-list-pagination .sp-record-list-pagination-center, .sp-record-list-pagination .sp-record-list-pagination-right { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-align:center; -ms-flex-align:center; align-items:center; } .sp-record-list-pagination .sp-record-list-pagination-left>*, .sp-record-list-pagination .sp-record-list-pagination-center>*, .sp-record-list-pagination .sp-record-list-pagination-right>* { margin:0 .5rem; } .sp-record-list-pagination .sp-record-list-pagination-left { -webkit-box-pack:start; -ms-flex-pack:start; justify-content:flex-start; } .sp-record-list-pagination .sp-record-list-pagination-center { -webkit-box-pack:center; -ms-flex-pack:center; justify-content:center; } .sp-record-list-pagination .sp-record-list-pagination-right { -webkit-box-pack:end; -ms-flex-pack:end; justify-content:flex-end; } .sp-record-list-pagination .sp-form-control { -webkit-appearance:none; -moz-appearance:none; appearance:none; font-family:inherit; font-size:1rem; line-height:1.5; padding:.3rem .7rem; color:#333333; -webkit-box-sizing:border-box; box-sizing:border-box; width:100%; margin: 1px 1px calc(0.2rem + 1px); border:1px solid #dddddd; border-radius:calc(var(--border-radius) / 1.2); box-sizing:border-box; outline:none; } .sp-record-list-pagination .sp-form-control:focus { margin: 0 0 0.2rem; border: 2px solid var(--main-color); } .sp-record-list-pagination .sp-form-inline .sp-form-control { display:inline-block; width:auto; vertical-align:middle; } .sp-record-list-pagination select.sp-form-control, .sp-record-list-pagination option.sp-form-control { -webkit-appearance:none; -moz-appearance:none; appearance:none; padding-right:1.5rem; } .sp-record-list-pagination select.sp-form-control::-ms-expand { display:none; } .sp-record-list-pagination .sp-form-dropdown { position:relative; } .sp-record-list-pagination .sp-form-dropdown-inline { position:relative; display:inline-block; } .sp-record-list-pagination .sp-form-dropdown-icon { display:block; position:absolute; top:1rem; right:.5rem; line-height:0; pointer-events:none; } .sp-record-list-pagination .sp-form-dropdown-icon:after { content:""; display:block; border-top:.333rem solid #888888; border-right:.333rem solid transparent; border-left:.333rem solid transparent; } .sp-record-list-pagination ul.sp-page-navs { display:-webkit-box; display:-ms-flexbox; display:flex; padding-left:0; list-style:none; } .sp-record-list-pagination ul.sp-page-navs li.sp-page-nav-item { line-height:1.25rem; text-align:center; -webkit-user-select:none; -moz-user-select:none; -ms-user-select:none; user-select:none; white-space:nowrap; } .sp-record-list-pagination ul.sp-page-navs li.sp-page-nav-item a, .sp-record-list-pagination ul.sp-page-navs li.sp-page-nav-item span { display:inline-block; margin:0 0.2rem; padding:.375rem .75rem; border-radius:calc(var(--border-radius) / 1.2); color:var(--main-color); font-weight: bold; } .sp-record-list-pagination ul.sp-page-navs li.sp-page-nav-item a .fa, .sp-record-list-pagination ul.sp-page-navs li.sp-page-nav-item span .fa { font-size:1.125rem; width:1rem; } .sp-record-list-pagination ul.sp-page-navs li.sp-page-nav-item a { text-decoration:none; } .sp-record-list-pagination ul.sp-page-navs li.sp-page-nav-item a:hover { background-color:rgba(0,0,0,0.075); } .sp-record-list-pagination ul.sp-page-navs li.sp-page-nav-item span { background-color:rgba(0,0,0,0.075); color: var(--main-color); font-weight: bold; } .sp-record-list-pagination ul.sp-page-navs li.sp-page-nav-item.sp-page-nav-current span { background-color:var(--main-color); border-color:var(--main-color); color:#ffffff; } .sp-record-list-pagination ul.sp-page-navs li.sp-page-nav-more { line-height:1rem; text-align:center; margin:0 .2rem; padding:.375rem .3rem; } @media (max-width: 765px) { .sp-record-list-container .sp-record-list-parts { margin: 0 0 .5rem; } .sp-record-list-container [class="sp-record-list-parts"]{ overflow-x: auto; } .sp-record-list-container .sp-record-list-table { width: var(--mobile-table-width); font-size: .9em; box-shadow: unset; } } .sp-record-list-container { color:#333333; background-color:#ffffff; width:80%; margin:0 auto; } .sp-record-list-container .sp-html-parts p { margin:0; } .sp-record-list-container .sp-record-list-parts { margin-bottom:.5rem; } .sp-record-list-cards { display:grid; gap:1rem; } .sp-record-list-container .sp-record-list-card-item { overflow-wrap:anywhere; padding:1rem 1rem 0 1rem; position:relative; color:#333333; border-radius:0.5em; box-shadow:0px 1px 3px 1px rgba(0,0,0,0.12),0px 1px 2px 0px rgba(0,0,0,0.24); display:flex; -ms-flex-direction:column; flex-direction:column; justify-content:space-between; } /* .sp-record-list-card-item a { color:#3b7e9b; position:relative; text-decoration:none; z-index:1; } */ .sp-record-list-card-item a { color: #3b7e9b; /* position: relative; */ text-decoration: none; overflow: hidden; z-index: 1; display: inline-block; /* width: 80%; */ } .sp-record-list-card-item img { width:100%; } .sp-record-list-card-item .sp-record-list-card-link { position:absolute; top:0; right:0; bottom:0; left:0; cursor:pointer; } .sp-card-title { color:#333333; font-size:1.25rem; font-weight:600; text-align: center; } .reserve_color { font-weight: bold; font-size: 16px; margin-right:2.5px; } .material_color { font-weight: bold; font-size: 16px; margin-left:2.5px; } .sp-card-subtitle { color:#808080; font-size:1rem; margin-top:0.5rem; } .sp-card-supporting-text { font-size:0.9rem; margin-top:0.75rem; } .sp-record-list-card-additional-items { margin-top:0.75rem; } .sp-record-list-card-additional-item { display:flex; flex-wrap:wrap; margin-top:0.25rem; gap:0.75rem; } .sp-record-list-card-additional-item-label { width:30%; } .sp-record-list-card-additional-item-data { flex:1; } .sp-record-list-card-actions { display:flex; /* justify-content:flex-end; */ width: 100%; justify-content:center; margin-bottom:0.5rem; } .sp-record-list-card-actions a { border:1px solid #dddddd; border-radius:0.25rem; color:#333333; /* background-color:#ffffff; */ font-size:0.875rem; padding:0.5rem 0.75rem; text-align:center; text-decoration:none; flex: 1; } .sp-record-list-card-additional-item-data a:hover { text-decoration:underline; } .sp-form-file-bold-link { text-decoration:none !important; color:#3b7e9b; cursor:pointer; font-weight:bold; } .sp-form-file-text-label { color:#6c757d; } .sp-record-list-container .sp-record-list-no-records { margin:6.25rem auto; text-align:center; color:#808080; } .sp-record-list-pagination { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-pack:justify; -ms-flex-pack:justify; justify-content:space-between; -webkit-box-align:center; -ms-flex-align:center; align-items:center; } .sp-record-list-pagination .sp-record-list-pagination-left, .sp-record-list-pagination .sp-record-list-pagination-center, .sp-record-list-pagination .sp-record-list-pagination-right { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-align:center; -ms-flex-align:center; align-items:center; } .sp-record-list-pagination .sp-record-list-pagination-left>*, .sp-record-list-pagination .sp-record-list-pagination-center>* { margin:0 .5rem 0 0; } .sp-record-list-pagination .sp-record-list-pagination-right>* { margin:0 0 0 .5rem; } .sp-record-list-pagination .sp-record-list-pagination-left { -webkit-box-pack:start; -ms-flex-pack:start; justify-content:flex-start; } .sp-record-list-pagination .sp-record-list-pagination-center { -webkit-box-pack:center; -ms-flex-pack:center; justify-content:center; } .sp-record-list-pagination .sp-record-list-pagination-right { -webkit-box-pack:end; -ms-flex-pack:end; justify-content:flex-end; } .sp-record-list-pagination .sp-form-control { -webkit-appearance:none; -moz-appearance:none; appearance:none; font-family:inherit; font-size:1rem; line-height:1.5; padding:.3rem .7rem; color:#333333; -webkit-box-sizing:border-box; box-sizing:border-box; width:100%; margin-bottom:0.2rem; border:1px solid #dddddd; border-radius:.25rem; } .sp-record-list-pagination .sp-form-inline .sp-form-control { display:inline-block; width:auto; vertical-align:middle; } .sp-record-list-pagination select.sp-form-control, .sp-record-list-pagination option.sp-form-control { -webkit-appearance:none; -moz-appearance:none; appearance:none; padding-right:1.5rem; } .sp-record-list-pagination select.sp-form-control::-ms-expand { display:none; } .sp-record-list-pagination .sp-form-dropdown { position:relative; } .sp-record-list-pagination .sp-form-dropdown-inline { position:relative; display:inline-block; } .sp-record-list-pagination .sp-form-dropdown-icon { display:block; position:absolute; top:1rem; right:.5rem; line-height:0; pointer-events:none; } .sp-record-list-pagination .sp-form-dropdown-icon:after { content:""; display:block; border-top:.333rem solid #888888; border-right:.333rem solid transparent; border-left:.333rem solid transparent; } .sp-record-list-pagination ul.sp-page-navs { display:-webkit-box; display:-ms-flexbox; display:flex; padding-left:0; list-style:none; } .sp-record-list-pagination ul.sp-page-navs li.sp-page-nav-item { line-height:1.25rem; text-align:center; -webkit-user-select:none; -moz-user-select:none; -ms-user-select:none; user-select:none; white-space:nowrap; } .sp-record-list-pagination ul.sp-page-navs li.sp-page-nav-item a, .sp-record-list-pagination ul.sp-page-navs li.sp-page-nav-item span { display:inline-block; margin:0 0.2rem; padding:.375rem .75rem; border-radius:.25rem; border:1px solid #dddddd; color:#333333; } .sp-record-list-pagination ul.sp-page-navs li.sp-page-nav-item a .fa, .sp-record-list-pagination ul.sp-page-navs li.sp-page-nav-item span .fa { font-size:1.125rem; width:1rem; } .sp-record-list-pagination ul.sp-page-navs li.sp-page-nav-item a { text-decoration:none; } .sp-record-list-pagination ul.sp-page-navs li.sp-page-nav-item a:hover { background-color:rgba(0,0,0,0.075); } .sp-record-list-pagination ul.sp-page-navs li.sp-page-nav-item span { background-color:rgba(0,0,0,0.075); color:#808080; } .sp-record-list-pagination ul.sp-page-navs li.sp-page-nav-item.sp-page-nav-current span { background-color:#555555; border-color:#555555; color:#ffffff; } .sp-record-list-pagination ul.sp-page-navs li.sp-page-nav-more { line-height:1rem; text-align:center; margin:0 .2rem; padding:.375rem .3rem; }
HTMLの「"rlb0xxxx_q_f0xx=${record['f0xx']}"」の「"record['f0xx']"」には、物件マスタDBの物件IDのフィールドIDを記載ください。
「'f0xx'」には、物件マスタDB内の対応するフィールドIDを記載ください。
「"p0xxxx"」には、物件詳細ページと資料請求ページを作成後にそれぞれのページIDを追記ください。
「rlb0xxxx_q_f0xx」には、物件詳細ページでレコードリストを絞り込むために、手順10で作成する予約可能日一覧のIDとカレンダーDBの物件IDのフィールドのIDを記載します。
設定方法の詳細については、レコード検索ブロックを使用したレコードリストブロック フィルタ設定方法
をご覧ください。
手順7:トップページのブロック埋め込み
手順3で作成した内覧予約トップページに手順4/手順5/手順6で作成したブロックを埋め込みます。
HTML
CSS
HTMLの「"fcb0xxxx"」、「"rlb0xxxx"」には、それぞれ手順3、4、5で作成したヘッダ、サイトファイルを載せるブロック、更新フォームブロック、フッターのIDを記載ください。
HTML
<!-- ヘッダ --> <sp:block name="fcb0xxxx"></sp:block> <!-- フリーコンテンツ --> <sp:block name="fcb0xxxx"></sp:block> <!-- 物件一覧 --> <h2>物件一覧</h2> <sp:block name="rlb0xxxx"></sp:block> <!-- フッター --> <sp:block name="fcb0xxxx"></sp:block>
CSS
h2 { text-align: center; } h1 { text-align: center; } .reserve_attention { display: block; text-align: center; margin: 0.5rem 0; } .url-button { width: auto; /* font-size:0.875rem; */ padding:0.5rem 0; text-align:center; text-decoration:none; flex: 1; color: #ffffff; background-color: #0D60DB; border: 1.0px solid #0D60DB; border-radius: calc(12px / 1.2); } .button-l { padding:0.5rem 6%; margin-right: 0.5rem; } .button-r { padding:0.5rem 5%; margin-left: 0.5rem; } .button { padding:0.5rem 5%; } .sp-url-button { text-align: center; width: auto; margin: 1.5rem auto; /* border: 1px solid #dddddd; */ }
手順8:物件詳細ページを作成
手順2で作成した認証エリアの「+」ボタンから新規ページを作成します。
物件詳細ページは公開ページのため、認証はなしで設定します。
設定方法は、ソース設定を選択します。
物件詳細ページは公開ページのため、認証はなしで設定します。
設定方法は、ソース設定を選択します。
手順9:物件詳細ページに埋め込む内覧予約物件詳細を作成
手順8で作成したページの BODY から「+」ボタンを押下し、手順6で作成したレコードアイテムブロックを設定します。
レコードリストで使えるコピペCSS「カスタムデザイン」を元にデザインを当てています。
HTML
CSS
HTMLの「"f0xx"」には、物件マスタDB内の対応するフィールドIDを記載ください。
レコードリストで使えるコピペCSS「カスタムデザイン」を元にデザインを当てています。
HTML
<div class="sp-record-item-container" th:if="${record != null}"> <div class="sp-record-item-parts sp-html-parts" th:inline="none"></div> <div class="sp-record-item-left-parts"> <!--/* 物件画像(propertyImage) */--> <sp:record-item-field name="f0xx"></sp:record-item-field> <div class="sp-record-item-parts sp-record-item-field sp-item-flex2"> <div class="sp-record-item-label" th:text="${fields['f0xx'].label}">Label</div> <div class="sp-record-item-data"> <div class="sp-record-item-field sp-file-info" th:each="file, stat: ${record['f0xx']}"> <div class="sp-text-truncate"> <!-- <a class="sp-form-file-bold-link" th:title="|${file.fileName} (${file.fileSize})|" th:text="${file.fileName}" th:href="${file.fileUrl}"></a> <span class="sp-form-file-size-label" th:text="|(${file.fileSize})|"> Example </span> --> <img th:each="file, stat: ${record['f0xx']}" th:src="${file.fileUrl}" border="0"> </div> </div> </div> </div> </div> <div class="sp-record-item-right-parts"> <!--/* 物件名 (propertyName) */--> <sp:record-item-field name="f0xx"></sp:record-item-field> <div class="sp-record-item-parts sp-record-item-field sp-item-flex1"> <div class="sp-record-item-label" th:text="${fields['f0xx'].label}">Label</div> <div class="sp-record-item-data"> <span class="sp-record-item-embedded" th:text="${record['f0xx']}">Example</span> </div> </div> <!--/* 広さ (spaciousness) */--> <sp:record-item-field name="f0xx"></sp:record-item-field> <div class="sp-record-item-parts sp-record-item-field sp-item-flex1"> <div class="sp-record-item-label" th:text="${fields['f0xx'].label}">Label</div> <div class="sp-record-item-data"> <span class="sp-record-item-embedded" th:text="${record['f0xx']}">Example</span> </div> </div> <!--/* 価格 (price) */--> <sp:record-item-field name="f0xx"></sp:record-item-field> <div class="sp-record-item-parts sp-record-item-field sp-item-flex1"> <div class="sp-record-item-label" th:text="${fields['f0xx'].label}">Label</div> <div class="sp-record-item-data"> <span class="sp-record-item-embedded" th:text="${record['f0xx']}">Example</span> </div> </div> <!--/* 備考・詳細 (remarksDetail) */--> <sp:record-item-field name="f0xx"></sp:record-item-field> <div class="sp-record-item-parts sp-record-item-field sp-item-flex1"> <div class="sp-record-item-label" th:text="${fields['f0xx'].label}">Label</div> <div class="sp-record-item-data"> <span class="sp-record-item-embedded" th:if="${record['f0xx'] != null}"> <th:block th:each="line, stat : ${record['f0xx'].lines}"> <th:block th:text="${line}"></th:block> <br th:unless="${stat.last}"> </th:block> </span> </div> </div> </div> </div> <div class="sp-record-item-container" th:if="${record == null}"> <div class="sp-record-item-no-item"> データが見つかりません </div> </div>
CSS
:root { /*============================= カスタムプロパティ ==============================*/ --detail-background-color: #FFFFFF; /* ページの背景色 */ --detail-container-color: #FFFFFF; /* レコードアイテムの背景色 */ --detail-container-border: 1.5px solid #EBEBEB; /* レコードアイテムのボーダー */ --detail-container-shadow: 0 2px 5px rgba(0,0,0,0.2); /* レコードアイテムの影 */ --detail-container-radius: 12px; /* レコードアイテムの角の丸さ */ --detail-label-txtcolor: #333333; /* ラベルの文字色 */ --detail-data-txtcolor: #333333; /* データの文字色 */ --detail-link-txtcolor: #4286f4; /* リンクの文字色 */ --detail-data-padding: 16px; /* データ部分の余白(上下) */ --detail-border: 1.5px solid #EBEBEB; /* データの区切り線 */ word-break: break-all; /* 改行 */ /*------ 合計100%になるよう調整 -------*/ /* --detail-label-width: 30%; */ /* ラベル部分の幅 */ /* --detail-data-width: 70%; */ /* データ部分の幅 */ } body{ margin: 0; background: var(--detail-background-color); } .sp-record-item-left-parts { width: 50%; /* display: inline-block; */ /* 追加部分 */ display:table-cell; white-space: nowrap; } .sp-record-item-right-parts { width: 50%; /* display: inline-block; */ /* 追加部分 */ display:table-cell; /* float: right; */ /* 追加部分 */ text-align:right; } .sp-record-item-container { color:#333333; background:var(--detail-container-color); box-shadow: var(--detail-container-shadow); -webkit-box-sizing:border-box; box-sizing:border-box; margin: auto; padding: 1.5rem 1rem; /* width:100%; */ /* min-height: 100vh; */ width: clamp(452px, 60%, 800px); /* 追加部分 */ /* display:table */ display:table; } .sp-record-item-container .sp-item-flex1 { height:25%; display: flex; flex-wrap: wrap; /* flex-direction: column; */ } .sp-record-item-parts .sp-record-item-field .sp-item-flex2 { display: flex; flex-wrap: wrap; flex-direction: column; flex-flow:none; } .sp-record-item-container .sp-record-item-parts { margin-bottom:0.5rem; padding-bottom:0.5rem; } .sp-file-info>div { width:100%; } .sp-record-item-container .sp-record-item-parts:last-child.sp-record-item-field { border-bottom:0; } .sp-record-item-container .sp-record-item-field { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:vertical; -webkit-box-direction:normal; /* -ms-flex-direction:column; */ /* flex-direction:column; */ border-bottom: var(--detail-border); } .sp-record-item-container .sp-record-item-field>.sp-record-item-label { font-size:1.15rem; font-weight:bold; padding:.25rem .5rem; word-break:break-all; -webkit-box-sizing:border-box; box-sizing:border-box; padding: var(--detail-data-padding) 1rem; color:var(--detail-label-txtcolor); } .sp-record-item-container .sp-record-item-field>.sp-record-item-data { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:vertical; -webkit-box-direction:normal; -ms-flex-direction:column; flex-direction:column; padding:0 1rem var(--detail-data-padding); -webkit-box-sizing:border-box; box-sizing:border-box; color:var(--detail-data-txtcolor); } .sp-record-item-container .sp-record-item-data-selection { display:block; margin:.25rem 0; padding:.5rem .8rem .5rem 0; border-radius:0.25rem; } .sp-record-item-container .sp-html-parts p { margin:0; } .sp-record-item-container .sp-record-item-no-item { margin:6.25rem auto; text-align:center; color:#808080; } .sp-record-item-field:first-child, .sp-record-item-field-ie:first-child { padding-top:0 !important; } .sp-record-item-field:last-child, .sp-record-item-field-ie:last-child { border-bottom:none; } .sp-file-info { padding-top:1em; padding-bottom:1em; line-height:1.5; } .sp-file-info:last-child { padding-bottom:0; } .sp-form-file-bold-link { text-decoration:none !important; color:var(--detail-link-txtcolor); cursor:pointer; font-weight:bold; } .sp-form-file-size-label { color:#6c757d; } @media (min-width:768px) { body{ margin: 8px; } .sp-record-item-container { font-size:initial; /* width: clamp(752px, 90%, 1200px); */ width: clamp(452px, 60%, 800px); height: auto; min-height:unset; padding:1.5rem 3rem; border: var(--detail-container-border); border-radius: var(--detail-container-radius); } .sp-item-flex1 { -ms-flex-flow:row nowrap; flex-flow:row nowrap; } .sp-item-flex2 { display: flex; flex-wrap: wrap; flex-flow:row wrap; flex-direction: column; } .sp-record-item-container .sp-record-item-field { -webkit-box-orient:horizontal; -webkit-box-direction:normal; /* -ms-flex-flow:row nowrap; */ /* flex-flow:row nowrap; */ } .sp-record-item-container .sp-record-item-field>.sp-record-item-label { font-size:1rem; width: var(--detail-label-width); } .sp-record-item-container .sp-record-item-field>.sp-record-item-data { font-size:1rem; width: var(--detail-data-width); padding: var(--detail-data-padding) 1rem; } .sp-record-item-container .sp-record-item-field .sp-record-item-embedded { font-size:.9rem; padding-left:.25rem; } .sp-record-item-container .sp-record-item-data-selection { font-size:.9rem; margin:0 1rem 0 0; padding:0; } .sp-record-item-container .sp-record-item-data-selection-vertical { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:vertical; -webkit-box-direction:normal; -ms-flex-direction:column; flex-direction:column; } .sp-record-item-container .sp-record-item-data-selection-horizontal { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:horizontal; -webkit-box-direction:normal; -ms-flex-flow:row wrap; flex-flow:row wrap; } } img{ margin:auto; width:100%; } .sp-record-item-container .sp-record-item-parts{ display:block; text-align:left; }
HTMLの「"f0xx"」には、物件マスタDB内の対応するフィールドIDを記載ください。
手順10:物件詳細ページに埋め込む予約可能日一覧を作成
物件詳細ページ内に物件に紐づく予約可能日情報を表示します。
手順8で作成したページの BODY から「+」ボタンを押下し、レコードリストブロックを作成します。
予約可能日情報を表示するためにはレコード公開範囲を設定する必要があります。
サイト管理から、レコード公開範囲を設定します。
レコード公開範囲から「+」ボタンを押下し、カレンダーDBを選択します。
公開範囲は「一般公開およびエリア認証時公開」とし、一般公開は条件抽出を「抽出する」でアクセス日との関係抽出を「予約日」「年月日」「の〇日前以降」「14」と 「予約日」「年月日」「の〇日前以前」「1」を設定します。
エリア認証時公開範囲は設定する必要はありません。
レコードアイテムブロックは使用しないため、「作成しない」に設定ください。
設定方法は、ソース設定を選択します。
公開するレコードを絞りたいので、レコードリストブロックからリスト設定を設定します。
HTML
CSS
HTMLの「"f0xx"」には、カレンダーDB内の対応するフィールドIDを記載ください。
HTMLの「"f0xx.xx"」には、カレンダーDBの参照_物件マスタDB(参照フィールド)のフィールドIDと物件マスタDBの物件IDのフィールドIDを記載ください。
HTMLの「"p0xxxx"」には、手順13で作成する内覧予約ページのIDを記載ください。
PHPの「"認証エリアの識別名"」、「"資料請求ページの識別名"」には、それぞれ内覧予約認証エリア、資料請求ページの識別名を作成後追記ください。
PHPの設定値には、それぞれAPIキー、物件マスタDBID、アプリID、カレンダーDBIDを記載ください。
PHPの「"資料請求フォームの識別名"」、「"認証エリアの識別名"」、「"物件詳細ページの識別名"」には、それぞれ資料請求フォーム、内覧予約認証エリア、物件詳細ページの識別名を記載ください。
「'f0xx'」には、物件マスタDB内の対応するフィールドIDを記載ください。
「rlb0xxxx_q_f0xx」には、物件詳細ページでレコードリストを絞り込むために、手順10で作成する予約可能日一覧のIDとカレンダーDBの物件IDのフィールドのIDを記載します。
手順8で作成したページの BODY から「+」ボタンを押下し、レコードリストブロックを作成します。
予約可能日情報を表示するためにはレコード公開範囲を設定する必要があります。
サイト管理から、レコード公開範囲を設定します。
レコード公開範囲から「+」ボタンを押下し、カレンダーDBを選択します。
公開範囲は「一般公開およびエリア認証時公開」とし、一般公開は条件抽出を「抽出する」でアクセス日との関係抽出を「予約日」「年月日」「の〇日前以降」「14」と 「予約日」「年月日」「の〇日前以前」「1」を設定します。
エリア認証時公開範囲は設定する必要はありません。
レコードアイテムブロックは使用しないため、「作成しない」に設定ください。
設定方法は、ソース設定を選択します。
公開するレコードを絞りたいので、レコードリストブロックからリスト設定を設定します。
レコードリストブロックのリスト設定は下記のように設定ください。
フィールド条件抽出は高度な条件設定で関数設定にしたうえで、下記関数を設定ください。フィルタ | 初期ソート | 初期表示件数 |
---|---|---|
なし | (ID) 昇順 | 20件 |
関数設定
@holidayFlag = '1'
HTML
<div class="sp-record-list-container"> <div class="sp-record-list-parts sp-record-list-pagination"> <div class="sp-record-list-pagination-left"></div> <div class="sp-record-list-pagination-center"></div> <div class="sp-record-list-pagination-right"> <div> <span th:text="${pagination.startIndex}"></span> - <span th:text="${pagination.endIndex}"></span> / </div> <div> <span th:text="${recordList.totalRecordCount}">Total count</span> </div> <div class="sp-form-dropdown-inline"> <select class="sp-form-control sp-url-switcher"> <option value="20" th:selected="${pagination.currentPageSize == 20}" th:attr="data-link=${pagination.getLinkWithPageSize(20)}">20件</option> <option value="50" th:selected="${pagination.currentPageSize == 50}" th:attr="data-link=${pagination.getLinkWithPageSize(50)}">50件</option> </select> <span class="sp-form-dropdown-icon"></span> </div> </div> </div> <div class="sp-record-list-parts"> <table class="sp-record-list-table sp-table-hover"> <thead> <tr> <!--/* 予約日 (reservationDate) */--> <th scope="col"> <a th:class="${pagination.isSorted('f0xx')} ? |sp-${pagination.getSortDirection('f0xx')}-sorted|" th:href="${pagination.getLinkWithSort('f0xx')}"> <span th:text="${fields['f0xx'].label}">Label</span> <span class="sp-sorting-desc"><i class="fa fa-angle-down"></i></span> <span class="sp-sorting-asc"><i class="fa fa-angle-up"></i></span> </a> </th> <!--/* 予約時間 (reservationTime) */--> <th scope="col"> <span th:text="${fields['f0xx'].label}">Label</span> </th> <!--/* 残席数 (seatNum) */--> <th scope="col"> <span th:text="${fields['f0xx'].label}">Label</span> </th> </tr> </thead> <tbody> <tr th:each="record, stat : ${pageRecords}"> <!--/* 物件ID (preview_ref.propertyID) */--> <sp:record-data-field name="f0xx.xx"></sp:record-data-field> <!--/* 物件ID (propertyID) */--> <sp:record-data-field name="f0xx"></sp:record-data-field> <!--/* 予約日 (reservationDate) */--> <sp:record-data-field name="f0xx"></sp:record-data-field> <td> <span th:text="${record['f0xx'] != null} ? ${record['f0xx'].format('yyyy/MM/dd')} : ''">2000/01/01</span> </td> <!--/* 予約時間 (reservationTime) */--> <sp:record-data-field name="f0xx"></sp:record-data-field> <td> <span th:text="${record['f0xx'] != null} ? ${record['f0xx'].format('HH:mm')} : ''">12:00</span> </td> <!--/* 残席数 (seatNum) */--> <sp:record-data-field name="f0xx"></sp:record-data-field> <td> <!-- <span th:text="${record['f0xx']}">12345</span> --> <div class="sp-record-list-card-actions"> <!--/* 残席数4以上のとき表示 */--> <th:block th:if="!|${#lists.contains(cp.result.value['SEAT_NUM_AVAIL'], #strings.toString(record['f0xx']))}|"> <a th:if="${record['f0xx'] != null}" th:href="|${pages['p066463']?.path ?:'/404'}?${record['f0xx'].linkParam}&reservationID=${record['f0xx']['f0xx']}_${record['f0xx'].format('yyyy-MM-dd')}-${record['f0xx'].format('HH')}|" th:text="${cp.result.value['SEAT_NUM_AVAIL_MESSAGE']}">12345</a> </th:block> <!--/* 残席数1-3のとき表示 */--> <th:block th:if="|${#lists.contains(cp.result.value['SEAT_NUM_FEW'], #strings.toString(record['f0xx']))}|"> <a th:if="${record['f0xx'] != null}" th:href="|${pages['p066463']?.path ?:'/404'}?${record['f0xx'].linkParam}&reservationID=${record['f0xx']['f0xx']}_${record['f0xx'].format('yyyy-MM-dd')}-${record['f0xx'].format('HH')}|" th:text="${cp.result.value['SEAT_NUM_FEW_MESSAGE']}">hoge</a> </th:block> <!--/* 残席数0のとき表示 */--> <th:block th:if="|${#lists.contains(cp.result.value['SEAT_NUM_FULL'], #strings.toString(record['f0xx']))}|"> <span class="full_seat" th:text="${cp.result.value['SEAT_NUM_FULL_MESSAGE']}">hoge</span> </th:block> </div> </td> </tr> </tbody> </table> <div class="sp-record-list-no-records" th:if="${recordList.totalRecordCount == 0}"> 表示できるデータがありません </div> </div> <div class="sp-record-list-parts sp-record-list-pagination"> <div class="sp-record-list-pagination-left"></div> <div class="sp-record-list-pagination-center"> <ul class="sp-page-navs" th:with="pageNavItemSize = 5" th:if="${recordList.totalRecordCount != 0}"> <li class="sp-page-nav-item" th:if="!${pagination.isFirstPage}"> <a th:href="${pagination.firstPageLink}"><<</a> </li> <li class="sp-page-nav-item" th:if="!${pagination.isFirstPage}"> <a th:href="${pagination.prevPageLink}"><</a> </li> <li class="sp-page-nav-item" th:each="item : ${pagination.getPrevPageNavItems(pageNavItemSize)}"> <a th:text="${item.pageNum}" th:href="${item.link}">Page Number</a> </li> <li class="sp-page-nav-item sp-page-nav-current"> <span th:text="${pagination.currentPageNum}">Page Number</span> </li> <li class="sp-page-nav-item" th:each="item : ${pagination.getNextPageNavItems(pageNavItemSize)}"> <a th:text="${item.pageNum}" th:href="${item.link}">Page Number</a> </li> <li class="sp-page-nav-more" th:if="${pagination.showEllipsis}">...</li> <li class="sp-page-nav-item" th:if="!${pagination.isLastPage}"> <a th:href="${pagination.nextPageLink}">></a> </li> <li class="sp-page-nav-item" th:if="!${pagination.isLastPage} and !${recordList.recordCountLimitExceeded}"> <a th:href="${pagination.lastPageLink}">>></a> </li> </ul> </div> <div class="sp-record-list-pagination-right"></div> </div> </div>
CSS
:root { /*============================= カスタムプロパティ ==============================*/ --background-color: #FFFFFF; /* ページの背景色 */ --main-color: #0D60DB; /* メインカラー */ --table-border: 1.5px solid #EBEBEB; /* レコードリストの枠線(外周) */ --table-shadow: 0 2px 5px rgba(0,0,0,0.2); /* レコードリストの影 */ --mobile-table-width: 200%; /* スマホ表示時のレコードリストの横幅 */ --th-color:#FFFFFF; /* ヘッダ行の背景色 */ --th-txtcolor:#333333;/* ヘッダ行の文字色 */ --th-col-border: none; /* ヘッダ行の縦線 */ --th-bottom-border: 1.5px solid #EBEBEB; /* ヘッダ行の下線 */ --data-color: #FFFFFF; /* データ行の背景色 */ --even-color: #FFFFFF; /* データ行の背景色(偶数行) */ --hover-color: #E9F6FF; /* データ行の背景色(マウスオーバー時) */ --data-padding: 16px; /* データ行の余白(上下) */ /* --link-color: #4286F4; リンク列の文字色 */ --link-color: #0000ee; --row-border: 1.5px solid #EBEBEB; /* リストの横線 */ --col-border: none; /* リストの縦線 */ --border-radius: 12px; /* 角の丸さ */ word-break: break-all; /* 改行 */ /*------ 項目ごとの横幅を固定したい場合は合計100%になるよう調整 -------*/ --col01-width: ; /* 項目1 */ --col02-width: ; /* 項目2 */ --col03-width: ; /* 項目3 */ --col04-width: ; /* 項目4 */ --col05-width: ; /* 項目5 */ --col06-width: ; /* 項目6 */ --col07-width: ; /* 項目7 */ --col08-width: ; /* 項目8 */ --col09-width: ; /* 項目9 */ --col10-width: ; /* 項目10 */ } body{ background: var(--background-color); } .sp-record-list-container { color:#333333; clamp(452px, 60%, 800px) margin:0 auto; } body .full_seat { color:#ff0000; font-weight: bold; } .sp-record-list-card-actions { display:flex; /* justify-content:flex-end; */ width: 50%; justify-content:center; margin: 0.5rem 0; } .sp-record-list-card-actions a { border:1px solid #dddddd; border-radius:0.25rem; color:#333333; /* background-color:#ffffff; */ font-size:0.875rem; padding:0.5rem 0.75rem; text-align:center; text-decoration:none; flex: 1; } .sp-record-list-container .sp-html-parts p { margin:0; } .sp-record-list-container .sp-record-list-parts { /* margin: 0 1rem .5rem; */ } .sp-record-list-container .sp-record-list-table { line-height:1.15; border-collapse:collapse; width:clamp(452px, 60%, 800px); height: 100%; margin:auto auto 1rem auto; color:#333333; border-radius: var(--border-radius); border: var(--table-border); border-collapse: separate; border-spacing: 0; box-shadow: var(--table-shadow); overflow: hidden; padding: 0.5rem; } .sp-record-list-container .sp-record-list-table caption { padding-top:0.75rem; padding-bottom:0.75rem; color:#6c757d; text-align:left; caption-side:bottom; } .sp-record-list-container .sp-record-list-table a { text-decoration:none; } .sp-record-list-container .sp-record-list-table th, .sp-record-list-container .sp-record-list-table td { vertical-align:top; border-top:var(--row-border); } .sp-record-list-container .sp-record-list-table td:not(:last-child) { border-right: var(--col-border); } .sp-record-list-container .sp-record-list-table th { text-align:inherit; padding: 1.0rem 0.75rem; } .sp-record-list-container .sp-record-list-table td { padding: var(--data-padding) 0.75rem; } .sp-record-list-container .sp-record-list-table thead th { background: var(--th-color); color:var(--th-txtcolor); padding: calc(var(--data-padding) * 1.2) 0.75rem; font-weight:bold; vertical-align:top; border-bottom:var(--th-bottom-border); text-align:center; } .sp-record-list-container .sp-record-list-table thead th:not(:last-child){ border-right: var(--th-col-border); } .sp-record-list-container .sp-record-list-table thead th:nth-child(1) { width: var(--col01-width);} .sp-record-list-container .sp-record-list-table thead th:nth-child(2) { width: var(--col02-width);} .sp-record-list-container .sp-record-list-table thead th:nth-child(3) { width: var(--col03-width); text-align: left; } .sp-record-list-container .sp-record-list-table thead th:nth-child(4) { width: var(--col04-width);} .sp-record-list-container .sp-record-list-table thead th:nth-child(5) { width: var(--col05-width);} .sp-record-list-container .sp-record-list-table thead th:nth-child(6) { width: var(--col06-width);} .sp-record-list-container .sp-record-list-table thead th:nth-child(7) { width: var(--col07-width);} .sp-record-list-container .sp-record-list-table thead th:nth-child(8) { width: var(--col08-width);} .sp-record-list-container .sp-record-list-table thead th:nth-child(9) { width: var(--col09-width);} .sp-record-list-container .sp-record-list-table thead th:nth-child(10) { width: var(--col10-width);} .sp-record-list-container .sp-record-list-table thead th.sp-nowrap { white-space:nowrap; } .sp-record-list-container .sp-record-list-table thead th.sp-nowrap-truncate { white-space:nowrap; } .sp-record-list-container .sp-record-list-table thead th.sp-nowrap-truncate a>span:first-child { display:inline-block; vertical-align:middle; max-width:12rem; overflow:hidden; text-overflow:ellipsis; } .sp-record-list-container .sp-record-list-table thead th a { color:inherit; text-decoration:none; } .sp-record-list-container .sp-record-list-table thead th a .sp-sorting-asc, .sp-record-list-container .sp-record-list-table thead th a .sp-sorting-desc { color: var(--th-txtcolor); } .sp-record-list-container .sp-record-list-table thead th a .sp-sorting-asc .fa, .sp-record-list-container .sp-record-list-table thead th a .sp-sorting-desc .fa { font-weight:bold; } .sp-record-list-container .sp-record-list-table thead th a .sp-sorting-desc { visibility:hidden; } .sp-record-list-container .sp-record-list-table thead th a .sp-sorting-asc { display:none; } .sp-record-list-container .sp-record-list-table thead th a.sp-desc-sorted .sp-sorting-desc { visibility:visible; } .sp-record-list-container .sp-record-list-table thead th a.sp-asc-sorted .sp-sorting-asc { display:inline; } .sp-record-list-container .sp-record-list-table thead th a.sp-asc-sorted .sp-sorting-desc { display:none; } .sp-record-list-container .sp-record-list-table thead th a:hover { color:#333333; text-decoration:none; } .sp-record-list-container .sp-record-list-table thead th a:hover:not(.sp-sorted) .sp-sorting-desc { visibility:visible; } .sp-record-list-container .sp-record-list-table tbody+tbody { border-top:2px solid #dddddd; } .sp-record-list-container .sp-record-list-table tbody tr td{ transition: .1s; width: 30%; } .sp-record-list-container .sp-record-list-table tbody tr:hover a{ background:var(--hover-color); } .sp-record-list-container .sp-record-list-table tbody tr{ background: var(--data-color); } .sp-record-list-container .sp-record-list-table tbody tr:nth-child(even){ background: var(--even-color); } .sp-record-list-container .sp-record-list-table tr:first-child th, .sp-record-list-container .sp-record-list-table tr:first-child td { border-top:0; } .sp-record-list-container .sp-record-list-table td a:not(.sp-form-file-bold-link) { color: var(--link-color); font-weight:bold; display: inline-block; width: 100%; height: 100%; padding: var(--data-padding) 0.75rem; margin: calc(-1 * var(--data-padding)) -0.75rem; transition: .1s; } .sp-record-list-container .sp-record-list-table td span:not(.sp-form-file-bold-link) { /* color: var(--link-color); */ font-weight:bold; display: inline-block; width: 100%; height: 100%; padding: var(--data-padding) 0.75rem; margin: calc(-1 * var(--data-padding)) -0.75rem; transition: .1s; } .sp-record-list-container .sp-record-list-table td span:nth-child(n+2) { margin-left:.1rem; } .sp-record-list-container .sp-record-list-table a.sp-form-file-bold-link { text-decoration:none; color: var(--link-color); cursor:pointer; font-weight:bold; } .sp-form-file-text-label { color:#6c757d; } .sp-record-list-container .sp-table-sm th, .sp-record-list-container .sp-table-sm td { padding:0.3rem; } .sp-record-list-container .sp-table-bordered { border:1px solid #dddddd; } .sp-record-list-container .sp-table-bordered th, .sp-record-list-container .sp-table-bordered td { border:1px solid #dddddd; } .sp-record-list-container .sp-table-bordered thead th, .sp-record-list-container .sp-table-bordered thead td { border-bottom-width:2px; } .sp-record-list-container .sp-table-borderless th, .sp-record-list-container .sp-table-borderless td, .sp-record-list-container .sp-table-borderless tbody+tbody { border:0; } .sp-record-list-container .sp-record-list-no-records { margin:6.25rem auto; text-align:center; color:#808080; } .sp-record-list-pagination { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-pack:justify; -ms-flex-pack:justify; justify-content:space-between; -webkit-box-align:center; -ms-flex-align:center; align-items:center; width: clamp(452px, 60%, 800px); margin: auto; } .sp-record-list-pagination .sp-record-list-pagination-left, .sp-record-list-pagination .sp-record-list-pagination-center, .sp-record-list-pagination .sp-record-list-pagination-right { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-align:center; -ms-flex-align:center; align-items:center; } .sp-record-list-pagination .sp-record-list-pagination-left>*, .sp-record-list-pagination .sp-record-list-pagination-center>*, .sp-record-list-pagination .sp-record-list-pagination-right>* { margin:0 .5rem; } .sp-record-list-pagination .sp-record-list-pagination-left { -webkit-box-pack:start; -ms-flex-pack:start; justify-content:flex-start; } .sp-record-list-pagination .sp-record-list-pagination-center { -webkit-box-pack:center; -ms-flex-pack:center; justify-content:center; } .sp-record-list-pagination .sp-record-list-pagination-right { -webkit-box-pack:end; -ms-flex-pack:end; justify-content:flex-end; } .sp-record-list-pagination .sp-form-control { -webkit-appearance:none; -moz-appearance:none; appearance:none; font-family:inherit; font-size:1rem; line-height:1.5; padding:.3rem .7rem; color:#333333; -webkit-box-sizing:border-box; box-sizing:border-box; width:100%; margin: 1px 1px calc(0.2rem + 1px); border:1px solid #dddddd; border-radius:calc(var(--border-radius) / 1.2); box-sizing:border-box; outline:none; } .sp-record-list-pagination .sp-form-control:focus { margin: 0 0 0.2rem; border: 2px solid var(--main-color); } .sp-record-list-pagination .sp-form-inline .sp-form-control { display:inline-block; width:auto; vertical-align:middle; } .sp-record-list-pagination select.sp-form-control, .sp-record-list-pagination option.sp-form-control { -webkit-appearance:none; -moz-appearance:none; appearance:none; padding-right:1.5rem; } .sp-record-list-pagination select.sp-form-control::-ms-expand { display:none; } .sp-record-list-pagination .sp-form-dropdown { position:relative; } .sp-record-list-pagination .sp-form-dropdown-inline { position:relative; display:inline-block; } .sp-record-list-pagination .sp-form-dropdown-icon { display:block; position:absolute; top:1rem; right:.5rem; line-height:0; pointer-events:none; } .sp-record-list-pagination .sp-form-dropdown-icon:after { content:""; display:block; border-top:.333rem solid #888888; border-right:.333rem solid transparent; border-left:.333rem solid transparent; } .sp-record-list-pagination ul.sp-page-navs { display:-webkit-box; display:-ms-flexbox; display:flex; padding-left:0; list-style:none; } .sp-record-list-pagination ul.sp-page-navs li.sp-page-nav-item { line-height:1.25rem; text-align:center; -webkit-user-select:none; -moz-user-select:none; -ms-user-select:none; user-select:none; white-space:nowrap; } .sp-record-list-pagination ul.sp-page-navs li.sp-page-nav-item a, .sp-record-list-pagination ul.sp-page-navs li.sp-page-nav-item span { display:inline-block; margin:0 0.2rem; padding:.375rem .75rem; border-radius:calc(var(--border-radius) / 1.2); color:var(--main-color); font-weight: bold; } .sp-record-list-pagination ul.sp-page-navs li.sp-page-nav-item a .fa, .sp-record-list-pagination ul.sp-page-navs li.sp-page-nav-item span .fa { font-size:1.125rem; width:1rem; } .sp-record-list-pagination ul.sp-page-navs li.sp-page-nav-item a { text-decoration:none; } .sp-record-list-pagination ul.sp-page-navs li.sp-page-nav-item a:hover { background-color:rgba(0,0,0,0.075); } .sp-record-list-pagination ul.sp-page-navs li.sp-page-nav-item span { background-color:rgba(0,0,0,0.075); color: var(--main-color); font-weight: bold; } .sp-record-list-pagination ul.sp-page-navs li.sp-page-nav-item.sp-page-nav-current span { background-color:var(--main-color); border-color:var(--main-color); color:#ffffff; } .sp-record-list-pagination ul.sp-page-navs li.sp-page-nav-more { line-height:1rem; text-align:center; margin:0 .2rem; padding:.375rem .3rem; } @media (max-width: 765px) { .sp-record-list-container .sp-record-list-parts { margin: 0 0 .5rem; } .sp-record-list-container [class="sp-record-list-parts"]{ overflow-x: auto; } .sp-record-list-container .sp-record-list-table { width: var(--mobile-table-width); font-size: .9em; box-shadow: unset; } } .sp-record-list-container .sp-record-list-table thead th:nth-child(3){ text-align:center; }
HTMLの「"f0xx"」には、カレンダーDB内の対応するフィールドIDを記載ください。
HTMLの「"f0xx.xx"」には、カレンダーDBの参照_物件マスタDB(参照フィールド)のフィールドIDと物件マスタDBの物件IDのフィールドIDを記載ください。
HTMLの「"p0xxxx"」には、手順13で作成する内覧予約ページのIDを記載ください。
手順11:予約可能日一覧を検索するためのレコード検索ブロックを作成
手順8で作成したページの BODY から「+」ボタンを押下し、レコードリストブロックを作成します。
検索対象レコードリストは予約可能日一覧、検索結果表示ページは物件詳細ページを選択します。
検索対象レコードリストは予約可能日一覧、検索結果表示ページは物件詳細ページを選択します。
HTML
CSS
<div class="sp-record-search-container"> <div class="sp-record-search-parts sp-html-parts"><p>予約日検索</p></div> <!--/* 予約日 (reservationDate) */--> <sp:record-search-field name="f0xx"></sp:record-search-field> <div class="sp-record-search-parts sp-record-search-field"> <div class="sp-record-search-label" th:text="${fields['f0xx'].label}">Label</div> <div class="sp-record-search-data"> <div class="sp-form-datetimes"> <div class="sp-form-date"> <input type="date" class="sp-form-control" th:name="${fields['f0xx:after'].name}" th:placeholder="${fields['f0xx'].placeholder.startDate}" th:value="${inputs['f0xx:after']}"> <span class="sp-form-date-separator">〜</span> <input type="date" class="sp-form-control" th:name="${fields['f0xx:before'].name}" th:placeholder="${fields['f0xx'].placeholder.endDate}" th:value="${inputs['f0xx:before']}"> </div> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> </div> </div> <div class="sp-form-item sp-form-html" th:inline="none">カレンダーマークを押すとカレンダーが表示されます。</div> <div class="sp-record-search-parts sp-form-interaction"> <button class="sp-search-button" type="submit" name="action" value="search">検索</button> </div> </div>
CSS
:root { /*============================= カスタムプロパティ ==============================*/ --search-container-color: #FFFFFF; /* 検索コンテナの背景色 */ --search-container-border: 1.5px solid #EBEBEB; /* 検索コンテナの枠線 */ --search-container-shadow: 0 2px 5px rgba(0,0,0,0.2); /* 検索コンテナの影 */ --search-label-txtcolor: #333333; /* ラベルの文字色 */ --search-input-color: #F7F8FC; /* 入力欄の背景色 */ --search-input-border-color: #F0F1F5; /* 入力欄の枠線の色 */ --search-border-radius: 12px; /* 角の丸さ */ text-align: center; } .sp-record-search-container { background-color:#ffffff; border-radius:var(--search-border-radius); -webkit-box-sizing:border-box; box-sizing:border-box; background: var(--search-container-color); color:#333333; padding:1rem; width:clamp(452px, 60%, 800px); margin:auto; margin-bottom:1rem; border: var(--search-container-border); box-shadow: var(--search-container-shadow); font-size: .9rem; } .sp-record-search-container .sp-record-search-parts { margin-bottom:.5rem; } .sp-record-search-container .sp-record-search-parts:last-child { margin-bottom:0; } .sp-record-search-container .sp-html-parts p { margin:0; } .sp-record-search-container .sp-record-search-field { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:vertical; -webkit-box-direction:normal; -ms-flex-direction:column; flex-direction:column; } .sp-record-search-container .sp-record-search-field>.sp-record-search-label { font-size:1rem; font-weight:bold; padding:.25rem .5rem; word-break:break-all; -webkit-box-sizing:border-box; box-sizing:border-box; color:#555555; } .sp-record-search-container .sp-record-search-field>.sp-record-search-data { padding:.25rem .5rem; -webkit-box-sizing:border-box; box-sizing:border-box; margin: auto; } .sp-record-search-container .sp-form-noted { font-size:.8rem; color:#808080; word-break:break-all; margin-top:.5rem; } .sp-record-search-container .sp-form-control { -webkit-appearance:none; -moz-appearance:none; appearance:none; font-family:inherit; font-size:1rem; line-height:1.5; padding:.3rem .7rem; color:#333333; background: var(--search-input-color); -webkit-box-sizing:border-box; box-sizing:border-box; width:100%; height:42px; outline:none; border:none; border-radius:calc(var(--search-border-radius) / 1.2); box-shadow:0 0 0 1px var(--search-input-border-color); } .sp-record-search-container .sp-form-control:focus { box-shadow:0 0 0 2px var(--main-color); } .sp-record-search-container .sp-form-control::-webkit-input-placeholder { color:#aaaaaa; } .sp-record-search-container .sp-form-control::-moz-placeholder { color:#aaaaaa; } .sp-record-search-container .sp-form-control:-ms-input-placeholder { color:#aaaaaa; } .sp-record-search-container .sp-form-control::-ms-input-placeholder { color:#aaaaaa; } .sp-record-search-container .sp-form-control::placeholder { color:#aaaaaa; } .sp-record-search-container textarea.sp-form-control { resize:vertical; } .sp-record-search-container select.sp-form-control, .sp-record-search-container option.sp-form-control { -webkit-appearance:none; -moz-appearance:none; appearance:none; padding-right:1.5rem; } .sp-record-search-container select.sp-form-control::-ms-expand { display:none; } .sp-record-search-container .sp-form-dropdown { position:relative; } .sp-record-search-container .sp-form-dropdown-icon { display:block; position:absolute; top:1rem; right:.5rem; line-height:0; pointer-events:none; } .sp-record-search-container .sp-form-dropdown-icon:after { content:""; display:block; border-top:.333rem solid #888888; border-right:.333rem solid transparent; border-left:.333rem solid transparent; } .sp-record-search-container .sp-form-selection { display:block; margin: 0 .5rem 0 0; padding:0 .8rem 0 0; } .sp-record-search-container .sp-form-selection-horizontal { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:horizontal; -webkit-box-direction:normal; -ms-flex-flow:row wrap; flex-flow:row wrap; } .sp-record-search-container .sp-form-selection-label { vertical-align:middle; } .sp-record-search-container .sp-form-selection>input[type="checkbox"] { vertical-align:middle; margin-left:0; } .sp-record-search-container .sp-form-selection>input[type="checkbox"] { display: none; vertical-align: middle; margin-left:0; } .sp-record-search-container .sp-form-selection-label { display: inline-block; position: relative; vertical-align: middle; padding: 4px 0; } .sp-record-search-container .sp-form-selection>input[type="checkbox"]+.sp-form-selection-label::before{ display: inline-block; content:""; position: relative; box-sizing: border-box; top: 4px; margin-right: 6px; width: 20px; height: 20px; background: #ffffff; border:10px solid #ffffff; box-shadow: 0 0 0 1px var(--search-input-border-color); } .sp-record-search-container .sp-form-selection>input[type="checkbox"]+.sp-form-selection-label::before { border-radius: min(calc(var(--search-border-radius) / 1.2), 4px); } .sp-record-search-container .sp-form-selection>input[type="checkbox"]+.sp-form-selection-label::before{ background: var(--search-input-color); border:10px solid var(--search-input-color); } .sp-record-search-container .sp-form-selection>input[type="checkbox"]:hover+.sp-form-selection-label::before{ border:10px solid #dddddd; } .sp-record-search-container .sp-form-selection>input[type="checkbox"]+.sp-form-selection-label::after{ border-right: 3px solid var(--main-color); border-bottom: 3px solid var(--main-color); content: ''; display: inline-block; width: 6px; height: 10px; left: 9px; margin-top: -7px; position: absolute; top: 50%; transform: rotate(45deg); opacity: 0; } .sp-record-search-container .sp-form-selection>input[type="checkbox"]:checked+.sp-form-selection-label::after{ left: 6px; opacity: 1; } .sp-record-search-container .sp-form-datetimes, .sp-record-search-container .sp-form-date, .sp-record-search-container .sp-form-time, .sp-record-search-container .sp-form-timezone { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:horizontal; -webkit-box-direction:normal; -ms-flex-flow:row wrap; flex-flow:row wrap; -webkit-box-align:center; -ms-flex-align:center; align-items:center; } .sp-record-search-container .sp-form-datetime, .sp-record-search-container .sp-form-date, .sp-record-search-container .sp-form-time, .sp-record-search-container .sp-form-timezone { margin-right:.5rem; -ms-flex-wrap:nowrap; flex-wrap:nowrap; } .sp-record-search-container .sp-form-datetime { max-width:20rem; } .sp-record-search-container .sp-form-date-separator { text-align:center; -ms-flex-negative:0; flex-shrink:0; margin:auto .5rem; } .sp-record-search-container .sp-form-date>input, .sp-record-search-container .sp-form-time>input { max-width:9rem; } .sp-record-search-container .sp-search-button { color:#ffffff; background-color: var(--main-color); border:1.0px solid var(--main-color); border-radius:calc(var(--search-border-radius) / 1.2); } .sp-record-search-container .sp-form-interaction { display:-webkit-box; display:-ms-flexbox; display:flex; -ms-flex-wrap:wrap; flex-wrap:wrap; margin-top:.5rem; } .sp-record-search-container .sp-form-interaction>button { -webkit-box-flex:1; -ms-flex-positive:1; flex-grow:1; cursor:pointer; font-size:1rem; line-height:1.5; margin:.5rem; padding:.375rem 0; text-align:center; -webkit-user-select:none; -moz-user-select:none; -ms-user-select:none; user-select:none; white-space:nowrap; } @media (min-width:768px) { .sp-record-search-container { padding:2rem 2rem 1rem; margin-top: 1rem; margin-bottom: 1rem; width:clamp(452px, 60%, 800px); font-size: 1rem; } .sp-record-search-container .sp-record-search-field>.sp-record-search-label { font-size:1rem; } .sp-record-search-container .sp-record-search-field>.sp-record-search-data { font-size:1rem; } .sp-record-search-container .sp-form-control { font-size:.9rem; padding:.27rem .63rem; } .sp-record-search-container .sp-form-selection-vertical { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:vertical; -webkit-box-direction:normal; -ms-flex-direction:column; flex-direction:column; } .sp-record-search-container .sp-form-interaction { -webkit-box-pack:center; -ms-flex-pack:center; justify-content:center; margin-top:1rem; } .sp-record-search-container .sp-form-interaction>button { -webkit-box-flex:0; -ms-flex-positive:0; flex-grow:0; padding:.375rem 5rem; } } .sp-record-search-group { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:vertical; -webkit-box-direction:normal; -ms-flex-direction:column; flex-direction:column; } .sp-record-search-group>.sp-record-search-label { font-size:1.15em; font-weight:bold; padding:.25em .5em; word-break:break-all; box-sizing:border-box; color:#333333; } .sp-record-search-group>.sp-record-search-field { display:block; padding:.25em; } .sp-record-search-group>.sp-record-search-field>.sp-record-search-data { width:auto; padding:0; } .sp-record-search-group>.sp-record-search-field { border-bottom:none; } .sp-record-search-group>.sp-record-search-field>.sp-record-search-label { font-size:.9em; font-weight:normal; width:auto; padding:0; word-break:break-all; display:inline-block; margin-bottom:0.2em; } @media (min-width:768px) { .sp-record-search-group { -webkit-box-orient:horizontal; -webkit-box-direction:normal; -ms-flex-flow:row wrap; flex-flow:row wrap; } .sp-record-search-group>.sp-record-search-label { font-size:1em; width:100%; } .sp-record-search-group>.sp-record-search-data { font-size:1em; width:70%; } .sp-record-search-group>.sp-record-search-data { -webkit-box-orient:horizontal; -webkit-box-direction:normal; -ms-flex-flow:row wrap; flex-flow:row wrap; } }
手順12:物件詳細ページのブロック埋め込み
手順8で作成した物件詳細ページに手順9/手順10で作成したブロックを埋め込みます。
HTML
CSS
また、PHPに予約可能日一覧での予約表示の出し分けと改ざん防止の処理を記載します。
デモでは、残席数が0の時、1~3の時、4の時で表示の出し分けを行っています。
表示出し分けの変更や表示メッセージを変更したい場合は適宜PHPを修正ください。
PHP
HTMLの「"fcb0xxxx"」、「"rib0xxxx"」、「"rsb0xxxx"」、「"rlb0xxxx"」には、それぞれヘッダ、物件詳細ブロック、レコード検索ブロック、予約可能日一覧、フッターのIDを記載ください。HTML
<!-- ヘッダ --> <sp:block name="fcb0xxxx"></sp:block> <!-- 物件詳細 --> <h1>物件詳細ページ</h1> <sp:block name="rib0xxxx"></sp:block> <th:block th:if="${cp.result.value['check']} eq 0"> <div class="sp-record-list-card-actions sp-record-list-container sp-record-list-table sp-url-button"> <a class="url-button button-l" th:href="${pages['p0xxxx']?.path ?:'/404'}">戻る</a> </div> </th:block> <th:block th:if="${cp.result.value['check']} eq 1"> <div class="sp-record-list-card-actions sp-record-list-container sp-record-list-table sp-url-button"> <a class="url-button button-l" th:href="${pages['p0xxxx']?.path ?:'/404'}">戻る</a> <a class="url-button button-r" th:href="${cp.result.value['recordInfo']}">資料請求</a> </div> <!-- 予約日検索 --> <sp:block name="rsb0xxxx"></sp:block> <!-- 予約可能日一覧 --> <h2>予約をする場合は、「空席」または「残りわずか」を押してください。<br>※満席は予約できませんので、ご了承ください。<br>※当日分の予約に関しては、電話で承っております。</h2> <sp:block name="rlb0xxxx"></sp:block> <div class="sp-record-list-container sp-record-list-table sp-url-button"> <a class="url-button button-l" th:href="${pages['p0xxxx']?.path ?:'/404'}">戻る</a> <a class="url-button button-r" th:href="${cp.result.value['recordInfo']}">資料請求</a> </div> </th:block> <!-- フッター --> <sp:block name="fcb0xxxx"></sp:block>
CSS
h2 { text-align: center; } h1 { text-align: center; } .reserve_attention { display: block; text-align: center; margin: 0.5rem 0; } .url-button { width: auto; /* font-size:0.875rem; */ padding:0.5rem 0; text-align:center; text-decoration:none; flex: 1; color: #ffffff; background-color: #0D60DB; border: 1.0px solid #0D60DB; border-radius: calc(12px / 1.2); } .button-l { padding:0.5rem 6%; margin-right: 0.5rem; } .button-r { padding:0.5rem 5%; margin-left: 0.5rem; } .button { padding:0.5rem 5%; } .sp-url-button { text-align: center; width: auto; margin: 1.5rem auto; /* border: 1px solid #dddddd; */ }
また、PHPに予約可能日一覧での予約表示の出し分けと改ざん防止の処理を記載します。
デモでは、残席数が0の時、1~3の時、4の時で表示の出し分けを行っています。
表示出し分けの変更や表示メッセージを変更したい場合は適宜PHPを修正ください。
PHP
<?php //------------------------------ // API設定 //------------------------------ //------------------------------ // 設定値 //------------------------------ define("API_URL", "https://api.spiral-platform.com/v1"); define("API_KEY", "APIキー"); //APIキー define("APP_ROLE", "アプリロール"); //API権限を持つアプリロール識別名 define("DB_ID", "DBID"); //物件マスタDBID define("APP_ID", "アプリID"); //モデルルーム予約管理アプリID //------------------------------ // 残席数表示設定値 //------------------------------ $SPIRAL->setTHValue("SEAT_NUM_AVAIL_MESSAGE", "空席"); //残席数がたくさんある場合に表示するメッセージ $SPIRAL->setTHValue("SEAT_NUM_FEW_MESSAGE", "残りわずか"); //残席数が少しの場合の表示するメッセージ $SPIRAL->setTHValue("SEAT_NUM_FULL_MESSAGE", "満員"); //残席数が0の場合の表示するメッセージ $SPIRAL->setTHValue("SEAT_NUM_AVAIL", array("0","1","2","3")); //残席数比較用(残席数が4~) $SPIRAL->setTHValue("SEAT_NUM_FEW", array("1","2","3")); //残席数比較用(残席数が1~3) $SPIRAL->setTHValue("SEAT_NUM_FULL", "0"); //残席数比較用(残席数が0) $record = $SPIRAL->getParam("record"); $record_url = "/認証エリアの識別名/資料請求ページの識別名" . "?record=" . $record; $SPIRAL->setTHValue("recordInfo", $record_url); //------------------------------ // API実行 //------------------------------ // 物件ID確認 $commonBase = CommonBase::getInstance(); //------------------------------ // ページ表示設定 //------------------------------ $record = explode(".", $SPIRAL->getParam("record"));//レコードアイテムブロックが表示された時、URLクエリパラメータから「レコードID」を取得。 $recordId = $record[1]; $property_Id = $SPIRAL->getParam("rlb0xxxx_q_f0xx");//レコードリストブロックが表示された時、URLクエリパラメータから「物件ID」を取得。 $resultRecordSelect = $commonBase->apiCurlAction("GET", "/apps/". APP_ID. "/dbs/". DB_ID. "/records/". $recordId); $check = 0; if($property_Id == $resultRecordSelect['item']['propertyID']){ $check = 1; } $SPIRAL->setTHValue("check", $check);//Thymeleafに比較結果をセット //------------------------------ // 共通モジュール //------------------------------ class CommonBase { /** * シングルトンインスタンス * @var UserManager */ protected static $singleton; public function __construct() { if (self::$singleton) { throw new Exception('must be singleton'); } self::$singleton = $this; } /** * シングルトンインスタンスを返す * @return UserManager */ public static function getInstance() { if (!self::$singleton) { return new CommonBase(); } else { return self::$singleton; } } /** * V2用 API送信ロジック * @return Result */ function apiCurlAction($method, $addUrlPass, $data = null, $multiPart = null, $jsonDecode = null) { $header = array( "Authorization:Bearer ". API_KEY, "X-Spiral-Api-Version: 1.1", ); if($multiPart) { $header = array_merge($header, array($multiPart)); } else { $header = array_merge($header, array("Content-Type:application/json")); } if(APP_ROLE){ $header = array_merge($header, array("X-Spiral-App-Role: ".APP_ROLE)); } // curl $curl = curl_init(); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_URL, API_URL. $addUrlPass); curl_setopt($curl, CURLOPT_HTTPHEADER, $header); if ($method == "POST") { if ($multiPart) { curl_setopt($curl, CURLOPT_POSTFIELDS, $data); } else { curl_setopt($curl, CURLOPT_POSTFIELDS , json_encode($data)); } curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method); } if ($method == "PATCH") { curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data)); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method); } if ($method == "DELETE") { curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data)); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method); } $response = curl_exec($curl); if (curl_errno($curl)) echo curl_error($curl); curl_close($curl); if($jsonDecode){ return $response; }else{ return json_decode($response, true); } } } ?>
PHPの「"認証エリアの識別名"」、「"資料請求ページの識別名"」には、それぞれ内覧予約認証エリア、資料請求ページの識別名を作成後追記ください。
手順13:内覧予約ページを作成
手順2で作成した認証エリアの「+」ボタンから新規ページを作成します。
内覧予約ページは公開ページのため、認証はなしで設定します。
設定方法は、ソース設定を選択します。
内覧予約ページは公開ページのため、認証はなしで設定します。
設定方法は、ソース設定を選択します。
手順14:内覧予約ページに埋め込む内覧予約フォームブロックを作成
内覧予約フォームブロックは、登録ブロックで作成します。
登録ブロックは、ソース設定で作成します。
HTML
CSS
HTMLの「"f0xx"」には、内覧予約DB内の対応するフィールドIDを記載ください。
登録ブロックは、ソース設定で作成します。
HTML
<div class="sp-form-container"> <div class="sp-step-flow-f24431"> <div class="large-setting arrow sp-clearfix"> <div class="step active" title="入力"> <span>入力</span> </div> <div class="step" title="確認"> <span>確認</span> </div> <div class="step" title="完了"> <span>完了</span> </div> </div> <div class="small-setting arrow sp-clearfix"> <div class="step active" title="入力"> <span>入力</span> </div> <div class="step" title="確認"> <span>確認</span> </div> <div class="step" title="完了"> <span>完了</span> </div> </div> </div> <div class="sp-form-item sp-form-html" th:inline="none"><p><span style="font-size: 18pt;">内覧予約登録フォーム</span></p></div> <div class="sp-form-item sp-form-html" th:inline="none">必要事項をご入力の上、「確認画面へ」ボタンを押してください</div> <!--/* 名前(name) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <input type="text" class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="|${inputs['f0xx'] ?:'スパイラル太郎'}|" th:if="${fields['f0xx'].control == 'text'}"> <!--ZipCode Option--> <div class="sp-form-zip-code" th:if="${fields['f0xx'].control == 'zipCode'}"> <input type="text" class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="${inputs['f0xx']}"> <button class="sp-form-zip-code-button" th:data-zipcode="|zipCodeSearch${fields['f0xx'].name}|" th:if="${fields['f0xx'].addressByZipCode != null}" th:text="${fields['f0xx'].zipCodeButtonLabel}">住所検索</button> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:data-zipcode="|zipCodeError${fields['f0xx'].name}|" th:text="${errors['f0xx']?.message}">Error message</span> </div> </div> <!--/* メールアドレス(mail) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <input type="email" class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="|${inputs['f0xx'] ?:'sample@spiral-platform.co.jp'}|"> <div th:if="${fields['f0xx'].collation}"> <span class="sp-form-email-reenter" th:text="${fields['f0xx'].reenterLabel}">Re-enter to confirm</span> <input type="email" class="sp-form-control" th:name="${fields['f0xx:reenter'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="|${inputs['f0xx'] ?:'sample@spiral-platform.co.jp'}|"> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:if="${errors['f0xx'] != null}" th:text="${errors['f0xx'].message}">Error message</span> </div> </div> <!--/* 都道府県(pref) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <div class="sp-form-dropdown"> <select class="sp-form-control" th:name="${fields['f0xx'].name}"> <option value="" th:text="${fields['f0xx'].unselectedLabel}" th:selected="${inputs['f0xx'] == null}">Select option</option> <option th:each="option : ${fields['f0xx'].options}" th:value="${option.id}" th:text="${option.label}" th:selected="${inputs['f0xx'] == #strings.toString(option.id)}">Item</option> </select> <span class="sp-form-dropdown-icon"></span> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:if="${errors['f0xx'] != null}" th:text="${errors['f0xx'].message}">Error message</span> </div> </div> <!--/* 郵便番号(zipCode) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <input type="text" class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="${inputs['f0xx']}" th:if="${fields['f0xx'].control == 'text'}"> <!--ZipCode Option--> <div class="sp-form-zip-code" th:if="${fields['f0xx'].control == 'zipCode'}"> <input type="text" class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="${inputs['f0xx']}"> <button class="sp-form-zip-code-button" th:data-zipcode="|zipCodeSearch${fields['f0xx'].name}|" th:if="${fields['f0xx'].addressByZipCode != null}" th:text="${fields['f0xx'].zipCodeButtonLabel}">住所検索</button> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:data-zipcode="|zipCodeError${fields['f0xx'].name}|" th:text="${errors['f0xx']?.message}">Error message</span> </div> </div> <!--/* 市区町村(municipalities) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <input type="text" class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="|${inputs['f0xx'] ?:'港区赤坂2丁目'}|" th:if="${fields['f0xx'].control == 'text'}"> <!--ZipCode Option--> <div class="sp-form-zip-code" th:if="${fields['f0xx'].control == 'zipCode'}"> <input type="text" class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="${inputs['f0xx']}"> <button class="sp-form-zip-code-button" th:data-zipcode="|zipCodeSearch${fields['f0xx'].name}|" th:if="${fields['f0xx'].addressByZipCode != null}" th:text="${fields['f0xx'].zipCodeButtonLabel}">住所検索</button> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:data-zipcode="|zipCodeError${fields['f0xx'].name}|" th:text="${errors['f0xx']?.message}">Error message</span> </div> </div> <!--/* 番地(block) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <input type="text" class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="|${inputs['f0xx'] ?:'9番11号'}|" th:if="${fields['f0xx'].control == 'text'}"> <!--ZipCode Option--> <div class="sp-form-zip-code" th:if="${fields['f0xx'].control == 'zipCode'}"> <input type="text" class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="${inputs['f0xx']}"> <button class="sp-form-zip-code-button" th:data-zipcode="|zipCodeSearch${fields['f0xx'].name}|" th:if="${fields['f0xx'].addressByZipCode != null}" th:text="${fields['f0xx'].zipCodeButtonLabel}">住所検索</button> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:data-zipcode="|zipCodeError${fields['f0xx'].name}|" th:text="${errors['f0xx']?.message}">Error message</span> </div> </div> <!--/* マンション・ビル名(building) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <input type="text" class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="|${inputs['f0xx'] ?:'オリックス赤坂2丁目ビル'}|" th:if="${fields['f0xx'].control == 'text'}"> <!--ZipCode Option--> <div class="sp-form-zip-code" th:if="${fields['f0xx'].control == 'zipCode'}"> <input type="text" class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="${inputs['f0xx']}"> <button class="sp-form-zip-code-button" th:data-zipcode="|zipCodeSearch${fields['f0xx'].name}|" th:if="${fields['f0xx'].addressByZipCode != null}" th:text="${fields['f0xx'].zipCodeButtonLabel}">住所検索</button> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:data-zipcode="|zipCodeError${fields['f0xx'].name}|" th:text="${errors['f0xx']?.message}">Error message</span> </div> </div> <!--/* 電話番号(phone) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <div class="sp-form-phone"> <div class="sp-form-dropdown" th:if="${fields['f0xx'].countryCode == null}"> <select class="sp-form-control" th:name="${fields['f0xx:countryCode'].name}"> <option value="" th:text="${fields['f0xx'].unselectedCodeLabel}" th:selected="${inputs['f0xx:countryCode'] == null}">Select option</option> <option th:each="countryCode : ${fields['f0xx'].countryCodes}" th:value="${countryCode.country.alpha2Code}" th:text="|${countryCode.country.alpha2Code}(+${countryCode.code})|" th:selected="${inputs['f0xx:countryCode'] == countryCode.country.alpha2Code}">Item</option> </select> <span class="sp-form-dropdown-icon"></span> </div> <input type="tel" class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="${inputs['f0xx']}"> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:if="${errors['f0xx'] != null}" th:text="${errors['f0xx'].message}">Error message</span> </div> </div> <!--/* 職業(occupation) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <div class="sp-form-dropdown"> <select class="sp-form-control" th:name="${fields['f0xx'].name}"> <option value="" th:text="${fields['f0xx'].unselectedLabel}" th:selected="${inputs['f0xx'] == null}">Select option</option> <option th:each="option : ${fields['f0xx'].options}" th:value="${option.id}" th:text="${option.label}" th:selected="${inputs['f0xx'] == #strings.toString(option.id)}">Item</option> </select> <span class="sp-form-dropdown-icon"></span> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:if="${errors['f0xx'] != null}" th:text="${errors['f0xx'].message}">Error message</span> </div> </div> <!--/* 希望占有面積(occupiedArea) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <div class="sp-form-dropdown"> <select class="sp-form-control" th:name="${fields['f0xx'].name}"> <option value="" th:text="${fields['f0xx'].unselectedLabel}" th:selected="${inputs['f0xx'] == null}">Select option</option> <option th:each="option : ${fields['f0xx'].options}" th:value="${option.id}" th:text="${option.label}" th:selected="${inputs['f0xx'] == #strings.toString(option.id)}">Item</option> </select> <span class="sp-form-dropdown-icon"></span> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:if="${errors['f0xx'] != null}" th:text="${errors['f0xx'].message}">Error message</span> </div> </div> <!--/* ご予算(budget) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <div class="sp-form-dropdown"> <select class="sp-form-control" th:name="${fields['f0xx'].name}"> <option value="" th:text="${fields['f0xx'].unselectedLabel}" th:selected="${inputs['f0xx'] == null}">Select option</option> <option th:each="option : ${fields['f0xx'].options}" th:value="${option.id}" th:text="${option.label}" th:selected="${inputs['f0xx'] == #strings.toString(option.id)}">Item</option> </select> <span class="sp-form-dropdown-icon"></span> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:if="${errors['f0xx'] != null}" th:text="${errors['f0xx'].message}">Error message</span> </div> </div> <!--/* 入居予定人数(residentNum) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <div class="sp-form-dropdown"> <select class="sp-form-control" th:name="${fields['f0xx'].name}"> <option value="" th:text="${fields['f0xx'].unselectedLabel}" th:selected="${inputs['f0xx'] == null}">Select option</option> <option th:each="option : ${fields['f0xx'].options}" th:value="${option.id}" th:text="${option.label}" th:selected="${inputs['f0xx'] == #strings.toString(option.id)}">Item</option> </select> <span class="sp-form-dropdown-icon"></span> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:if="${errors['f0xx'] != null}" th:text="${errors['f0xx'].message}">Error message</span> </div> </div> <!--/* 来場人数(visitorNum) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <div class="sp-form-dropdown"> <select class="sp-form-control" th:name="${fields['f0xx'].name}"> <option value="" th:text="${fields['f0xx'].unselectedLabel}" th:selected="${inputs['f0xx'] == null}">Select option</option> <option th:each="option : ${fields['f0xx'].options}" th:value="${option.id}" th:text="${option.label}" th:selected="${inputs['f0xx'] == #strings.toString(option.id)}">Item</option> </select> <span class="sp-form-dropdown-icon"></span> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:if="${errors['f0xx'] != null}" th:text="${errors['f0xx'].message}">Error message</span> </div> </div> <!--/* 参照_物件マスタDB(propertyRef) */--> <sp:input-field name="f0xx"></sp:input-field> <!-- <div class="sp-form-item sp-form-field"> --> <!-- <div class="sp-form-data"> --> <input type="hidden" class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="${inputs['f0xx']} ?: (${dbs[91210] != null} ? ${dbs[91210].record['_id']} : '')"> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:if="${errors['f0xx'] != null}" th:text="${errors['f0xx'].message}">Error message</span> <!-- </div> --> <!-- </div> --> <div class="sp-form-item sp-form-field" th:if="${fields['f0xx'].isTemporary}"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].collationLabel}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <input type="text" class="sp-form-control" th:name="${fields['f0xx'].collationName}" th:placeholder="${fields['f0xx'].placeholder.collation}" th:value="${inputs['f0xx_collation']}"> <span class="sp-form-error" th:if="${errors['f0xx_collation'] != null}" th:text="${errors['f0xx_collation'].message}">Error message</span> </div> </div> <!--/* カレンダーDB_物件ID(calendarRef_roomID) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-data"> <input type="hidden" class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="${cp.result.value['propID']}" th:if="${fields['f0xx'].control == 'text'}"> <div class="sp-form-zip-code" th:if="${fields['f0xx'].control == 'zipCode'}"> <input type="text" class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="${inputs['f0xx']}"> <button class="sp-form-zip-code-button" th:data-zipcode="|zipCodeSearch${fields['f0xx'].name}|" th:if="${fields['f0xx'].addressByZipCode != null}" th:text="${fields['f0xx'].zipCodeButtonLabel}">住所検索</button> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:data-zipcode="|zipCodeError${fields['f0xx'].name}|" th:text="${errors['f0xx']?.message}">Error message</span> </div> <!--/* 予約ID(reservationID) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-data"> <input type="hidden" class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="${cp.result.value['resID']}" th:if="${fields['f0xx'].control == 'text'}"> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:if="${errors['f0xx'] != null}" th:text="${errors['f0xx'].message}">Error message</span> </div> <!--/* 予約日(reservationDate) */--> <sp:input-field name="f0xx" control="text"></sp:input-field> <div class="sp-form-data"> <input type="hidden" class="sp-form-control sp-form-datetime" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="${cp.result.value['resDay']}"> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:if="${errors['f0xx'] != null}" th:text="${errors['f0xx'].message}">Error message</span> </div> <!--/* 予約時間(reservationTime) */--> <sp:input-field name="f0xx" control="text"></sp:input-field> <div class="sp-form-data"> <input type="hidden" class="sp-form-control sp-form-datetime" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="${cp.result.value['resTim']}"> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:if="${errors['f0xx'] != null}" th:text="${errors['f0xx'].message}">Error message</span> </div> <!--/* 個人情報保護の同意(privacyPolicy) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <div class="sp-form-dropdown"> <label th:each="option : ${fields['f0xx'].options}"><input type="checkbox" th:name="f0xx" th:value="${option.id}" th:checked="${inputs['f0xx'] != null ? #lists.contains(inputs['f0xx'], #strings.toString(option.id)) : false}"><span th:text="${option.label}">Item</span></label> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:if="${errors['f0xx'] != null}" th:text="${errors['f0xx'].message}">Error message</span> </div> </div> <div class="sp-form-item sp-form-interaction"> <button class="sp-form-prev-button" type="submit" name="action" value="previous" th:if="!${step.isFirst}" th:text="${step.prevButtonLabel}">Prev</button> <button class="sp-form-next-button" type="submit" name="action" value="next" th:text="${step.nextButtonLabel}">Next</button> </div> </div>
CSS
:root { /*============================= カスタムプロパティ ==============================*/ --base-color: #FFFFFF; /* フォームブロックの背景色 */ --main-color: #0D60DB; /* メインカラー */ --accent-color: #B8250F; /* アクセントカラー */ --input-color: #F5F7FA; /* 入力欄の背景色 */ --input-border-color: #D3D6DB; /* 入力欄の枠線の色 */ --input-radius: 12px; /* 入力欄の角の丸さ */ --transition: 0.1s; /* アニメーション時間 */ /*------ 合計100%になるよう調整 -------*/ --label-width: 25%; /* ラベル部分の幅 */ --data-width: 75%; /* データ部分の幅 */ } .sp-record-list-card-actions { width: auto; font-size:0.875rem; padding:0.5rem 0; text-align:center; text-decoration:none; flex: 1; } .sp-record-list-card-actions a { color: #ffffff; background-color: #0D60DB; border: 1.0px solid #0D60DB; border-radius: calc(12px / 1.2); /* background-color:#ffffff; */ font-size:0.875rem; padding:0.5rem 0.75rem; text-align:center; text-decoration:none; flex: 1; } .sp-form-container { font-size:16px; padding:1em; box-sizing:border-box; max-width: 960px; color:#505050; background-color:var(--base-color); border:1px solid #E1E5EB; border-radius:var(--input-radius); } .sp-form-container .sp-form-item:not(:last-child) { margin-bottom:0.5em; padding:0.5em 1em; } .sp-form-field, .sp-form-group { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:vertical; -webkit-box-direction:normal; -ms-flex-direction:column; flex-direction:column; } .sp-form-field>.sp-form-label, .sp-form-group>.sp-form-label { font-size:1.15em; font-weight:bold; padding:.25em 0; word-break:break-all; box-sizing:border-box; color:#333333; } .sp-form-group-item>.sp-form-label { word-break:break-all; display:inline-block; margin-bottom:.2em; } .sp-form-field>.sp-form-data, .sp-form-group>.sp-form-data { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:vertical; -webkit-box-direction:normal; -ms-flex-direction:column; flex-direction:column; word-break:break-all; padding:0.25em 0; box-sizing:border-box; } .sp-form-group-item>.sp-form-data { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:vertical; -webkit-box-direction:normal; -ms-flex-direction:column; flex-direction:column; } .sp-form-required { display:inline-block; margin:0 .5em; padding: 3px 6px; background:var(--accent-color); color:#ffffff; line-height:1; border-radius:.25em; font-size:0.7em; font-weight: bold; vertical-align: middle; } .sp-form-group-item:not(:last-child) { margin-bottom:.5em; } .sp-form-noted { font-size:.8em; color:#808080; word-break:break-all; margin-top:.5em; padding-left:min(calc(var(--input-radius) / 2 - 4px), 8px); } .sp-form-error { font-size:.8em; color:var(--accent-color); padding-left:min(calc(var(--input-radius) / 2 - 4px), 8px); } .sp-form-control { -moz-appearance:none; -webkit-appearance:none; -ms-progress-appearance:none; appearance:none; font-family:inherit; font-size:1em; line-height:1.5; padding:.3em .7em; padding-left:clamp(12px, calc(var(--input-radius) - 2px), 24px); background:var(--input-color); color:#333333; box-sizing:border-box; width:100%; height:48px; margin-bottom:.3em; border:none; outline:none; border-radius:var(--input-radius); box-shadow:0 0 0 0.5px var(--input-border-color); } .sp-form-control:focus { box-shadow:0 0 0 2px var(--main-color); } .sp-form-control[type="number"] { height: 36px; } .sp-form-control:placeholder-shown { color:#aaa; } .sp-form-control::placeholder { color:#aaa; } .sp-form-control::-ms-input-placeholder { color:#aaa; } .sp-form-control:-ms-input-placeholder { color:#aaa; } .sp-form-control:-moz-placeholder { color:#aaa; } textarea.sp-form-control { resize:vertical; padding-top:clamp(6px, calc(var(--input-radius) / 2), 18px); height:calc(1.5em * 5); } select.sp-form-control, option.sp-form-control { -moz-appearance:none; -webkit-appearance:none; -ms-progress-appearance:none; appearance:none; padding-right:1.5em; } .sp-form-control>option { background:#FFFFFF;} select.sp-form-control::-ms-expand { display:none; } .sp-form-phone .sp-form-control { max-width:20em; } .sp-form-phone>*:not(:only-child) { margin-right:.5rem; } .sp-form-dropdown { position:relative; } .sp-form-dropdown-icon { display:block; position:absolute; top:1.3em; right:1em; line-height:0; pointer-events:none; } .sp-form-dropdown-icon:after { content:""; display:block; border-top:0.333em solid #888; border-right:.333em solid transparent; border-left:.333em solid transparent; } .sp-form-selection { display:block; cursor: pointer; margin-bottom:.3em; padding:.25em .75em .35em; background:var(--input-color); border-radius: var(--input-radius); box-shadow:0 0 0 0.5px var(--input-border-color) ; } .sp-form-selection-label { display: inline-block; position: relative; vertical-align:middle; padding: 4px 0; } .sp-form-datetimes, .sp-form-date, .sp-form-time, .sp-form-timezone { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:horizontal; -webkit-box-direction:normal; -ms-flex-flow:row wrap; flex-flow:row wrap; -webkit-box-align:center; -ms-flex-align:center; align-items:center; } .sp-form-datetime, .sp-form-date, .sp-form-time, .sp-form-timezone { margin-right:.5rem; -ms-flex-wrap:nowrap; flex-wrap:nowrap; } .sp-form-datetime { max-width:20em; } .sp-form-phone { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:horizontal; -webkit-box-direction:normal; -ms-flex-flow:row wrap; flex-flow:row wrap; -webkit-box-align:center; -ms-flex-align:center; align-items:center; } .sp-form-date-separator { width:1em; margin-bottom: .3em; text-align:center; -ms-flex-negative:1; flex-shrink:0; } .sp-form-number { max-width:20em; } .sp-form-email-reenter, .sp-form-password-reenter { font-size:.9em; margin-bottom:.2em; padding-left:min(calc(var(--input-radius) / 2 - 4px), 8px); } .sp-form-html p { margin:0; } .sp-form-interaction { display:-webkit-box; display:-ms-flexbox; display:flex; -ms-flex-wrap:wrap; flex-wrap:wrap; margin-top:1em; } .sp-form-prev-button { color:#333333; background-color:var(--base-color); border:2.0px solid #666666; } .sp-form-next-button, .sp-form-login-button { color:#ffffff; background-color:var(--main-color); border:none; } .sp-form-field .sp-form-embedded { padding-left:.25em; } .sp-form-selection>input[type="radio"], .sp-form-selection>input[type="checkbox"] { display: none; vertical-align:middle; margin-left:0; } .sp-form-selection>input[type="radio"]+.sp-form-selection-label::before, .sp-form-selection>input[type="checkbox"]+.sp-form-selection-label::before{ display: inline-block; content:""; position: relative; box-sizing: border-box; top: 4px; margin-right: 6px; width: 20px; height: 20px; background: #ffffff; border:10px solid #ffffff; box-shadow: 0 0 0 0.5px var(--input-border-color); transition: var(--transition); } .sp-form-selection>input[type="radio"]+.sp-form-selection-label::before { border-radius: 50%; } .sp-form-selection>input[type="checkbox"]+.sp-form-selection-label::before { border-radius: min(var(--input-radius), 4px); } .sp-form-selection>input[type="radio"]:checked+.sp-form-selection-label::before{ background: var(--main-color); border:4px solid #ffffff; } .sp-form-selection>input[type="checkbox"]+.sp-form-selection-label::after{ border-right: 3px solid var(--main-color); border-bottom: 3px solid var(--main-color); content: ''; display: inline-block; width: 6px; height: 10px; left: 9px; margin-top: -7px; position: absolute; top: 50%; transform: rotate(45deg); opacity: 0; transition: var(--transition); } .sp-form-selection>input[type="checkbox"]:checked+.sp-form-selection-label::after{ left: 6px; opacity: 1; } .sp-form-date>input, .sp-form-time>input { max-width:7em; } .sp-form-date>input[type="date"]{ min-width: 140px; max-width: none; } .sp-form-time>input[type="time"] { min-width: 92px; max-width: none; } .sp-form-interaction>button { -webkit-box-flex:1; -ms-flex-positive:1; flex-grow:1; cursor:pointer; font-size:1em; font-weight:bold; line-height:1.5; margin:.5rem; padding:.75rem 0; text-align:center; -webkit-user-select:none; -moz-user-select:none; -ms-user-select:none; user-select:none; white-space:nowrap; border-radius:var(--input-radius); } @media (min-width:768px) { .sp-form-container { font-size:initial; padding:3em; margin:2em auto; } .sp-form-container .sp-form-item:not(:last-child) { margin-bottom:0.5em; padding-bottom:0.5em; } .sp-form-field, .sp-form-group { -webkit-box-orient:horizontal; -webkit-box-direction:normal; -ms-flex-flow:row nowrap; flex-flow:row nowrap; } .sp-form-field>.sp-form-label, .sp-form-group>.sp-form-label { font-size:1em; width:var(--label-width); padding:.5em; } .sp-form-group .sp-form-group-item>.sp-form-label { font-size:.9em; padding-right:.5em; } .sp-form-field>.sp-form-data, .sp-form-group>.sp-form-data { font-size:1em; width:var(--data-width); padding:.5em; } .sp-form-group>.sp-form-data { -webkit-box-orient:horizontal; -webkit-box-direction:normal; -ms-flex-flow:row wrap; flex-flow:row wrap; } .sp-form-group.sp-form-group-vertical>.sp-form-data { -webkit-box-orient:vertical; -webkit-box-direction:normal; -ms-flex-direction:column; flex-direction:column; } .sp-form-required { font-size:0.8em; } .sp-form-group-item { padding:.25em; } .sp-form-group-item:not(:last-child) { margin-bottom:0; } .sp-form-control { font-size:.9em; } .sp-form-selection { font-size:.9em; margin:0 .5em 0 0; padding-right:1em; background:none; box-shadow:none; } .sp-form-selection-vertical>.sp-form-selection { margin:0 auto 0 0; padding-right: 4em; } .sp-form-selection-vertical { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:vertical; -webkit-box-direction:normal; -ms-flex-direction:column; flex-direction:column; } .sp-form-selection-horizontal { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:horizontal; -webkit-box-direction:normal; -ms-flex-flow:row wrap; flex-flow:row wrap; } .sp-form-interaction { justify-content:center; margin-top:2em; } .sp-form-embedded { font-size:.9em; } .sp-form-group-item .sp-form-embedded { padding-right:5em; } .sp-form-selection>input[type="radio"]+.sp-form-selection-label::before, .sp-form-selection>input[type="checkbox"]+.sp-form-selection-label::before{ background: var(--input-color); border:10px solid var(--input-color); } .sp-form-selection>input[type="radio"]:hover+.sp-form-selection-label::before, .sp-form-selection>input[type="checkbox"]:hover+.sp-form-selection-label::before{ border:10px solid #dddddd; } .sp-form-selection>input[type="radio"]:checked+.sp-form-selection-label::before{ border:4px solid var(--input-color); } .sp-form-date>input[type="date"]{ min-width: unset; } .sp-form-time>input[type="time"] { min-width: unset; } .sp-form-interaction>button { -webkit-box-flex:0; -ms-flex-positive:0; flex-grow:0; padding:.75rem 5em; } } .sp-form-recaptcha { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-pack:start; -ms-flex-pack:start; justify-content:flex-start; } .sp-form-recaptcha-right { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-pack:end; -ms-flex-pack:end; justify-content:flex-end; } .sp-form-recaptcha-center { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-pack:center; -ms-flex-pack:center; justify-content:center; } .sp-form-file-button { padding:.8em 2em; font-weight: bold; cursor:pointer; color:#666666; background-color:#f6f6f6; border:none; border: solid 2px #a0a0a0; border-radius:var(--input-radius); transition: var(--transition); align-items: center; justify-content: center; } .sp-form-file-button::before{ display: inline-block; content: url('data:image/svg+xml;utf-8,<svg fill="%23666" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M14.4,7.9l-5.7,5.7c-0.4,0.4-0.8,0.6-1.2,0.8c-0.7,0.3-1.4,0.3-2.1,0.2c-0.7-0.1-1.4-0.5-1.9-1c-0.4-0.4-0.6-0.8-0.8-1.2c-0.3-0.7-0.3-1.4-0.2-2.1c0.1-0.7,0.5-1.4,1-1.9L9.7,2c0.2-0.2,0.5-0.4,0.8-0.5c0.4-0.2,0.9-0.2,1.3-0.1C12.2,1.4,12.6,1.6,13,2c0.2,0.2,0.4,0.5,0.5,0.8c0.2,0.4,0.2,0.9,0.1,1.3c-0.1,0.4-0.3,0.8-0.6,1.2l-6.2,6.2c-0.1,0.1-0.2,0.1-0.3,0.2c-0.1,0.1-0.3,0.1-0.5,0c-0.2,0-0.3-0.1-0.4-0.2c-0.1-0.1-0.1-0.2-0.2-0.3c-0.1-0.1-0.1-0.3,0-0.5c0-0.2,0.1-0.3,0.2-0.4l5.5-5.5l-0.9-0.9L4.7,9.3C4.5,9.5,4.4,9.7,4.3,10c-0.2,0.4-0.2,0.8-0.1,1.2c0.1,0.4,0.3,0.8,0.6,1.1c0.2,0.2,0.4,0.4,0.7,0.5c0.4,0.2,0.8,0.2,1.2,0.1c0.4-0.1,0.8-0.3,1.1-0.6l6.2-6.2c0.3-0.3,0.6-0.8,0.8-1.2c0.3-0.6,0.3-1.4,0.2-2c-0.1-0.7-0.5-1.3-1-1.8c-0.3-0.3-0.8-0.6-1.2-0.8c-0.6-0.3-1.4-0.3-2-0.2C10,0.2,9.3,0.5,8.8,1L2.5,7.4C2,7.9,1.6,8.5,1.4,9.1C1,10,0.9,11,1.1,11.9c0.2,1,0.6,1.9,1.4,2.6C3,15,3.5,15.4,4.1,15.6C5.1,16,6,16.1,7,15.9c1-0.2,1.9-0.6,2.6-1.4l5.7-5.7L14.4,7.9z"/></svg>'); margin-left: -0.5em; width: 16px; height: 100%; vertical-align: middle; } .sp-form-file-button:focus { outline:0; } .sp-from-file-default-drag-drop-area { color:#333333; background-color:var(--input-color); border:2.0px dashed #6c757d; border-radius:0; width:100%; height:200px; text-align:center; border-radius: var(--input-radius); } .sp-from-file-ondraghover-drag-drop-area { color:#333333; background-color:#dddddd; border:2.0px dashed #6c757d; border-radius:0; width:100%; height:200px; text-align:center; border-radius: var(--input-radius); } .sp-from-file-ondragleave-drag-drop-area { color:#333333; background-color:#dddddd; border:2.0px dashed #6c757d; border-radius:0; width:100%; height:200px; border-radius: var(--input-radius); } .sp-from-file-ondrop-drag-drop-area { color:#333333; background-color:var(--input-color); border:2.0px dashed #6c757d; border-radius:0; width:100%; height:200px; border-radius: var(--input-radius); } .sp-form-embedded>.sp-file-info:last-child { padding-bottom:0; } .sp-file-info { padding-top:1em; padding-bottom:1em; line-height:1.5; } .sp-file-info>div { width:100%; } .main-text { font-size:1em; font-weight:bold; } [class^="sp-step-flow-f"] { margin:3em 0 2em; } [class^="sp-step-flow-f"]>.large-setting { display:flex; justify-content: center; } [class^="sp-step-flow-f"]>.small-setting { display:none; } [class^="sp-step-flow-f"]>.large-setting, [class^="sp-step-flow-f"]>.small-setting { text-align: center; margin: 0 auto; padding: 0 20px; } [class^="sp-step-flow-f"]>.large-setting>.step, [class^="sp-step-flow-f"]>.small-setting>.step { word-wrap: break-word; min-width: 0; text-align:center; } [class^="sp-step-flow-f"]>.large-setting>.step { flex: 1; margin-right:36px; font-size:16px; } [class^="sp-step-flow-f"]>.small-setting>.step { font-size:14px; } [class^="sp-step-flow-f"]>.large-setting>.step:last-child, [class^="sp-step-flow-f"]>.small-setting>.step:last-child { margin-right: 0; } [class^="sp-step-flow-f"]>.large-setting>.step>span, [class^="sp-step-flow-f"]>.small-setting>.step>span { overflow: hidden; text-overflow: ellipsis; position:relative; display:block; padding-top: 16px; white-space:nowrap; color:#D3D6DB; font-weight:bold; } [class^="sp-step-flow-f"]>.large-setting>.step>span::before, [class^="sp-step-flow-f"]>.small-setting>.step>span::before { position: absolute; content: ""; display: block; top: 0; width: 100%; background: #D3D6DB; } [class^="sp-step-flow-f"]>.large-setting>.step>span::before { height: 6px; border-radius: 6px; } [class^="sp-step-flow-f"]>.small-setting>.step>span::before { height: 4px; border-radius: 4px; } [class^="sp-step-flow-f"]>.large-setting>.step.active>span, [class^="sp-step-flow-f"]>.small-setting>.step.active>span { color:var(--main-color); } [class^="sp-step-flow-f"]>.large-setting>.step.active>span::before, [class^="sp-step-flow-f"]>.small-setting>.step.active>span::before { background:var(--main-color); } @media (max-width: 765px) { [class^="sp-step-flow-f"]>.large-setting { display:none; } [class^="sp-step-flow-f"]>.small-setting { display:flex; justify-content: center; counter-reset:step; } [class^="sp-step-flow-f"]>.small-setting>.step>span { display: none; } [class^="sp-step-flow-f"]>.small-setting>.step { display: flex; align-items: center; width: auto; margin: 0; background: none; color: #ffffff; font-weight: bold; } [class^="sp-step-flow-f"]>.small-setting>.step::before { counter-increment: step 1; content: counter(step, decimal); width:24px; height:24px; background: var(--main-color); border-radius: 50%; font-size: 12px; line-height: 24px; } [class^="sp-step-flow-f"]>.small-setting>.step:not(:last-child) { flex-grow: 1; } [class^="sp-step-flow-f"]>.small-setting>.step:not(:last-child)::after { content: ""; width: calc(100% - 24px); height:2px; background: var(--main-color); vertical-align: middle; } [class^="sp-step-flow-f"]>.small-setting>.step.active::after, [class^="sp-step-flow-f"]>.small-setting>.step.active~.step::before, [class^="sp-step-flow-f"]>.small-setting>.step.active~.step::after { background:#D3D6DB; } }
手順15:内覧予約ページのブロック埋め込み
手順11で作成した物件詳細ページに手順8/手順12で作成したブロックを埋め込みます。
HTML
CSS
また、PHPに改ざん防止の処理を記載します。
PHP
HTMLの「"fcb0xxxx"」、「"rib0xxxx"」、「"ifb0xxxx"」には、それぞれヘッダ、物件詳細ブロック、内覧予約登録フォーム、フッターのIDを記載ください。HTML
<!--/* ヘッダ */--> <sp:block name="fcb0xxxx"></sp:block> <h1>内覧予約ページ</h1> <th:block th:if="${cp.result.value['step_detail']} eq 1"> <!--/* 物件詳細 */--> <sp:block name="rib0xxxx"></sp:block> <h2>この物件の<span th:text="${cp.result.value['resDay_display']}">12345</span>の<span th:text="${cp.result.value['resTim_display']}">12345</span>の内覧予約を行います。</h2> </th:block> <th:block th:if="${cp.result.value['check']} eq 1"> <!--/* 内覧予約登録フォーム */--> <sp:block name="ifb0xxxx"></sp:block> </th:block> <th:block th:if="${cp.result.value['check']} eq 0"> <!--/* エラーメッセージ */--> <sp:block name="fcb0xxxx"></sp:block> </th:block> <!--/* フッター */--> <sp:block name="fcb0xxxx"></sp:block>
CSS
h2 { text-align: center; } h1 { text-align: center; } .reserve_attention { display: block; text-align: center; margin: 0.5rem 0; } .url-button { width: auto; /* font-size:0.875rem; */ padding:0.5rem 0; text-align:center; text-decoration:none; flex: 1; color: #ffffff; background-color: #0D60DB; border: 1.0px solid #0D60DB; border-radius: calc(12px / 1.2); } .button-l { padding:0.5rem 6%; margin-right: 0.5rem; } .button-r { padding:0.5rem 5%; margin-left: 0.5rem; } .button { padding:0.5rem 5%; } .sp-url-button { text-align: center; width: auto; margin: 1.5rem auto; /* border: 1px solid #dddddd; */ }
PHP
<?php //------------------------------ // API設定 //------------------------------ //------------------------------ // 設定値 //------------------------------ define("API_URL", "https://api.spiral-platform.com/v1"); define("API_KEY", "APIキー"); //APIキー define("APP_ROLE", "アプリロール"); //API権限を持つアプリロール識別名 define("DB_ID", "DBID"); //物件マスタDBID define("APP_ID", "アプリID"); //モデルルーム予約管理アプリID define("DB_ID_2", "DBID"); //カレンダーDBID //------------------------------ // API実行 //------------------------------ // 物件ID確認 $commonBase = CommonBase::getInstance(); //------------------------------ // 物件詳細ステップ出し分け //------------------------------ $registForm_reg = $SPIRAL->getRegistrationForm("reservation_regist"); $step_detail = $registForm_reg->getStep(); $SPIRAL->setTHValue("step_detail", $step_detail); $param_record = explode(".", $SPIRAL->getParam("record"));//レコードアイテムブロックが表示された時、URLクエリパラメータから「レコードID」を取得。 $recordId = $param_record[1]; $param_reservation = explode("_", $SPIRAL->getParam("reservationID"));//レコードアイテムブロックが表示された時、URLクエリパラメータから「物件ID」を取得。 $property_Id = $param_reservation[0]; $resultRecordSelect = $commonBase->apiCurlAction("GET", "/apps/". APP_ID. "/dbs/". DB_ID. "/records/". $recordId); $SPIRAL->setTHValue("property_ID", $property_Id);//Thymeleafにパラメーターの物件IDをセット $SPIRAL->setTHValue("calender", $resultRecordSelect['item']['propertyID']);//ThymeleafにカレンダーDBのレコードをセット $check = 0; if($property_Id == $resultRecordSelect['item']['propertyID']){ $check = 1; } $SPIRAL->setTHValue("check", $check);//Thymeleafに比較結果をセット //カレンダーDB取得、検索 //URLパラメータの値を物件IDと予約日、予約時間に分割する処理 $reserve = str_split($param_reservation[1],10); $serevatinDate_bef = $reserve[0];//20250109 $reservationTime_bef = explode("-", $reserve[1]);//16 // フォーマット変更用処理 $SPIRAL->setTHValue("ans1", $serevatinDate_bef); // 時間を加工 $reservationTime = $reservationTime_bef[1] . ":00:00"; $where = "?where=@propertyID='".$property_Id."'%20AND%20@reservationDate='".$serevatinDate_bef."'%20AND%20@reservationTime='".$reservationTime."'"; $result_recordListSelect_calender = $commonBase->apiCurlAction("GET", "/apps/". APP_ID. "/dbs/". DB_ID_2. "/records". $where); $SPIRAL->setTHValue("ans1", $result_recordListSelect_calender); // カレンダーDBのレコードID $recordId_calender = $result_recordListSelect_calender['items'][0]['_id']; // カレンダーDBのレコード取得 $resultRecordSelect_calender = $commonBase->apiCurlAction("GET", "/apps/". APP_ID. "/dbs/". DB_ID_2. "/records/". $recordId_calender); // 物件ID、予約ID、予約日、予約時間をそれぞれ変数に格納 $php_propID = $resultRecordSelect_calender["item"]["propertyID"]; $php_resID = $resultRecordSelect_calender["item"]["reservationID"]; $php_resDay = $resultRecordSelect_calender["item"]["reservationDate"]; $php_resTim = $resultRecordSelect_calender["item"]["reservationTime"]; //ThymeleafにカレンダーDBの物件ID、予約ID、予約日、予約時間をセット $SPIRAL->setTHValue("propID", $php_propID); // 物件ID $SPIRAL->setTHValue("resID", $SPIRAL->getParam("reservationID")); // 予約ID $SPIRAL->setTHValue("resDay", $resultRecordSelect_calender["item"]["reservationDate"]); // 予約日 $SPIRAL->setTHValue("resTim", $resultRecordSelect_calender["item"]["reservationTime"]); // 予約時間 // 予約日の整形 $resDay_ymd = explode("-", $resultRecordSelect_calender["item"]["reservationDate"]); $resDay_display = $resDay_ymd[0]. "/" .$resDay_ymd[1] . "/".$resDay_ymd[2]; $SPIRAL->setTHValue("resDay_display", $resDay_display); // 予約時間の表示 $resTim_hm = explode(":", $resultRecordSelect_calender["item"]["reservationTime"]); $resTim_display = $resTim_hm[0]. ":" .$resTim_hm[1]; $SPIRAL->setTHValue("resTim_display", $resTim_display); // hiddenで送られた物件ID、予約ID、予約日、予約時間をそれぞれ変数に格納 $hidden_propID = $SPIRAL->getParam("calendarRef_roomID"); $hidden_resID = $SPIRAL->getParam("reservationID"); $hidden_resDay = $SPIRAL->getParam("reservationDate"); $hidden_resTim = $SPIRAL->getParam("reservationTime"); // $SPIRAL->setTHValue("step", $step); // 登録フォーム 確認画面遷移時のチェック $registForm = $SPIRAL->getRegistrationForm("reservation_regist"); $step = $registForm->getStep(); // 物件ID、予約ID、予約日、予約時間が一致していない場合、checkFlagを0に更新 $step_checkFlag = 1; if ($step == 2){ if($hidden_propID != $php_propID) { $step_checkFlag = 0; } if($hidden_resID != $php_resID) { $step_checkFlag = 0; } if($hidden_resDay != $php_resDay) { $step_checkFlag = 0; } if($hidden_resTim != $php_resTim) { $step_checkFlag = 0; } } $SPIRAL->setTHValue("step", $step_checkFlag); //------------------------------ // 共通モジュール //------------------------------ class CommonBase { /** * シングルトンインスタンス * @var UserManager */ protected static $singleton; public function __construct() { if (self::$singleton) { throw new Exception('must be singleton'); } self::$singleton = $this; } /** * シングルトンインスタンスを返す * @return UserManager */ public static function getInstance() { if (!self::$singleton) { return new CommonBase(); } else { return self::$singleton; } } /** * V2用 API送信ロジック * @return Result */ function apiCurlAction($method, $addUrlPass, $data = null, $multiPart = null, $jsonDecode = null) { $header = array( "Authorization:Bearer ". API_KEY, "X-Spiral-Api-Version: 1.1", ); if($multiPart) { $header = array_merge($header, array($multiPart)); } else { $header = array_merge($header, array("Content-Type:application/json")); } if(APP_ROLE){ $header = array_merge($header, array("X-Spiral-App-Role: ".APP_ROLE)); } // curl $curl = curl_init(); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_URL, API_URL. $addUrlPass); curl_setopt($curl, CURLOPT_HTTPHEADER, $header); if ($method == "POST") { if ($multiPart) { curl_setopt($curl, CURLOPT_POSTFIELDS, $data); } else { curl_setopt($curl, CURLOPT_POSTFIELDS , json_encode($data)); } curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method); } if ($method == "PATCH") { curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data)); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method); } if ($method == "DELETE") { curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data)); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method); } $response = curl_exec($curl); if (curl_errno($curl)) echo curl_error($curl); curl_close($curl); if($jsonDecode){ return $response; }else{ return json_decode($response, true); } } } ?>
PHPの設定値には、それぞれAPIキー、物件マスタDBID、アプリID、カレンダーDBIDを記載ください。
手順16:資料請求ページを作成
手順2で作成した認証エリアの「+」ボタンから新規ページを作成します。
資料請求ページは公開ページのため、認証は「なし」で設定します。
設定方法は、「ソース設定」を選択します。
資料請求ページは公開ページのため、認証は「なし」で設定します。
設定方法は、「ソース設定」を選択します。
手順17:資料請求ページに埋め込む資料請求フォームを作成
資料請求フォームは、登録フォームブロックで作成します。
登録フォームブロックは、「ソース設定」で作成します。
資料請求フォームでは、参照フィールドを自動登録で設定します。
HTML
CSS
HTMLの「"f0xx"」には、内覧予約DB内の対応するフィールドIDを記載ください。
資料請求フォームブロックでは、自動登録の設定を行っております。
登録フォームブロックは、「ソース設定」で作成します。
資料請求フォームでは、参照フィールドを自動登録で設定します。
HTML
<div class="sp-form-container"> <div class="sp-step-flow-f24431"> <div class="large-setting arrow sp-clearfix"> <div class="step active" title="入力"> <span>入力</span> </div> <div class="step" title="確認"> <span>確認</span> </div> <div class="step" title="完了"> <span>完了</span> </div> </div> <div class="small-setting arrow sp-clearfix"> <div class="step active" title="入力"> <span>入力</span> </div> <div class="step" title="確認"> <span>確認</span> </div> <div class="step" title="完了"> <span>完了</span> </div> </div> </div> <div class="sp-form-item sp-form-html" th:inline="none"><p><span style="font-size: 18pt;">資料請求フォーム</span></p></div> <div class="sp-form-item sp-form-html" th:inline="none">必要事項をご入力の上、「確認画面へ」ボタンを押してください</div> <!--/* 名前(name) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <input type="text" class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="|${inputs['f0xx'] ?:'スパイラル太郎'}|" th:if="${fields['f0xx'].control == 'text'}"> <!--ZipCode Option--> <div class="sp-form-zip-code" th:if="${fields['f0xx'].control == 'zipCode'}"> <input type="text" class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="${fields['f0xx'].value}"> <button class="sp-form-zip-code-button" th:data-zipcode="|zipCodeSearch${fields['f0xx'].name}|" th:if="${fields['f0xx'].addressByZipCode != null}" th:text="${fields['f0xx'].zipCodeButtonLabel}">住所検索</button> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:data-zipcode="|zipCodeError${fields['f0xx'].name}|" th:text="${errors['f0xx']?.message}">Error message</span> </div> </div> <!--/* メールアドレス(mail) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <input type="email" class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="|${inputs['f0xx'] ?:'sample@spiral-platform.co.jp'}|"> <div th:if="${fields['f0xx'].collation}"> <span class="sp-form-email-reenter" th:text="${fields['f0xx'].reenterLabel}">Re-enter to confirm</span> <input type="email" class="sp-form-control" th:name="${fields['f0xx:reenter'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="|${inputs['f0xx'] ?:'sample@spiral-platform.co.jp'}|"> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:if="${errors['f0xx'] != null}" th:text="${errors['f0xx'].message}">Error message</span> </div> </div> <!--/* 都道府県(pref) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <div class="sp-form-dropdown"> <select class="sp-form-control" th:name="${fields['f0xx'].name}"> <option value="" th:text="${fields['f0xx'].unselectedLabel}" th:selected="${inputs['f0xx'] == null}">Select option</option> <option th:each="option : ${fields['f0xx'].options}" th:value="${option.id}" th:text="${option.label}" th:selected="${inputs['f0xx'] == #strings.toString(option.id)}">Item</option> </select> <span class="sp-form-dropdown-icon"></span> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:if="${errors['f0xx'] != null}" th:text="${errors['f0xx'].message}">Error message</span> </div> </div> <!--/* 郵便番号(zipCode) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <input type="text" class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="${inputs['f0xx']}" th:if="${fields['f0xx'].control == 'text'}"> <!--ZipCode Option--> <div class="sp-form-zip-code" th:if="${fields['f0xx'].control == 'zipCode'}"> <input type="text" class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="${inputs['f0xx']}"> <button class="sp-form-zip-code-button" th:data-zipcode="|zipCodeSearch${fields['f0xx'].name}|" th:if="${fields['f0xx'].addressByZipCode != null}" th:text="${fields['f0xx'].zipCodeButtonLabel}">住所検索</button> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:data-zipcode="|zipCodeError${fields['f0xx'].name}|" th:text="${errors['f0xx']?.message}">Error message</span> </div> </div> <!--/* 市区町村(municipalities) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <input type="text" class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="|${inputs['f0xx'] ?:'港区赤坂2丁目'}|" th:if="${fields['f0xx'].control == 'text'}"> <!--ZipCode Option--> <div class="sp-form-zip-code" th:if="${fields['f0xx'].control == 'zipCode'}"> <input type="text" class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="${inputs['f0xx']}"> <button class="sp-form-zip-code-button" th:data-zipcode="|zipCodeSearch${fields['f0xx'].name}|" th:if="${fields['f0xx'].addressByZipCode != null}" th:text="${fields['f0xx'].zipCodeButtonLabel}">住所検索</button> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:data-zipcode="|zipCodeError${fields['f0xx'].name}|" th:text="${errors['f0xx']?.message}">Error message</span> </div> </div> <!--/* 番地(block) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <input type="text" class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="|${inputs['f0xx'] ?:'9番11号'}|" th:if="${fields['f0xx'].control == 'text'}"> <!--ZipCode Option--> <div class="sp-form-zip-code" th:if="${fields['f0xx'].control == 'zipCode'}"> <input type="text" class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="${inputs['f0xx']}"> <button class="sp-form-zip-code-button" th:data-zipcode="|zipCodeSearch${fields['f0xx'].name}|" th:if="${fields['f0xx'].addressByZipCode != null}" th:text="${fields['f0xx'].zipCodeButtonLabel}">住所検索</button> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:data-zipcode="|zipCodeError${fields['f0xx'].name}|" th:text="${errors['f0xx']?.message}">Error message</span> </div> </div> <!--/* マンション・ビル名(building) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <input type="text" class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="|${inputs['f0xx'] ?:'オリックス赤坂2丁目ビル'}|" th:if="${fields['f0xx'].control == 'text'}"> <!--ZipCode Option--> <div class="sp-form-zip-code" th:if="${fields['f0xx'].control == 'zipCode'}"> <input type="text" class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="${inputs['f0xx']}"> <button class="sp-form-zip-code-button" th:data-zipcode="|zipCodeSearch${fields['f0xx'].name}|" th:if="${fields['f0xx'].addressByZipCode != null}" th:text="${fields['f0xx'].zipCodeButtonLabel}">住所検索</button> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:data-zipcode="|zipCodeError${fields['f0xx'].name}|" th:text="${errors['f0xx']?.message}">Error message</span> </div> </div> <!--/* 電話番号(phone) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <div class="sp-form-phone"> <div class="sp-form-dropdown" th:if="${fields['f0xx'].countryCode == null}"> <select class="sp-form-control" th:name="${fields['f0xx:countryCode'].name}"> <option value="" th:text="${fields['f0xx'].unselectedCodeLabel}" th:selected="${inputs['f0xx:countryCode'] == null}">Select option</option> <option th:each="countryCode : ${fields['f0xx'].countryCodes}" th:value="${countryCode.country.alpha2Code}" th:text="|${countryCode.country.alpha2Code}(+${countryCode.code})|" th:selected="${inputs['f0xx:countryCode'] == countryCode.country.alpha2Code}">Item</option> </select> <span class="sp-form-dropdown-icon"></span> </div> <input type="tel" class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="${inputs['f0xx']}"> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:if="${errors['f0xx'] != null}" th:text="${errors['f0xx'].message}">Error message</span> </div> </div> <!--/* 職業(occupation) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <div class="sp-form-dropdown"> <select class="sp-form-control" th:name="${fields['f0xx'].name}"> <option value="" th:text="${fields['f0xx'].unselectedLabel}" th:selected="${inputs['f0xx'] == null}">Select option</option> <option th:each="option : ${fields['f0xx'].options}" th:value="${option.id}" th:text="${option.label}" th:selected="${inputs['f0xx'] == #strings.toString(option.id)}">Item</option> </select> <span class="sp-form-dropdown-icon"></span> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:if="${errors['f0xx'] != null}" th:text="${errors['f0xx'].message}">Error message</span> </div> </div> <!--/* 希望占有面積(occupiedArea) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <div class="sp-form-dropdown"> <select class="sp-form-control" th:name="${fields['f0xx'].name}"> <option value="" th:text="${fields['f0xx'].unselectedLabel}" th:selected="${inputs['f0xx'] == null}">Select option</option> <option th:each="option : ${fields['f0xx'].options}" th:value="${option.id}" th:text="${option.label}" th:selected="${inputs['f0xx'] == #strings.toString(option.id)}">Item</option> </select> <span class="sp-form-dropdown-icon"></span> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:if="${errors['f0xx'] != null}" th:text="${errors['f0xx'].message}">Error message</span> </div> </div> <!--/* ご予算(budget) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <div class="sp-form-dropdown"> <select class="sp-form-control" th:name="${fields['f0xx'].name}"> <option value="" th:text="${fields['f0xx'].unselectedLabel}" th:selected="${inputs['f0xx'] == null}">Select option</option> <option th:each="option : ${fields['f0xx'].options}" th:value="${option.id}" th:text="${option.label}" th:selected="${inputs['f0xx'] == #strings.toString(option.id)}">Item</option> </select> <span class="sp-form-dropdown-icon"></span> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:if="${errors['f0xx'] != null}" th:text="${errors['f0xx'].message}">Error message</span> </div> </div> <!--/* 入居予定人数(residentNum) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <div class="sp-form-dropdown"> <select class="sp-form-control" th:name="${fields['f0xx'].name}"> <option value="" th:text="${fields['f0xx'].unselectedLabel}" th:selected="${inputs['f0xx'] == null}">Select option</option> <option th:each="option : ${fields['f0xx'].options}" th:value="${option.id}" th:text="${option.label}" th:selected="${inputs['f0xx'] == #strings.toString(option.id)}">Item</option> </select> <span class="sp-form-dropdown-icon"></span> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:if="${errors['f0xx'] != null}" th:text="${errors['f0xx'].message}">Error message</span> </div> </div> <!--/* 個人情報保護の同意(privacyPolicy) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <div class="sp-form-dropdown"> <label th:each="option : ${fields['f0xx'].options}"><input type="checkbox" th:name="f0xx" th:value="${option.id}" th:checked="${inputs['f0xx'] != null ? #lists.contains(inputs['f0xx'], #strings.toString(option.id)) : false}"><span th:text="${option.label}">Item</span></label> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:if="${errors['f0xx'] != null}" th:text="${errors['f0xx'].message}">Error message</span> </div> </div> <div class="sp-form-item sp-form-interaction"> <button class="sp-form-prev-button" type="submit" name="action" value="previous" th:if="!${step.isFirst}" th:text="${step.prevButtonLabel}">Prev</button> <button class="sp-form-next-button" type="submit" name="action" value="next" th:text="${step.nextButtonLabel}">Next</button> </div> </div>
:root { /*============================= カスタムプロパティ ==============================*/ --base-color: #FFFFFF; /* フォームブロックの背景色 */ --main-color: #0D60DB; /* メインカラー */ --accent-color: #B8250F; /* アクセントカラー */ --input-color: #F5F7FA; /* 入力欄の背景色 */ --input-border-color: #D3D6DB; /* 入力欄の枠線の色 */ --input-radius: 12px; /* 入力欄の角の丸さ */ --transition: 0.1s; /* アニメーション時間 */ /*------ 合計100%になるよう調整 -------*/ --label-width: 25%; /* ラベル部分の幅 */ --data-width: 75%; /* データ部分の幅 */ } .sp-record-list-card-actions { width: auto; font-size:0.875rem; padding:0.5rem 0; text-align:center; text-decoration:none; flex: 1; } .sp-record-list-card-actions a { color: #ffffff; background-color: #0D60DB; border: 1.0px solid #0D60DB; border-radius: calc(12px / 1.2); /* background-color:#ffffff; */ font-size:0.875rem; padding:0.5rem 0.75rem; text-align:center; text-decoration:none; flex: 1; } .sp-form-container { font-size:16px; padding:1em; box-sizing:border-box; max-width: 960px; color:#505050; background-color:var(--base-color); border:1px solid #E1E5EB; border-radius:var(--input-radius); } .sp-form-container .sp-form-item:not(:last-child) { margin-bottom:0.5em; padding:0.5em 1em; } .sp-form-field, .sp-form-group { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:vertical; -webkit-box-direction:normal; -ms-flex-direction:column; flex-direction:column; } .sp-form-field>.sp-form-label, .sp-form-group>.sp-form-label { font-size:1.15em; font-weight:bold; padding:.25em 0; word-break:break-all; box-sizing:border-box; color:#333333; } .sp-form-group-item>.sp-form-label { word-break:break-all; display:inline-block; margin-bottom:.2em; } .sp-form-field>.sp-form-data, .sp-form-group>.sp-form-data { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:vertical; -webkit-box-direction:normal; -ms-flex-direction:column; flex-direction:column; word-break:break-all; padding:0.25em 0; box-sizing:border-box; } .sp-form-group-item>.sp-form-data { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:vertical; -webkit-box-direction:normal; -ms-flex-direction:column; flex-direction:column; } .sp-form-required { display:inline-block; margin:0 .5em; padding: 3px 6px; background:var(--accent-color); color:#ffffff; line-height:1; border-radius:.25em; font-size:0.7em; font-weight: bold; vertical-align: middle; } .sp-form-group-item:not(:last-child) { margin-bottom:.5em; } .sp-form-noted { font-size:.8em; color:#808080; word-break:break-all; margin-top:.5em; padding-left:min(calc(var(--input-radius) / 2 - 4px), 8px); } .sp-form-error { font-size:.8em; color:var(--accent-color); padding-left:min(calc(var(--input-radius) / 2 - 4px), 8px); } .sp-form-control { -moz-appearance:none; -webkit-appearance:none; -ms-progress-appearance:none; appearance:none; font-family:inherit; font-size:1em; line-height:1.5; padding:.3em .7em; padding-left:clamp(12px, calc(var(--input-radius) - 2px), 24px); background:var(--input-color); color:#333333; box-sizing:border-box; width:100%; height:48px; margin-bottom:.3em; border:none; outline:none; border-radius:var(--input-radius); box-shadow:0 0 0 0.5px var(--input-border-color); } .sp-form-control:focus { box-shadow:0 0 0 2px var(--main-color); } .sp-form-control[type="number"] { height: 36px; } .sp-form-control:placeholder-shown { color:#aaa; } .sp-form-control::placeholder { color:#aaa; } .sp-form-control::-ms-input-placeholder { color:#aaa; } .sp-form-control:-ms-input-placeholder { color:#aaa; } .sp-form-control:-moz-placeholder { color:#aaa; } textarea.sp-form-control { resize:vertical; padding-top:clamp(6px, calc(var(--input-radius) / 2), 18px); height:calc(1.5em * 5); } select.sp-form-control, option.sp-form-control { -moz-appearance:none; -webkit-appearance:none; -ms-progress-appearance:none; appearance:none; padding-right:1.5em; } .sp-form-control>option { background:#FFFFFF;} select.sp-form-control::-ms-expand { display:none; } .sp-form-phone .sp-form-control { max-width:20em; } .sp-form-phone>*:not(:only-child) { margin-right:.5rem; } .sp-form-dropdown { position:relative; } .sp-form-dropdown-icon { display:block; position:absolute; top:1.3em; right:1em; line-height:0; pointer-events:none; } .sp-form-dropdown-icon:after { content:""; display:block; border-top:0.333em solid #888; border-right:.333em solid transparent; border-left:.333em solid transparent; } .sp-form-selection { display:block; cursor: pointer; margin-bottom:.3em; padding:.25em .75em .35em; background:var(--input-color); border-radius: var(--input-radius); box-shadow:0 0 0 0.5px var(--input-border-color) ; } .sp-form-selection-label { display: inline-block; position: relative; vertical-align:middle; padding: 4px 0; } .sp-form-datetimes, .sp-form-date, .sp-form-time, .sp-form-timezone { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:horizontal; -webkit-box-direction:normal; -ms-flex-flow:row wrap; flex-flow:row wrap; -webkit-box-align:center; -ms-flex-align:center; align-items:center; } .sp-form-datetime, .sp-form-date, .sp-form-time, .sp-form-timezone { margin-right:.5rem; -ms-flex-wrap:nowrap; flex-wrap:nowrap; } .sp-form-datetime { max-width:20em; } .sp-form-phone { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:horizontal; -webkit-box-direction:normal; -ms-flex-flow:row wrap; flex-flow:row wrap; -webkit-box-align:center; -ms-flex-align:center; align-items:center; } .sp-form-date-separator { width:1em; margin-bottom: .3em; text-align:center; -ms-flex-negative:1; flex-shrink:0; } .sp-form-number { max-width:20em; } .sp-form-email-reenter, .sp-form-password-reenter { font-size:.9em; margin-bottom:.2em; padding-left:min(calc(var(--input-radius) / 2 - 4px), 8px); } .sp-form-html p { margin:0; } .sp-form-interaction { display:-webkit-box; display:-ms-flexbox; display:flex; -ms-flex-wrap:wrap; flex-wrap:wrap; margin-top:1em; } .sp-form-prev-button { color:#333333; background-color:var(--base-color); border:2.0px solid #666666; } .sp-form-next-button, .sp-form-login-button { color:#ffffff; background-color:var(--main-color); border:none; } .sp-form-field .sp-form-embedded { padding-left:.25em; } .sp-form-selection>input[type="radio"], .sp-form-selection>input[type="checkbox"] { display: none; vertical-align:middle; margin-left:0; } .sp-form-selection>input[type="radio"]+.sp-form-selection-label::before, .sp-form-selection>input[type="checkbox"]+.sp-form-selection-label::before{ display: inline-block; content:""; position: relative; box-sizing: border-box; top: 4px; margin-right: 6px; width: 20px; height: 20px; background: #ffffff; border:10px solid #ffffff; box-shadow: 0 0 0 0.5px var(--input-border-color); transition: var(--transition); } .sp-form-selection>input[type="radio"]+.sp-form-selection-label::before { border-radius: 50%; } .sp-form-selection>input[type="checkbox"]+.sp-form-selection-label::before { border-radius: min(var(--input-radius), 4px); } .sp-form-selection>input[type="radio"]:checked+.sp-form-selection-label::before{ background: var(--main-color); border:4px solid #ffffff; } .sp-form-selection>input[type="checkbox"]+.sp-form-selection-label::after{ border-right: 3px solid var(--main-color); border-bottom: 3px solid var(--main-color); content: ''; display: inline-block; width: 6px; height: 10px; left: 9px; margin-top: -7px; position: absolute; top: 50%; transform: rotate(45deg); opacity: 0; transition: var(--transition); } .sp-form-selection>input[type="checkbox"]:checked+.sp-form-selection-label::after{ left: 6px; opacity: 1; } .sp-form-date>input, .sp-form-time>input { max-width:7em; } .sp-form-date>input[type="date"]{ min-width: 140px; max-width: none; } .sp-form-time>input[type="time"] { min-width: 92px; max-width: none; } .sp-form-interaction>button { -webkit-box-flex:1; -ms-flex-positive:1; flex-grow:1; cursor:pointer; font-size:1em; font-weight:bold; line-height:1.5; margin:.5rem; padding:.75rem 0; text-align:center; -webkit-user-select:none; -moz-user-select:none; -ms-user-select:none; user-select:none; white-space:nowrap; border-radius:var(--input-radius); } @media (min-width:768px) { .sp-form-container { font-size:initial; padding:3em; margin:2em auto; } .sp-form-container .sp-form-item:not(:last-child) { margin-bottom:0.5em; padding-bottom:0.5em; } .sp-form-field, .sp-form-group { -webkit-box-orient:horizontal; -webkit-box-direction:normal; -ms-flex-flow:row nowrap; flex-flow:row nowrap; } .sp-form-field>.sp-form-label, .sp-form-group>.sp-form-label { font-size:1em; width:var(--label-width); padding:.5em; } .sp-form-group .sp-form-group-item>.sp-form-label { font-size:.9em; padding-right:.5em; } .sp-form-field>.sp-form-data, .sp-form-group>.sp-form-data { font-size:1em; width:var(--data-width); padding:.5em; } .sp-form-group>.sp-form-data { -webkit-box-orient:horizontal; -webkit-box-direction:normal; -ms-flex-flow:row wrap; flex-flow:row wrap; } .sp-form-group.sp-form-group-vertical>.sp-form-data { -webkit-box-orient:vertical; -webkit-box-direction:normal; -ms-flex-direction:column; flex-direction:column; } .sp-form-required { font-size:0.8em; } .sp-form-group-item { padding:.25em; } .sp-form-group-item:not(:last-child) { margin-bottom:0; } .sp-form-control { font-size:.9em; } .sp-form-selection { font-size:.9em; margin:0 .5em 0 0; padding-right:1em; background:none; box-shadow:none; } .sp-form-selection-vertical>.sp-form-selection { margin:0 auto 0 0; padding-right: 4em; } .sp-form-selection-vertical { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:vertical; -webkit-box-direction:normal; -ms-flex-direction:column; flex-direction:column; } .sp-form-selection-horizontal { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:horizontal; -webkit-box-direction:normal; -ms-flex-flow:row wrap; flex-flow:row wrap; } .sp-form-interaction { justify-content:center; margin-top:2em; } .sp-form-embedded { font-size:.9em; } .sp-form-group-item .sp-form-embedded { padding-right:5em; } .sp-form-selection>input[type="radio"]+.sp-form-selection-label::before, .sp-form-selection>input[type="checkbox"]+.sp-form-selection-label::before{ background: var(--input-color); border:10px solid var(--input-color); } .sp-form-selection>input[type="radio"]:hover+.sp-form-selection-label::before, .sp-form-selection>input[type="checkbox"]:hover+.sp-form-selection-label::before{ border:10px solid #dddddd; } .sp-form-selection>input[type="radio"]:checked+.sp-form-selection-label::before{ border:4px solid var(--input-color); } .sp-form-date>input[type="date"]{ min-width: unset; } .sp-form-time>input[type="time"] { min-width: unset; } .sp-form-interaction>button { -webkit-box-flex:0; -ms-flex-positive:0; flex-grow:0; padding:.75rem 5em; } } .sp-form-recaptcha { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-pack:start; -ms-flex-pack:start; justify-content:flex-start; } .sp-form-recaptcha-right { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-pack:end; -ms-flex-pack:end; justify-content:flex-end; } .sp-form-recaptcha-center { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-pack:center; -ms-flex-pack:center; justify-content:center; } .sp-form-file-button { padding:.8em 2em; font-weight: bold; cursor:pointer; color:#666666; background-color:#f6f6f6; border:none; border: solid 2px #a0a0a0; border-radius:var(--input-radius); transition: var(--transition); align-items: center; justify-content: center; } .sp-form-file-button::before{ display: inline-block; content: url('data:image/svg+xml;utf-8,<svg fill="%23666" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M14.4,7.9l-5.7,5.7c-0.4,0.4-0.8,0.6-1.2,0.8c-0.7,0.3-1.4,0.3-2.1,0.2c-0.7-0.1-1.4-0.5-1.9-1c-0.4-0.4-0.6-0.8-0.8-1.2c-0.3-0.7-0.3-1.4-0.2-2.1c0.1-0.7,0.5-1.4,1-1.9L9.7,2c0.2-0.2,0.5-0.4,0.8-0.5c0.4-0.2,0.9-0.2,1.3-0.1C12.2,1.4,12.6,1.6,13,2c0.2,0.2,0.4,0.5,0.5,0.8c0.2,0.4,0.2,0.9,0.1,1.3c-0.1,0.4-0.3,0.8-0.6,1.2l-6.2,6.2c-0.1,0.1-0.2,0.1-0.3,0.2c-0.1,0.1-0.3,0.1-0.5,0c-0.2,0-0.3-0.1-0.4-0.2c-0.1-0.1-0.1-0.2-0.2-0.3c-0.1-0.1-0.1-0.3,0-0.5c0-0.2,0.1-0.3,0.2-0.4l5.5-5.5l-0.9-0.9L4.7,9.3C4.5,9.5,4.4,9.7,4.3,10c-0.2,0.4-0.2,0.8-0.1,1.2c0.1,0.4,0.3,0.8,0.6,1.1c0.2,0.2,0.4,0.4,0.7,0.5c0.4,0.2,0.8,0.2,1.2,0.1c0.4-0.1,0.8-0.3,1.1-0.6l6.2-6.2c0.3-0.3,0.6-0.8,0.8-1.2c0.3-0.6,0.3-1.4,0.2-2c-0.1-0.7-0.5-1.3-1-1.8c-0.3-0.3-0.8-0.6-1.2-0.8c-0.6-0.3-1.4-0.3-2-0.2C10,0.2,9.3,0.5,8.8,1L2.5,7.4C2,7.9,1.6,8.5,1.4,9.1C1,10,0.9,11,1.1,11.9c0.2,1,0.6,1.9,1.4,2.6C3,15,3.5,15.4,4.1,15.6C5.1,16,6,16.1,7,15.9c1-0.2,1.9-0.6,2.6-1.4l5.7-5.7L14.4,7.9z"/></svg>'); margin-left: -0.5em; width: 16px; height: 100%; vertical-align: middle; } .sp-form-file-button:focus { outline:0; } .sp-from-file-default-drag-drop-area { color:#333333; background-color:var(--input-color); border:2.0px dashed #6c757d; border-radius:0; width:100%; height:200px; text-align:center; border-radius: var(--input-radius); } .sp-from-file-ondraghover-drag-drop-area { color:#333333; background-color:#dddddd; border:2.0px dashed #6c757d; border-radius:0; width:100%; height:200px; text-align:center; border-radius: var(--input-radius); } .sp-from-file-ondragleave-drag-drop-area { color:#333333; background-color:#dddddd; border:2.0px dashed #6c757d; border-radius:0; width:100%; height:200px; border-radius: var(--input-radius); } .sp-from-file-ondrop-drag-drop-area { color:#333333; background-color:var(--input-color); border:2.0px dashed #6c757d; border-radius:0; width:100%; height:200px; border-radius: var(--input-radius); } .sp-form-embedded>.sp-file-info:last-child { padding-bottom:0; } .sp-file-info { padding-top:1em; padding-bottom:1em; line-height:1.5; } .sp-file-info>div { width:100%; } .main-text { font-size:1em; font-weight:bold; } [class^="sp-step-flow-f"] { margin:3em 0 2em; } [class^="sp-step-flow-f"]>.large-setting { display:flex; justify-content: center; } [class^="sp-step-flow-f"]>.small-setting { display:none; } [class^="sp-step-flow-f"]>.large-setting, [class^="sp-step-flow-f"]>.small-setting { text-align: center; margin: 0 auto; padding: 0 20px; } [class^="sp-step-flow-f"]>.large-setting>.step, [class^="sp-step-flow-f"]>.small-setting>.step { word-wrap: break-word; min-width: 0; text-align:center; } [class^="sp-step-flow-f"]>.large-setting>.step { flex: 1; margin-right:36px; font-size:16px; } [class^="sp-step-flow-f"]>.small-setting>.step { font-size:14px; } [class^="sp-step-flow-f"]>.large-setting>.step:last-child, [class^="sp-step-flow-f"]>.small-setting>.step:last-child { margin-right: 0; } [class^="sp-step-flow-f"]>.large-setting>.step>span, [class^="sp-step-flow-f"]>.small-setting>.step>span { overflow: hidden; text-overflow: ellipsis; position:relative; display:block; padding-top: 16px; white-space:nowrap; color:#D3D6DB; font-weight:bold; } [class^="sp-step-flow-f"]>.large-setting>.step>span::before, [class^="sp-step-flow-f"]>.small-setting>.step>span::before { position: absolute; content: ""; display: block; top: 0; width: 100%; background: #D3D6DB; } [class^="sp-step-flow-f"]>.large-setting>.step>span::before { height: 6px; border-radius: 6px; } [class^="sp-step-flow-f"]>.small-setting>.step>span::before { height: 4px; border-radius: 4px; } [class^="sp-step-flow-f"]>.large-setting>.step.active>span, [class^="sp-step-flow-f"]>.small-setting>.step.active>span { color:var(--main-color); } [class^="sp-step-flow-f"]>.large-setting>.step.active>span::before, [class^="sp-step-flow-f"]>.small-setting>.step.active>span::before { background:var(--main-color); } @media (max-width: 765px) { [class^="sp-step-flow-f"]>.large-setting { display:none; } [class^="sp-step-flow-f"]>.small-setting { display:flex; justify-content: center; counter-reset:step; } [class^="sp-step-flow-f"]>.small-setting>.step>span { display: none; } [class^="sp-step-flow-f"]>.small-setting>.step { display: flex; align-items: center; width: auto; margin: 0; background: none; color: #ffffff; font-weight: bold; } [class^="sp-step-flow-f"]>.small-setting>.step::before { counter-increment: step 1; content: counter(step, decimal); width:24px; height:24px; background: var(--main-color); border-radius: 50%; font-size: 12px; line-height: 24px; } [class^="sp-step-flow-f"]>.small-setting>.step:not(:last-child) { flex-grow: 1; } [class^="sp-step-flow-f"]>.small-setting>.step:not(:last-child)::after { content: ""; width: calc(100% - 24px); height:2px; background: var(--main-color); vertical-align: middle; } [class^="sp-step-flow-f"]>.small-setting>.step.active::after, [class^="sp-step-flow-f"]>.small-setting>.step.active~.step::before, [class^="sp-step-flow-f"]>.small-setting>.step.active~.step::after { background:#D3D6DB; } }
資料請求フォームブロックでは、自動登録の設定を行っております。
▼自動登録 設定
フィールド | 値タイプ | 値 |
---|---|---|
参照_物件マスタ | 引用(任意レコード値) | 引用元: 物件マスタDB |
手順18:資料請求ページのブロック埋め込み
手順14で作成した資料請求ページに手順8/手順15で作成したブロックを埋め込みます。
HTML
CSS
また、PHPに確認ステップ、完了ステップで物件詳細ページを削除する処理を記載します。
PHP
HTMLの「"fcbxxxx"」、「"rib0xxxx"」、「"ifb0xxxx"」には、それぞれ手順2、3で作成したヘッダ、物件詳細ブロック、資料請求フォームブロック、フッターのIDを記載ください。HTML
<!-- ヘッダ --> <sp:block name="fcb0xxxx"></sp:block> <th:block th:if="${cp.result.value['step_detail']} eq 1"> <!--/* 物件詳細 */--> <sp:block name="rib0xxxx"></sp:block> <div class="sp-record-list-card-actions sp-record-list-container sp-record-list-table sp-url-button"> <a class="url-button button-l" th:href="${pages['p0xxxx']?.path ?:'/404'}">戻る</a> <a class="url-button button-r" th:href="${cp.result.value['recordInfo']}">物件詳細</a> </div> </th:block> <!-- 資料請求フォーム --> <h2>資料請求</h2> <sp:block name="ifb0xxxx"></sp:block> <!-- フッター --> <sp:block name="fcb0xxxx"></sp:block>
CSS
h2 { text-align: center; } h1 { text-align: center; } .reserve_attention { display: block; text-align: center; margin: 0.5rem 0; } .url-button { width: auto; /* font-size:0.875rem; */ padding:0.5rem 0; text-align:center; text-decoration:none; flex: 1; color: #ffffff; background-color: #0D60DB; border: 1.0px solid #0D60DB; border-radius: calc(12px / 1.2); } .button-l { padding:0.5rem 6%; margin-right: 0.5rem; } .button-r { padding:0.5rem 5%; margin-left: 0.5rem; } .button { padding:0.5rem 5%; } .sp-url-button { text-align: center; width: auto; margin: 1.5rem auto; /* border: 1px solid #dddddd; */ }
PHP
<?php //------------------------------ // API設定 //------------------------------ //------------------------------ // 設定値 //------------------------------ define("API_URL", "https://api.spiral-platform.com/v1"); define("API_KEY", "APIキー"); //APIキー define("APP_ROLE", "アプリロール"); //API権限を持つアプリロール識別名 define("DB_ID", "DBID"); //物件マスタDBID define("APP_ID", "アプリID"); //モデルルーム予約管理アプリID define("DB_ID_2", "DBID"); //カレンダーDBID //------------------------------ // 物件詳細ステップ出し分け //------------------------------ $registForm_reg = $SPIRAL->getRegistrationForm("資料請求フォームの識別名"); $step_detail = $registForm_reg->getStep(); $SPIRAL->setTHValue("step_detail", $step_detail); //------------------------------ // API実行 //------------------------------ // 物件ID取得 $commonBase = CommonBase::getInstance(); $record = $SPIRAL->getParam("record"); //------------------------------ // 物件詳細ステップ出し分け //------------------------------ $param_record = explode(".", $SPIRAL->getParam("record"));//レコードアイテムブロックが表示された時、URLクエリパラメータから「レコードID」を取得。 $recordId = $param_record[1]; $resultRecordSelect = $commonBase->apiCurlAction("GET", "/apps/". APP_ID. "/dbs/". DB_ID. "/records/". $recordId); $SPIRAL->setTHValue("calender", $resultRecordSelect['item']['propertyID']);//ThymeleafにカレンダーDBのレコードをセット $resultRecordSelect['item']['propertyID'] $record_url = "/認証エリアの識別名/物件詳細ページの識別名" . "?record=" . $record. "&rlb0xxxx_q_f0xx=". $resultRecordSelect['item']['propertyID']; $SPIRAL->setTHValue("recordInfo", $record_url); //------------------------------ // 共通モジュール //------------------------------ class CommonBase { /** * シングルトンインスタンス * @var UserManager */ protected static $singleton; public function __construct() { if (self::$singleton) { throw new Exception('must be singleton'); } self::$singleton = $this; } /** * シングルトンインスタンスを返す * @return UserManager */ public static function getInstance() { if (!self::$singleton) { return new CommonBase(); } else { return self::$singleton; } } /** * V2用 API送信ロジック * @return Result */ function apiCurlAction($method, $addUrlPass, $data = null, $multiPart = null, $jsonDecode = null) { $header = array( "Authorization:Bearer ". API_KEY, "X-Spiral-Api-Version: 1.1", ); if($multiPart) { $header = array_merge($header, array($multiPart)); } else { $header = array_merge($header, array("Content-Type:application/json")); } if(APP_ROLE){ $header = array_merge($header, array("X-Spiral-App-Role: ".APP_ROLE)); } // curl $curl = curl_init(); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_URL, API_URL. $addUrlPass); curl_setopt($curl, CURLOPT_HTTPHEADER, $header); if ($method == "POST") { if ($multiPart) { curl_setopt($curl, CURLOPT_POSTFIELDS, $data); } else { curl_setopt($curl, CURLOPT_POSTFIELDS , json_encode($data)); } curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method); } if ($method == "PATCH") { curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data)); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method); } if ($method == "DELETE") { curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data)); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method); } $response = curl_exec($curl); if (curl_errno($curl)) echo curl_error($curl); curl_close($curl); if($jsonDecode){ return $response; }else{ return json_decode($response, true); } } } ?>
PHPの「"資料請求フォームの識別名"」、「"認証エリアの識別名"」、「"物件詳細ページの識別名"」には、それぞれ資料請求フォーム、内覧予約認証エリア、物件詳細ページの識別名を記載ください。
「'f0xx'」には、物件マスタDB内の対応するフィールドIDを記載ください。
「rlb0xxxx_q_f0xx」には、物件詳細ページでレコードリストを絞り込むために、手順10で作成する予約可能日一覧のIDとカレンダーDBの物件IDのフィールドのIDを記載します。
内覧予約認証エリア内ページの作成
手順1:登録情報変更ページの作成
内覧予約認証エリアの「+」ボタンから新規ページを作成します。
登録情報変更ページはクリックログインページのため、認証は「あり」、クリックログインは「許可する」で設定します。
設定方法は、「ソース設定」を選択します。
登録情報変更ページはクリックログインページのため、認証は「あり」、クリックログインは「許可する」で設定します。
設定方法は、「ソース設定」を選択します。
手順2:登録情報変更ページに埋め込む登録情報変更フォームブロックを作成
登録情報変更フォームは、更新フォームブロックで作成します。
更新フォームブロックは、ソース設定で作成します。
HTML
CSS
HTMLの「"f0xx"」には、内覧予約DB内の対応するフィールドIDを記載ください。
更新フォームブロックは、ソース設定で作成します。
HTML
<div class="sp-form-container"> <div class="sp-step-flow-f24431"> <div class="large-setting arrow sp-clearfix"> <div class="step active" title="入力"> <span>入力</span> </div> <div class="step" title="確認"> <span>確認</span> </div> <div class="step" title="完了"> <span>完了</span> </div> </div> <div class="small-setting arrow sp-clearfix"> <div class="step active" title="入力"> <span>入力</span> </div> <div class="step" title="確認"> <span>確認</span> </div> <div class="step" title="完了"> <span>完了</span> </div> </div> </div> <div class="sp-form-item sp-form-html" th:inline="none"><p><span style="font-size: 18pt;">登録情報変更フォーム</span></p></div> <div class="sp-form-item sp-form-html" th:inline="none">変更する登録情報をご入力の上、「確認画面へ」ボタンを押してください</div> <!--/* 名前(name) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> </div> <span type="name" th:name="${fields['f0xx'].name}" th:text="${siteClient.record[1]}" th:value="${siteClient.record[1]}"></span> <input type="hidden" class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="${#maps.containsKey(inputs, 'f0xx') ? inputs['f0xx'] : siteClient.record[1]}" th:if="${fields['f0xx'].control == 'text'}"> <!--ZipCode Option--> <div class="sp-form-zip-code" th:if="${fields['f0xx'].control == 'zipCode'}"> <input type="text" class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="${#maps.containsKey(inputs, 'f0xx') ? inputs['f0xx'] : siteClient.record[1]}"> <button class="sp-form-zip-code-button" th:data-zipcode="|zipCodeSearch${fields['f0xx'].name}|" th:if="${fields['f0xx'].addressByZipCode != null}" th:text="${fields['f0xx'].zipCodeButtonLabel}">住所検索</button> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> </div> <!--/* メールアドレス(mail) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> </div> <span type="email" th:name="${fields['f0xx'].name}" th:text="${siteClient.record[2]}" th:value="${siteClient.record[2]}"></span> <input type="hidden" class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="${#maps.containsKey(inputs, 'f0xx') ? inputs['f0xx'] : siteClient.record[2]}"> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:if="${errors['f0xx'] != null}" th:text="${errors['f0xx'].message}">Error message</span> </div> <!--/* 都道府県(pref) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <div class="sp-form-dropdown"> <select class="sp-form-control" th:name="${fields['f0xx'].name}" th:with="default=${#maps.containsKey(inputs, 'f0xx') ? inputs['f0xx'] : #strings.toString(siteClient.record[37]?.id)}"> <option value="" th:text="${fields['f0xx'].unselectedLabel}" th:selected="${default == null}">Select option</option> <option th:each="option : ${fields['f0xx'].options}" th:value="${option.id}" th:text="${option.label}" th:selected="${default == #strings.toString(option.id)}">Item</option> </select> <span class="sp-form-dropdown-icon"></span> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:if="${errors['f0xx'] != null}" th:text="${errors['f0xx'].message}">Error message</span> </div> </div> <!--/* 郵便番号(zipCode) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <input type="text" class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="${#maps.containsKey(inputs, 'f0xx') ? inputs['f0xx'] : siteClient.record[3]}" th:if="${fields['f0xx'].control == 'text'}"> <!--ZipCode Option--> <div class="sp-form-zip-code" th:if="${fields['f0xx'].control == 'zipCode'}"> <input type="text" class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="${#maps.containsKey(inputs, 'f0xx') ? inputs['f0xx'] : siteClient.record[3]}"> <button class="sp-form-zip-code-button" th:data-zipcode="|zipCodeSearch${fields['f0xx'].name}|" th:if="${fields['f0xx'].addressByZipCode != null}" th:text="${fields['f0xx'].zipCodeButtonLabel}">住所検索</button> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:data-zipcode="|zipCodeError${fields['f0xx'].name}|" th:text="${errors['f0xx']?.message}">Error message</span> </div> </div> <!--/* 市区町村(municipalities) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <input type="text" class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="${#maps.containsKey(inputs, 'f0xx') ? inputs['f0xx'] : siteClient.record[4]}" th:if="${fields['f0xx'].control == 'text'}"> <!--ZipCode Option--> <div class="sp-form-zip-code" th:if="${fields['f0xx'].control == 'zipCode'}"> <input type="text" class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="${#maps.containsKey(inputs, 'f0xx') ? inputs['f0xx'] : siteClient.record[4]}"> <button class="sp-form-zip-code-button" th:data-zipcode="|zipCodeSearch${fields['f0xx'].name}|" th:if="${fields['f0xx'].addressByZipCode != null}" th:text="${fields['f0xx'].zipCodeButtonLabel}">住所検索</button> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:data-zipcode="|zipCodeError${fields['f0xx'].name}|" th:text="${errors['f0xx']?.message}">Error message</span> </div> </div> <!--/* 番地(block) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <input type="text" class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="${#maps.containsKey(inputs, 'f0xx') ? inputs['f0xx'] : siteClient.record[5]}" th:if="${fields['f0xx'].control == 'text'}"> <!--ZipCode Option--> <div class="sp-form-zip-code" th:if="${fields['f0xx'].control == 'zipCode'}"> <input type="text" class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="${#maps.containsKey(inputs, 'f0xx') ? inputs['f0xx'] : siteClient.record[5]}"> <button class="sp-form-zip-code-button" th:data-zipcode="|zipCodeSearch${fields['f0xx'].name}|" th:if="${fields['f0xx'].addressByZipCode != null}" th:text="${fields['f0xx'].zipCodeButtonLabel}">住所検索</button> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:data-zipcode="|zipCodeError${fields['f0xx'].name}|" th:text="${errors['f0xx']?.message}">Error message</span> </div> </div> <!--/* マンション・ビル名(building) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <input type="text" class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="${#maps.containsKey(inputs, 'f0xx') ? inputs['f0xx'] : siteClient.record[6]}" th:if="${fields['f0xx'].control == 'text'}"> <!--ZipCode Option--> <div class="sp-form-zip-code" th:if="${fields['f0xx'].control == 'zipCode'}"> <input type="text" class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="${#maps.containsKey(inputs, 'f0xx') ? inputs['f0xx'] : siteClient.record[6]}"> <button class="sp-form-zip-code-button" th:data-zipcode="|zipCodeSearch${fields['f0xx'].name}|" th:if="${fields['f0xx'].addressByZipCode != null}" th:text="${fields['f0xx'].zipCodeButtonLabel}">住所検索</button> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:data-zipcode="|zipCodeError${fields['f0xx'].name}|" th:text="${errors['f0xx']?.message}">Error message</span> </div> </div> <!--/* 希望占有面積(occupiedArea) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <div class="sp-form-dropdown"> <select class="sp-form-control" th:name="${fields['f0xx'].name}" th:with="default=${#maps.containsKey(inputs, 'f0xx') ? inputs['f0xx'] : #strings.toString(siteClient.record[9]?.id)}"> <option value="" th:text="${fields['f0xx'].unselectedLabel}" th:selected="${default == null}">Select option</option> <option th:each="option : ${fields['f0xx'].options}" th:value="${option.id}" th:text="${option.label}" th:selected="${default == #strings.toString(option.id)}">Item</option> </select> <span class="sp-form-dropdown-icon"></span> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:if="${errors['f0xx'] != null}" th:text="${errors['f0xx'].message}">Error message</span> </div> </div> <!--/* ご予算(budget) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <div class="sp-form-dropdown"> <select class="sp-form-control" th:name="${fields['f0xx'].name}" th:with="default=${#maps.containsKey(inputs, 'f0xx') ? inputs['f0xx'] : #strings.toString(siteClient.record[10]?.id)}"> <option value="" th:text="${fields['f0xx'].unselectedLabel}" th:selected="${default == null}">Select option</option> <option th:each="option : ${fields['f0xx'].options}" th:value="${option.id}" th:text="${option.label}" th:selected="${default == #strings.toString(option.id)}">Item</option> </select> <span class="sp-form-dropdown-icon"></span> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:if="${errors['f0xx'] != null}" th:text="${errors['f0xx'].message}">Error message</span> </div> </div> <!--/* 入居予定人数(residentNum) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <div class="sp-form-dropdown"> <select class="sp-form-control" th:name="${fields['f0xx'].name}" th:with="default=${#maps.containsKey(inputs, 'f0xx') ? inputs['f0xx'] : #strings.toString(siteClient.record[11]?.id)}"> <option value="" th:text="${fields['f0xx'].unselectedLabel}" th:selected="${default == null}">Select option</option> <option th:each="option : ${fields['f0xx'].options}" th:value="${option.id}" th:text="${option.label}" th:selected="${default == #strings.toString(option.id)}">Item</option> </select> <span class="sp-form-dropdown-icon"></span> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:if="${errors['f0xx'] != null}" th:text="${errors['f0xx'].message}">Error message</span> </div> </div> <!--/* 来場人数(visitorNum) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <div class="sp-form-dropdown"> <select class="sp-form-control" th:name="${fields['f0xx'].name}" th:with="default=${#maps.containsKey(inputs, 'f0xx') ? inputs['f0xx'] : #strings.toString(siteClient.record[12]?.id)}"> <option value="" th:text="${fields['f0xx'].unselectedLabel}" th:selected="${default == null}">Select option</option> <option th:each="option : ${fields['f0xx'].options}" th:value="${option.id}" th:text="${option.label}" th:selected="${default == #strings.toString(option.id)}">Item</option> </select> <span class="sp-form-dropdown-icon"></span> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:if="${errors['f0xx'] != null}" th:text="${errors['f0xx'].message}">Error message</span> </div> </div> <!--/* 予約日(reservationDate) */--> <sp:input-field name="f0xx" control="ymdText"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> </div> <div class="sp-form-data"> <div class="sp-form-datetimes"> <div class="sp-form-date"> <span type="text" th:name="${fields['f0xx'].name}" th:text="${siteClient.record[15].year}" th:value="${siteClient.record[15].year}"></span> <input type="hidden" class="sp-form-control" th:name="${fields['f0xx:year'].name}" th:placeholder="${fields['f0xx'].placeholder.year}" th:value="${#maps.containsKey(inputs, 'f0xx:year') ? inputs['f0xx:year'] : siteClient.record[15]?.year}"> <span class="sp-form-date-separator">/</span> <span type="text" th:name="${fields['f0xx'].name}" th:text="${siteClient.record[15].month}" th:value="${siteClient.record[15].month}"></span> <input type="hidden" class="sp-form-control" th:name="${fields['f0xx:month'].name}" th:placeholder="${fields['f0xx'].placeholder.month}" th:value="${#maps.containsKey(inputs, 'f0xx:month') ? inputs['f0xx:month'] : siteClient.record[15]?.month}"> <span class="sp-form-date-separator">/</span> <span type="text" th:name="${fields['f0xx'].name}" th:text="${siteClient.record[15].day}" th:value="${siteClient.record[15].day}"></span> <input type="hidden" class="sp-form-control" th:name="${fields['f0xx:day'].name}" th:placeholder="${fields['f0xx'].placeholder.day}" th:value="${#maps.containsKey(inputs, 'f0xx:day') ? inputs['f0xx:day'] : siteClient.record[15]?.day}"> </div> </div> </div> </div> <!--/* 予約時間(reservationTime) */--> <sp:input-field name="f0xx" control="hmsText"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> </div> <div class="sp-form-data"> <div class="sp-form-datetimes"> <div class="sp-form-time"> <span type="text" th:name="${fields['f0xx'].name}" th:text="${siteClient.record[16]}" th:value="${siteClient.record[16]}"></span> <input type="hidden" class="sp-form-control" th:name="${fields['f0xx:hour'].name}" th:placeholder="${fields['f0xx'].placeholder.hour}" th:value="${#maps.containsKey(inputs, 'f0xx:hour') ? inputs['f0xx:hour'] : siteClient.record[16]?.hour}"> <input type="hidden" class="sp-form-control" th:name="${fields['f0xx:minute'].name}" th:placeholder="${fields['f0xx'].placeholder.minute}" th:value="${#maps.containsKey(inputs, 'f0xx:minute') ? inputs['f0xx:minute'] : siteClient.record[16]?.minute}"> <input type="hidden" class="sp-form-control" th:name="${fields['f0xx:second'].name}" th:placeholder="${fields['f0xx'].placeholder.second}" th:value="${#maps.containsKey(inputs, 'f0xx:second') ? inputs['f0xx:second'] : siteClient.record[16]?.second}"> </div> </div> </div> </div> <div class="sp-form-item sp-form-interaction"> <button class="sp-form-prev-button" type="submit" name="action" value="previous" th:if="!${step.isFirst}" th:text="${step.prevButtonLabel}">Prev</button> <button class="sp-form-next-button" type="submit" name="action" value="next" th:text="${step.nextButtonLabel}">Next</button> </div> </div>
:root { /*============================= カスタムプロパティ ==============================*/ --base-color: #FFFFFF; /* フォームブロックの背景色 */ --main-color: #0D60DB; /* メインカラー */ --accent-color: #B8250F; /* アクセントカラー */ --input-color: #F5F7FA; /* 入力欄の背景色 */ --input-border-color: #D3D6DB; /* 入力欄の枠線の色 */ --input-radius: 12px; /* 入力欄の角の丸さ */ --transition: 0.1s; /* アニメーション時間 */ /*------ 合計100%になるよう調整 -------*/ --label-width: 25%; /* ラベル部分の幅 */ --data-width: 75%; /* データ部分の幅 */ } .sp-form-container { font-size:16px; padding:1em; box-sizing:border-box; max-width: 960px; color:#505050; background-color:var(--base-color); border:1px solid #E1E5EB; border-radius:var(--input-radius); } .sp-form-container .sp-form-item:not(:last-child) { margin-bottom:0.5em; padding:0.5em 1em; } .sp-form-field, .sp-form-group { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:vertical; -webkit-box-direction:normal; -ms-flex-direction:column; flex-direction:column; } .sp-form-field>.sp-form-label, .sp-form-group>.sp-form-label { font-size:1.15em; font-weight:bold; padding:.25em 0; word-break:break-all; box-sizing:border-box; color:#333333; } .sp-form-group-item>.sp-form-label { word-break:break-all; display:inline-block; margin-bottom:.2em; } .sp-form-field>.sp-form-data, .sp-form-group>.sp-form-data { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:vertical; -webkit-box-direction:normal; -ms-flex-direction:column; flex-direction:column; word-break:break-all; padding:0.25em 0; box-sizing:border-box; } .sp-form-group-item>.sp-form-data { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:vertical; -webkit-box-direction:normal; -ms-flex-direction:column; flex-direction:column; } .sp-form-required { display:inline-block; margin:0 .5em; padding: 3px 6px; background:var(--accent-color); color:#ffffff; line-height:1; border-radius:.25em; font-size:0.7em; font-weight: bold; vertical-align: middle; } .sp-form-group-item:not(:last-child) { margin-bottom:.5em; } .sp-form-noted { font-size:.8em; color:#808080; word-break:break-all; margin-top:.5em; padding-left:min(calc(var(--input-radius) / 2 - 4px), 8px); } .sp-form-error { font-size:.8em; color:var(--accent-color); padding-left:min(calc(var(--input-radius) / 2 - 4px), 8px); } .sp-form-control { -moz-appearance:none; -webkit-appearance:none; -ms-progress-appearance:none; appearance:none; font-family:inherit; font-size:1em; line-height:1.5; padding:.3em .7em; padding-left:clamp(12px, calc(var(--input-radius) - 2px), 24px); background:var(--input-color); color:#333333; box-sizing:border-box; width:100%; height:48px; margin-bottom:.3em; border:none; outline:none; border-radius:var(--input-radius); box-shadow:0 0 0 0.5px var(--input-border-color); } .sp-form-control:focus { box-shadow:0 0 0 2px var(--main-color); } .sp-form-control[type="number"] { height: 36px; } .sp-form-control:placeholder-shown { color:#aaa; } .sp-form-control::placeholder { color:#aaa; } .sp-form-control::-ms-input-placeholder { color:#aaa; } .sp-form-control:-ms-input-placeholder { color:#aaa; } .sp-form-control:-moz-placeholder { color:#aaa; } textarea.sp-form-control { resize:vertical; padding-top:clamp(6px, calc(var(--input-radius) / 2), 18px); height:calc(1.5em * 5); } select.sp-form-control, option.sp-form-control { -moz-appearance:none; -webkit-appearance:none; -ms-progress-appearance:none; appearance:none; padding-right:1.5em; } .sp-form-control>option { background:#FFFFFF;} select.sp-form-control::-ms-expand { display:none; } .sp-form-phone .sp-form-control { max-width:20em; } .sp-form-phone>*:not(:only-child) { margin-right:.5rem; } .sp-form-dropdown { position:relative; } .sp-form-dropdown-icon { display:block; position:absolute; top:1.3em; right:1em; line-height:0; pointer-events:none; } .sp-form-dropdown-icon:after { content:""; display:block; border-top:0.333em solid #888; border-right:.333em solid transparent; border-left:.333em solid transparent; } .sp-form-selection { display:block; cursor: pointer; margin-bottom:.3em; padding:.25em .75em .35em; background:var(--input-color); border-radius: var(--input-radius); box-shadow:0 0 0 0.5px var(--input-border-color) ; } .sp-form-selection-label { display: inline-block; position: relative; vertical-align:middle; padding: 4px 0; } .sp-form-datetimes, .sp-form-date, .sp-form-time, .sp-form-timezone { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:horizontal; -webkit-box-direction:normal; -ms-flex-flow:row wrap; flex-flow:row wrap; -webkit-box-align:center; -ms-flex-align:center; align-items:center; } .sp-form-datetime, .sp-form-date, .sp-form-time, .sp-form-timezone { margin-right:.5rem; -ms-flex-wrap:nowrap; flex-wrap:nowrap; } .sp-form-datetime { max-width:20em; } .sp-form-phone { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:horizontal; -webkit-box-direction:normal; -ms-flex-flow:row wrap; flex-flow:row wrap; -webkit-box-align:center; -ms-flex-align:center; align-items:center; } .sp-form-date-separator { width:1em; margin-bottom: .3em; text-align:center; -ms-flex-negative:1; flex-shrink:0; } .sp-form-number { max-width:20em; } .sp-form-email-reenter, .sp-form-password-reenter { font-size:.9em; margin-bottom:.2em; padding-left:min(calc(var(--input-radius) / 2 - 4px), 8px); } .sp-form-html p { margin:0; } .sp-form-interaction { display:-webkit-box; display:-ms-flexbox; display:flex; -ms-flex-wrap:wrap; flex-wrap:wrap; margin-top:1em; } .sp-form-prev-button { color:#333333; background-color:var(--base-color); border:2.0px solid #666666; } .sp-form-next-button, .sp-form-login-button { color:#ffffff; background-color:var(--main-color); border:none; } .sp-form-field .sp-form-embedded { padding-left:.25em; } .sp-form-selection>input[type="radio"], .sp-form-selection>input[type="checkbox"] { display: none; vertical-align:middle; margin-left:0; } .sp-form-selection>input[type="radio"]+.sp-form-selection-label::before, .sp-form-selection>input[type="checkbox"]+.sp-form-selection-label::before{ display: inline-block; content:""; position: relative; box-sizing: border-box; top: 4px; margin-right: 6px; width: 20px; height: 20px; background: #ffffff; border:10px solid #ffffff; box-shadow: 0 0 0 0.5px var(--input-border-color); transition: var(--transition); } .sp-form-selection>input[type="radio"]+.sp-form-selection-label::before { border-radius: 50%; } .sp-form-selection>input[type="checkbox"]+.sp-form-selection-label::before { border-radius: min(var(--input-radius), 4px); } .sp-form-selection>input[type="radio"]:checked+.sp-form-selection-label::before{ background: var(--main-color); border:4px solid #ffffff; } .sp-form-selection>input[type="checkbox"]+.sp-form-selection-label::after{ border-right: 3px solid var(--main-color); border-bottom: 3px solid var(--main-color); content: ''; display: inline-block; width: 6px; height: 10px; left: 9px; margin-top: -7px; position: absolute; top: 50%; transform: rotate(45deg); opacity: 0; transition: var(--transition); } .sp-form-selection>input[type="checkbox"]:checked+.sp-form-selection-label::after{ left: 6px; opacity: 1; } .sp-form-date>input, .sp-form-time>input { max-width:7em; } .sp-form-date>input[type="date"]{ min-width: 140px; max-width: none; } .sp-form-time>input[type="time"] { min-width: 92px; max-width: none; } .sp-form-interaction>button { -webkit-box-flex:1; -ms-flex-positive:1; flex-grow:1; cursor:pointer; font-size:1em; font-weight:bold; line-height:1.5; margin:.5rem; padding:.75rem 0; text-align:center; -webkit-user-select:none; -moz-user-select:none; -ms-user-select:none; user-select:none; white-space:nowrap; border-radius:var(--input-radius); } @media (min-width:768px) { .sp-form-container { font-size:initial; padding:3em; margin:2em auto; } .sp-form-container .sp-form-item:not(:last-child) { margin-bottom:0.5em; padding-bottom:0.5em; } .sp-form-field, .sp-form-group { -webkit-box-orient:horizontal; -webkit-box-direction:normal; -ms-flex-flow:row nowrap; flex-flow:row nowrap; } .sp-form-field>.sp-form-label, .sp-form-group>.sp-form-label { font-size:1em; width:var(--label-width); padding:.5em; } .sp-form-group .sp-form-group-item>.sp-form-label { font-size:.9em; padding-right:.5em; } .sp-form-field>.sp-form-data, .sp-form-group>.sp-form-data { font-size:1em; width:var(--data-width); padding:.5em; } .sp-form-group>.sp-form-data { -webkit-box-orient:horizontal; -webkit-box-direction:normal; -ms-flex-flow:row wrap; flex-flow:row wrap; } .sp-form-group.sp-form-group-vertical>.sp-form-data { -webkit-box-orient:vertical; -webkit-box-direction:normal; -ms-flex-direction:column; flex-direction:column; } .sp-form-required { font-size:0.8em; } .sp-form-group-item { padding:.25em; } .sp-form-group-item:not(:last-child) { margin-bottom:0; } .sp-form-control { font-size:.9em; } .sp-form-selection { font-size:.9em; margin:0 .5em 0 0; padding-right:1em; background:none; box-shadow:none; } .sp-form-selection-vertical>.sp-form-selection { margin:0 auto 0 0; padding-right: 4em; } .sp-form-selection-vertical { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:vertical; -webkit-box-direction:normal; -ms-flex-direction:column; flex-direction:column; } .sp-form-selection-horizontal { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:horizontal; -webkit-box-direction:normal; -ms-flex-flow:row wrap; flex-flow:row wrap; } .sp-form-interaction { justify-content:center; margin-top:2em; } .sp-form-embedded { font-size:.9em; } .sp-form-group-item .sp-form-embedded { padding-right:5em; } .sp-form-selection>input[type="radio"]+.sp-form-selection-label::before, .sp-form-selection>input[type="checkbox"]+.sp-form-selection-label::before{ background: var(--input-color); border:10px solid var(--input-color); } .sp-form-selection>input[type="radio"]:hover+.sp-form-selection-label::before, .sp-form-selection>input[type="checkbox"]:hover+.sp-form-selection-label::before{ border:10px solid #dddddd; } .sp-form-selection>input[type="radio"]:checked+.sp-form-selection-label::before{ border:4px solid var(--input-color); } .sp-form-date>input[type="date"]{ min-width: unset; } .sp-form-time>input[type="time"] { min-width: unset; } .sp-form-interaction>button { -webkit-box-flex:0; -ms-flex-positive:0; flex-grow:0; padding:.75rem 5em; } } .sp-form-recaptcha { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-pack:start; -ms-flex-pack:start; justify-content:flex-start; } .sp-form-recaptcha-right { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-pack:end; -ms-flex-pack:end; justify-content:flex-end; } .sp-form-recaptcha-center { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-pack:center; -ms-flex-pack:center; justify-content:center; } .sp-form-file-button { padding:.8em 2em; font-weight: bold; cursor:pointer; color:#666666; background-color:#f6f6f6; border:none; border: solid 2px #a0a0a0; border-radius:var(--input-radius); transition: var(--transition); align-items: center; justify-content: center; } .sp-form-file-button::before{ display: inline-block; content: url('data:image/svg+xml;utf-8,<svg fill="%23666" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M14.4,7.9l-5.7,5.7c-0.4,0.4-0.8,0.6-1.2,0.8c-0.7,0.3-1.4,0.3-2.1,0.2c-0.7-0.1-1.4-0.5-1.9-1c-0.4-0.4-0.6-0.8-0.8-1.2c-0.3-0.7-0.3-1.4-0.2-2.1c0.1-0.7,0.5-1.4,1-1.9L9.7,2c0.2-0.2,0.5-0.4,0.8-0.5c0.4-0.2,0.9-0.2,1.3-0.1C12.2,1.4,12.6,1.6,13,2c0.2,0.2,0.4,0.5,0.5,0.8c0.2,0.4,0.2,0.9,0.1,1.3c-0.1,0.4-0.3,0.8-0.6,1.2l-6.2,6.2c-0.1,0.1-0.2,0.1-0.3,0.2c-0.1,0.1-0.3,0.1-0.5,0c-0.2,0-0.3-0.1-0.4-0.2c-0.1-0.1-0.1-0.2-0.2-0.3c-0.1-0.1-0.1-0.3,0-0.5c0-0.2,0.1-0.3,0.2-0.4l5.5-5.5l-0.9-0.9L4.7,9.3C4.5,9.5,4.4,9.7,4.3,10c-0.2,0.4-0.2,0.8-0.1,1.2c0.1,0.4,0.3,0.8,0.6,1.1c0.2,0.2,0.4,0.4,0.7,0.5c0.4,0.2,0.8,0.2,1.2,0.1c0.4-0.1,0.8-0.3,1.1-0.6l6.2-6.2c0.3-0.3,0.6-0.8,0.8-1.2c0.3-0.6,0.3-1.4,0.2-2c-0.1-0.7-0.5-1.3-1-1.8c-0.3-0.3-0.8-0.6-1.2-0.8c-0.6-0.3-1.4-0.3-2-0.2C10,0.2,9.3,0.5,8.8,1L2.5,7.4C2,7.9,1.6,8.5,1.4,9.1C1,10,0.9,11,1.1,11.9c0.2,1,0.6,1.9,1.4,2.6C3,15,3.5,15.4,4.1,15.6C5.1,16,6,16.1,7,15.9c1-0.2,1.9-0.6,2.6-1.4l5.7-5.7L14.4,7.9z"/></svg>'); margin-left: -0.5em; width: 16px; height: 100%; vertical-align: middle; } .sp-form-file-button:focus { outline:0; } .sp-from-file-default-drag-drop-area { color:#333333; background-color:var(--input-color); border:2.0px dashed #6c757d; border-radius:0; width:100%; height:200px; text-align:center; border-radius: var(--input-radius); } .sp-from-file-ondraghover-drag-drop-area { color:#333333; background-color:#dddddd; border:2.0px dashed #6c757d; border-radius:0; width:100%; height:200px; text-align:center; border-radius: var(--input-radius); } .sp-from-file-ondragleave-drag-drop-area { color:#333333; background-color:#dddddd; border:2.0px dashed #6c757d; border-radius:0; width:100%; height:200px; border-radius: var(--input-radius); } .sp-from-file-ondrop-drag-drop-area { color:#333333; background-color:var(--input-color); border:2.0px dashed #6c757d; border-radius:0; width:100%; height:200px; border-radius: var(--input-radius); } .sp-form-embedded>.sp-file-info:last-child { padding-bottom:0; } .sp-file-info { padding-top:1em; padding-bottom:1em; line-height:1.5; } .sp-file-info>div { width:100%; } .main-text { font-size:1em; font-weight:bold; } [class^="sp-step-flow-f"] { margin:3em 0 2em; } [class^="sp-step-flow-f"]>.large-setting { display:flex; justify-content: center; } [class^="sp-step-flow-f"]>.small-setting { display:none; } [class^="sp-step-flow-f"]>.large-setting, [class^="sp-step-flow-f"]>.small-setting { text-align: center; margin: 0 auto; padding: 0 20px; } [class^="sp-step-flow-f"]>.large-setting>.step, [class^="sp-step-flow-f"]>.small-setting>.step { word-wrap: break-word; min-width: 0; text-align:center; } [class^="sp-step-flow-f"]>.large-setting>.step { flex: 1; margin-right:36px; font-size:16px; } [class^="sp-step-flow-f"]>.small-setting>.step { font-size:14px; } [class^="sp-step-flow-f"]>.large-setting>.step:last-child, [class^="sp-step-flow-f"]>.small-setting>.step:last-child { margin-right: 0; } [class^="sp-step-flow-f"]>.large-setting>.step>span, [class^="sp-step-flow-f"]>.small-setting>.step>span { overflow: hidden; text-overflow: ellipsis; position:relative; display:block; padding-top: 16px; white-space:nowrap; color:#D3D6DB; font-weight:bold; } [class^="sp-step-flow-f"]>.large-setting>.step>span::before, [class^="sp-step-flow-f"]>.small-setting>.step>span::before { position: absolute; content: ""; display: block; top: 0; width: 100%; background: #D3D6DB; } [class^="sp-step-flow-f"]>.large-setting>.step>span::before { height: 6px; border-radius: 6px; } [class^="sp-step-flow-f"]>.small-setting>.step>span::before { height: 4px; border-radius: 4px; } [class^="sp-step-flow-f"]>.large-setting>.step.active>span, [class^="sp-step-flow-f"]>.small-setting>.step.active>span { color:var(--main-color); } [class^="sp-step-flow-f"]>.large-setting>.step.active>span::before, [class^="sp-step-flow-f"]>.small-setting>.step.active>span::before { background:var(--main-color); } @media (max-width: 765px) { [class^="sp-step-flow-f"]>.large-setting { display:none; } [class^="sp-step-flow-f"]>.small-setting { display:flex; justify-content: center; counter-reset:step; } [class^="sp-step-flow-f"]>.small-setting>.step>span { display: none; } [class^="sp-step-flow-f"]>.small-setting>.step { display: flex; align-items: center; width: auto; margin: 0; background: none; color: #ffffff; font-weight: bold; } [class^="sp-step-flow-f"]>.small-setting>.step::before { counter-increment: step 1; content: counter(step, decimal); width:24px; height:24px; background: var(--main-color); border-radius: 50%; font-size: 12px; line-height: 24px; } [class^="sp-step-flow-f"]>.small-setting>.step:not(:last-child) { flex-grow: 1; } [class^="sp-step-flow-f"]>.small-setting>.step:not(:last-child)::after { content: ""; width: calc(100% - 24px); height:2px; background: var(--main-color); vertical-align: middle; } [class^="sp-step-flow-f"]>.small-setting>.step.active::after, [class^="sp-step-flow-f"]>.small-setting>.step.active~.step::before, [class^="sp-step-flow-f"]>.small-setting>.step.active~.step::after { background:#D3D6DB; } }
手順3:登録情報変更ページに更新フォームのブロックを埋め込み
手順1で作成した資料請求ページに手順2で作成したブロックとヘッダ と フッターの共通のフリーコンテンツブロックを埋め込みます。
HTML
CSS
また、情報変更は予約日前日まで可能としたいため、アクセス日が予約日より前の日付かチェックするPHPを記載します。
PHP
HTMLの「"record[xx]"」、PHPの「"xx"」には、内覧予約DB内の削除済みフラグと予約日のフィールドIDを記載ください。
HTMLの「"fcbxxxx"」、「"ufb0xxxx"」には、ヘッダ、登録情報変更フォームブロック、フッターのIDを記載ください。
HTML
<!--/* body以下の要素を記述してください */--> <a href="#" data-logout>Logout</a> <!-- ヘッダ --> <sp:block name="fcb0xxxx"></sp:block> <!--/* アクセス日が予約日当日以降の場合 */--> <th:block th:if="${cp.result.value['check'] eq 0}"> <!-- エラーメッセージ --> <sp:block name="fcb019729"></sp:block> </th:block> <th:block th:if="${siteClient.record[xx]?.id eq 1}"> <!-- 予約キャンセルメッセージ --> <sp:block name="fcb0xxxx"></sp:block> </th:block> <!--/* アクセス日が予約日前日以前の場合 */--> <th:block th:if="${cp.result.value['check'] eq 1 and siteClient.record[xx]?.id ne 1}"> <h1>登録情報変更ページ</h1> <!-- 登録情報変更フォーム --> <sp:block name="ufb0xxxx"></sp:block> </th:block> <!-- フッター --> <sp:block name="fcb0xxxx"></sp:block>
h2 { text-align: center; } h1 { text-align: center; } .reserve_attention { display: block; text-align: center; margin: 0.5rem 0; } .url-button { width: auto; /* font-size:0.875rem; */ padding:0.5rem 0; text-align:center; text-decoration:none; flex: 1; color: #ffffff; background-color: #0D60DB; border: 1.0px solid #0D60DB; border-radius: calc(12px / 1.2); } .button-l { padding:0.5rem 6%; margin-right: 0.5rem; } .button-r { padding:0.5rem 5%; margin-left: 0.5rem; } .button { padding:0.5rem 5%; } .sp-url-button { text-align: center; width: auto; margin: 1.5rem auto; /* border: 1px solid #dddddd; */ }
また、情報変更は予約日前日まで可能としたいため、アクセス日が予約日より前の日付かチェックするPHPを記載します。
PHP
<?php $today = date("Y-m-d"); $date_record = $SPIRAL->getAuthRecordByFieldId("xx"); if($today < $date_record){ $SPIRAL->setTHValue("check",1); } else{ $SPIRAL->setTHValue("check",0); } ?>
HTMLの「"fcbxxxx"」、「"ufb0xxxx"」には、ヘッダ、登録情報変更フォームブロック、フッターのIDを記載ください。
手順4:予約キャンセルページを作成
内覧予約認証エリアの「+」ボタンから新規ページを作成します。
予約キャンセルページはクリックログインページのため、認証は「あり」、クリックログインは「許可する」で設定します。
設定方法は、「ソース設定」を選択します。
予約キャンセルページはクリックログインページのため、認証は「あり」、クリックログインは「許可する」で設定します。
設定方法は、「ソース設定」を選択します。
手順5:予約キャンセルページに埋め込むエラーメッセージ用のフリーコンテンツブロックを作成
エラーメッセージ、予約キャンセルエラーメッセージブロックは、フリーコンテンツブロックで作成します。
フリーコンテンツブロックは、ソース設定で作成します。
エラーメッセージブロックHTML
エラーメッセージブロックCSS
予約キャンセルエラーメッセージブロックHTML
予約キャンセルエラーメッセージブロックCSS
HTMLの「"f0xx"」には、内覧予約DB内の対応するフィールドIDを記載ください。
フリーコンテンツブロックは、ソース設定で作成します。
エラーメッセージブロックHTML
<div class="sp-form-container"> <p><br></p> <p><br></p> <p><br></p> <p><br></p> <p><br></p> <p><br></p> <p style="text-align: center;">エラーが発生しました。</p><br> <div class="sp-record-list-card-actions"> <a th:href="|${pages['p0xxxx']?.path ?:'/404'}|">TOPページへ戻る</a> </div> <p><br></p> <p><br></p> <p><br></p> <p><br></p> <p><br></p> <p><br></p> </div>
.sp-free-content-container { font-size:16px; padding:1em; -webkit-box-sizing:border-box; box-sizing:border-box; width:100.0%; color:#333333; word-break:break-word; background-color:#ffffff; border:1.0px solid #dddddd; border-radius:0.25rem; margin:0 auto; text-align: center; } @media (min-width:768px) { .sp-free-content-container-19619 { font-size:initial; padding:3.0em; } } .sp-record-list-card-actions { width: auto; font-size:0.875rem; padding:0.5rem 0; text-align:center; text-decoration:none; flex: 1; } .sp-record-list-card-actions a { color: #ffffff; background-color: #0D60DB; border: 1.0px solid #0D60DB; border-radius: calc(12px / 1.2); /* background-color:#ffffff; */ font-size:0.875rem; padding:0.5rem 0.75rem; text-align:center; text-decoration:none; flex: 1; } .sp-form-container { font-size:16px; padding:1em; box-sizing:border-box; max-width: 960px; color:#505050; background-color:var(--base-color); border:1px solid #E1E5EB; border-radius:var(--input-radius); } .sp-form-container .sp-form-item:not(:last-child) { margin-bottom:0.5em; padding:0.5em 1em; } @media (min-width:768px) { .sp-form-container { font-size:initial; padding:3em; margin:2em auto; } .sp-form-container .sp-form-item:not(:last-child) { margin-bottom:0.5em; padding-bottom:0.5em; } } p { display: block; margin-block-start: 1em; margin-block-end: 1em; margin-inline-start: 0px; margin-inline-end: 0px; unicode-bidi: isolate; margin: 0; }
<div class="sp-form-container"> <p><br></p> <p><br></p> <p><br></p> <p><br></p> <p><br></p> <p style="text-align: center;">予約をキャンセルいたしました。</p><br> <div class="sp-record-list-card-actions"> <a th:href="|${pages['p0xxxx']?.path ?:'/404'}|">TOPページへ戻る</a> </div> <p><br></p> <p><br></p> <p><br></p> <p><br></p> <p><br></p> <p><br></p> </div>
.sp-free-content-container { font-size:16px; padding:1em; -webkit-box-sizing:border-box; box-sizing:border-box; width:100.0%; color:#333333; word-break:break-word; background-color:#ffffff; border:1.0px solid #dddddd; border-radius:0.25rem; margin:0 auto; text-align: center; } @media (min-width:768px) { .sp-free-content-container-19619 { font-size:initial; padding:3.0em; } } .sp-record-list-card-actions { width: auto; font-size:0.875rem; padding:0.5rem 0; text-align:center; text-decoration:none; flex: 1; } .sp-record-list-card-actions a { color: #ffffff; background-color: #0D60DB; border: 1.0px solid #0D60DB; border-radius: calc(12px / 1.2); /* background-color:#ffffff; */ font-size:0.875rem; padding:0.5rem 0.75rem; text-align:center; text-decoration:none; flex: 1; } .sp-form-container { font-size:16px; padding:1em; box-sizing:border-box; max-width: 960px; color:#505050; background-color:var(--base-color); border:1px solid #E1E5EB; border-radius:var(--input-radius); } .sp-form-container .sp-form-item:not(:last-child) { margin-bottom:0.5em; padding:0.5em 1em; } @media (min-width:768px) { .sp-form-container { font-size:initial; padding:3em; margin:2em auto; } .sp-form-container .sp-form-item:not(:last-child) { margin-bottom:0.5em; padding-bottom:0.5em; } }
手順6:予約キャンセルページに埋め込む予約キャンセルフォームブロックを作成
予約キャンセルフォームブロックは、更新フォームブロックで作成します。
更新フォームブロックは、ソース設定で作成します。
HTML
CSS
HTMLの「"f0xx"」には、内覧予約DB内の対応するフィールドIDを記載ください。
予約キャンセルフォームブロックでは、自動登録の設定を行っております。
更新フォームブロックは、ソース設定で作成します。
HTML
<div class="sp-form-container"> <div class="sp-step-flow-f24431"> <div class="large-setting arrow sp-clearfix"> <div class="step active" title="入力"> <span>入力</span> </div> <div class="step" title="確認"> <span>確認</span> </div> <div class="step" title="完了"> <span>完了</span> </div> </div> <div class="small-setting arrow sp-clearfix"> <div class="step active" title="入力"> <span>入力</span> </div> <div class="step" title="確認"> <span>確認</span> </div> <div class="step" title="完了"> <span>完了</span> </div> </div> </div> <div class="sp-form-item sp-form-html" th:inline="none"><p><span style="font-size: 18pt;">予約キャンセルフォーム</span></p></div> <div class="sp-form-item sp-form-html" th:inline="none">以下の予約をキャンセルいたします<br>よろしければ「予約をキャンセルする」を押してしてください</div> <!-- /* 予約日(reservationDate) */ --> <sp:input-field name="f0xx" control="ymdText"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <div class="sp-form-datetimes"> <div class="sp-form-date"> <span type="number" th:name="${fields['f0xx:year'].name}" th:text="${siteClient.record[xx].year}" th:value="${siteClient.record[xx].year}"></span> <input type="hidden" th:name="${fields['f0xx:year'].name}" th:value="${siteClient.record[xx].year}"> <span class="sp-form-date-separator">/</span> <span type="number" th:name="${fields['f0xx:month'].name}" th:text="${siteClient.record[xx].month}" th:value="${siteClient.record[xx].month}"></span> <input type="hidden" th:name="${fields['f0xx:month'].name}" th:value="${siteClient.record[xx].month}"> <span class="sp-form-date-separator">/</span> <span type="number" th:name="${fields['f0xx:day'].name}" th:text="${siteClient.record[xx].day}" th:value="${siteClient.record[xx].day}"></span> <input type="hidden" th:name="${fields['f0xx:day'].name}" th:value="${siteClient.record[xx].day}"> </div> </div> </div> </div> <!-- /* 予約時間(reservationTime) */ --> <sp:input-field name="f0xx" control="hmsText"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <div class="sp-form-datetimes"> <div class="sp-form-time"> <span type="number" th:name="${fields['f0xx'].name}" th:text="${siteClient.record[xx]}" th:value="${siteClient.record[xx]}"></span> <input type="hidden" th:name="${fields['f0xx:hour'].name}" th:value="${#maps.containsKey(inputs, 'f0xx:hour') ? inputs['f0xx:hour'] : siteClient.record[xx]?.hour}"> <input type="hidden" th:name="${fields['f0xx:minute'].name}" th:value="${#maps.containsKey(inputs, 'f0xx:minute') ? inputs['f0xx:minute'] : siteClient.record[xx]?.minute}"> <input type="hidden" th:name="${fields['f0xx:second'].name}" th:value="${#maps.containsKey(inputs, 'f0xx:second') ? inputs['f0xx:second'] : siteClient.record[xx]?.second}"> </div> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:if="${errors['f0xx'] != null}" th:text="${errors['f0xx'].message}">Error message</span> </div> </div> <div class="sp-form-item sp-form-interaction"> <button class="sp-form-prev-button" type="submit" name="action" value="previous" th:if="!${step.isFirst}" th:text="${step.prevButtonLabel}">Prev</button> <button class="sp-form-next-button" type="submit" name="action" value="next" th:text="予約をキャンセルする">Next</button> </div> </div>
:root { /*============================= カスタムプロパティ ==============================*/ --base-color: #FFFFFF; /* フォームブロックの背景色 */ --main-color: #0D60DB; /* メインカラー */ --accent-color: #B8250F; /* アクセントカラー */ --input-color: #F5F7FA; /* 入力欄の背景色 */ --input-border-color: #D3D6DB; /* 入力欄の枠線の色 */ --input-radius: 12px; /* 入力欄の角の丸さ */ --transition: 0.1s; /* アニメーション時間 */ /*------ 合計100%になるよう調整 -------*/ --label-width: 25%; /* ラベル部分の幅 */ --data-width: 75%; /* データ部分の幅 */ } .sp-form-container { font-size:16px; padding:1em; box-sizing:border-box; max-width: 960px; color:#505050; background-color:var(--base-color); border:1px solid #E1E5EB; border-radius:var(--input-radius); } .sp-form-container .sp-form-item:not(:last-child) { margin-bottom:0.5em; padding:0.5em 1em; } .sp-form-field, .sp-form-group { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:vertical; -webkit-box-direction:normal; -ms-flex-direction:column; flex-direction:column; } .sp-form-field>.sp-form-label, .sp-form-group>.sp-form-label { font-size:1.15em; font-weight:bold; padding:.25em 0; word-break:break-all; box-sizing:border-box; color:#333333; } .sp-form-group-item>.sp-form-label { word-break:break-all; display:inline-block; margin-bottom:.2em; } .sp-form-field>.sp-form-data, .sp-form-group>.sp-form-data { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:vertical; -webkit-box-direction:normal; -ms-flex-direction:column; flex-direction:column; word-break:break-all; padding:0.25em 0; box-sizing:border-box; } .sp-form-group-item>.sp-form-data { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:vertical; -webkit-box-direction:normal; -ms-flex-direction:column; flex-direction:column; } .sp-form-required { display:inline-block; margin:0 .5em; padding: 3px 6px; background:var(--accent-color); color:#ffffff; line-height:1; border-radius:.25em; font-size:0.7em; font-weight: bold; vertical-align: middle; } .sp-form-group-item:not(:last-child) { margin-bottom:.5em; } .sp-form-noted { font-size:.8em; color:#808080; word-break:break-all; margin-top:.5em; padding-left:min(calc(var(--input-radius) / 2 - 4px), 8px); } .sp-form-error { font-size:.8em; color:var(--accent-color); padding-left:min(calc(var(--input-radius) / 2 - 4px), 8px); } .sp-form-control { -moz-appearance:none; -webkit-appearance:none; -ms-progress-appearance:none; appearance:none; font-family:inherit; font-size:1em; line-height:1.5; padding:.3em .7em; padding-left:clamp(12px, calc(var(--input-radius) - 2px), 24px); background:var(--input-color); color:#333333; box-sizing:border-box; width:100%; height:48px; margin-bottom:.3em; border:none; outline:none; border-radius:var(--input-radius); box-shadow:0 0 0 0.5px var(--input-border-color); } .sp-form-control:focus { box-shadow:0 0 0 2px var(--main-color); } .sp-form-control[type="number"] { height: 36px; } .sp-form-control:placeholder-shown { color:#aaa; } .sp-form-control::placeholder { color:#aaa; } .sp-form-control::-ms-input-placeholder { color:#aaa; } .sp-form-control:-ms-input-placeholder { color:#aaa; } .sp-form-control:-moz-placeholder { color:#aaa; } textarea.sp-form-control { resize:vertical; padding-top:clamp(6px, calc(var(--input-radius) / 2), 18px); height:calc(1.5em * 5); } select.sp-form-control, option.sp-form-control { -moz-appearance:none; -webkit-appearance:none; -ms-progress-appearance:none; appearance:none; padding-right:1.5em; } .sp-form-control>option { background:#FFFFFF;} select.sp-form-control::-ms-expand { display:none; } .sp-form-phone .sp-form-control { max-width:20em; } .sp-form-phone>*:not(:only-child) { margin-right:.5rem; } .sp-form-dropdown { position:relative; } .sp-form-dropdown-icon { display:block; position:absolute; top:1.3em; right:1em; line-height:0; pointer-events:none; } .sp-form-dropdown-icon:after { content:""; display:block; border-top:0.333em solid #888; border-right:.333em solid transparent; border-left:.333em solid transparent; } .sp-form-selection { display:block; cursor: pointer; margin-bottom:.3em; padding:.25em .75em .35em; background:var(--input-color); border-radius: var(--input-radius); box-shadow:0 0 0 0.5px var(--input-border-color) ; } .sp-form-selection-label { display: inline-block; position: relative; vertical-align:middle; padding: 4px 0; } .sp-form-datetimes, .sp-form-date, .sp-form-time, .sp-form-timezone { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:horizontal; -webkit-box-direction:normal; -ms-flex-flow:row wrap; flex-flow:row wrap; -webkit-box-align:center; -ms-flex-align:center; align-items:center; } .sp-form-datetime, .sp-form-date, .sp-form-time, .sp-form-timezone { margin-right:.5rem; -ms-flex-wrap:nowrap; flex-wrap:nowrap; } .sp-form-datetime { max-width:20em; } .sp-form-phone { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:horizontal; -webkit-box-direction:normal; -ms-flex-flow:row wrap; flex-flow:row wrap; -webkit-box-align:center; -ms-flex-align:center; align-items:center; } .sp-form-date-separator { width:1em; margin-bottom: .3em; text-align:center; -ms-flex-negative:1; flex-shrink:0; } .sp-form-number { max-width:20em; } .sp-form-email-reenter, .sp-form-password-reenter { font-size:.9em; margin-bottom:.2em; padding-left:min(calc(var(--input-radius) / 2 - 4px), 8px); } .sp-form-html p { margin:0; } .sp-form-interaction { display:-webkit-box; display:-ms-flexbox; display:flex; -ms-flex-wrap:wrap; flex-wrap:wrap; margin-top:1em; } .sp-form-prev-button { color:#333333; background-color:var(--base-color); border:2.0px solid #666666; } .sp-form-next-button, .sp-form-login-button { color:#ffffff; background-color:var(--main-color); border:none; } .sp-form-field .sp-form-embedded { padding-left:.25em; } .sp-form-selection>input[type="radio"], .sp-form-selection>input[type="checkbox"] { display: none; vertical-align:middle; margin-left:0; } .sp-form-selection>input[type="radio"]+.sp-form-selection-label::before, .sp-form-selection>input[type="checkbox"]+.sp-form-selection-label::before{ display: inline-block; content:""; position: relative; box-sizing: border-box; top: 4px; margin-right: 6px; width: 20px; height: 20px; background: #ffffff; border:10px solid #ffffff; box-shadow: 0 0 0 0.5px var(--input-border-color); transition: var(--transition); } .sp-form-selection>input[type="radio"]+.sp-form-selection-label::before { border-radius: 50%; } .sp-form-selection>input[type="checkbox"]+.sp-form-selection-label::before { border-radius: min(var(--input-radius), 4px); } .sp-form-selection>input[type="radio"]:checked+.sp-form-selection-label::before{ background: var(--main-color); border:4px solid #ffffff; } .sp-form-selection>input[type="checkbox"]+.sp-form-selection-label::after{ border-right: 3px solid var(--main-color); border-bottom: 3px solid var(--main-color); content: ''; display: inline-block; width: 6px; height: 10px; left: 9px; margin-top: -7px; position: absolute; top: 50%; transform: rotate(45deg); opacity: 0; transition: var(--transition); } .sp-form-selection>input[type="checkbox"]:checked+.sp-form-selection-label::after{ left: 6px; opacity: 1; } .sp-form-date>input, .sp-form-time>input { max-width:7em; } .sp-form-date>input[type="date"]{ min-width: 140px; max-width: none; } .sp-form-time>input[type="time"] { min-width: 92px; max-width: none; } .sp-form-interaction>button { -webkit-box-flex:1; -ms-flex-positive:1; flex-grow:1; cursor:pointer; font-size:1em; font-weight:bold; line-height:1.5; margin:.5rem; padding:.75rem 0; text-align:center; -webkit-user-select:none; -moz-user-select:none; -ms-user-select:none; user-select:none; white-space:nowrap; border-radius:var(--input-radius); } @media (min-width:768px) { .sp-form-container { font-size:initial; padding:3em; margin:2em auto; } .sp-form-container .sp-form-item:not(:last-child) { margin-bottom:0.5em; padding-bottom:0.5em; } .sp-form-field, .sp-form-group { -webkit-box-orient:horizontal; -webkit-box-direction:normal; -ms-flex-flow:row nowrap; flex-flow:row nowrap; } .sp-form-field>.sp-form-label, .sp-form-group>.sp-form-label { font-size:1em; width:var(--label-width); padding:.5em; } .sp-form-group .sp-form-group-item>.sp-form-label { font-size:.9em; padding-right:.5em; } .sp-form-field>.sp-form-data, .sp-form-group>.sp-form-data { font-size:1em; width:var(--data-width); padding:.5em; } .sp-form-group>.sp-form-data { -webkit-box-orient:horizontal; -webkit-box-direction:normal; -ms-flex-flow:row wrap; flex-flow:row wrap; } .sp-form-group.sp-form-group-vertical>.sp-form-data { -webkit-box-orient:vertical; -webkit-box-direction:normal; -ms-flex-direction:column; flex-direction:column; } .sp-form-required { font-size:0.8em; } .sp-form-group-item { padding:.25em; } .sp-form-group-item:not(:last-child) { margin-bottom:0; } .sp-form-control { font-size:.9em; } .sp-form-selection { font-size:.9em; margin:0 .5em 0 0; padding-right:1em; background:none; box-shadow:none; } .sp-form-selection-vertical>.sp-form-selection { margin:0 auto 0 0; padding-right: 4em; } .sp-form-selection-vertical { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:vertical; -webkit-box-direction:normal; -ms-flex-direction:column; flex-direction:column; } .sp-form-selection-horizontal { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:horizontal; -webkit-box-direction:normal; -ms-flex-flow:row wrap; flex-flow:row wrap; } .sp-form-interaction { justify-content:center; margin-top:2em; } .sp-form-embedded { font-size:.9em; } .sp-form-group-item .sp-form-embedded { padding-right:5em; } .sp-form-selection>input[type="radio"]+.sp-form-selection-label::before, .sp-form-selection>input[type="checkbox"]+.sp-form-selection-label::before{ background: var(--input-color); border:10px solid var(--input-color); } .sp-form-selection>input[type="radio"]:hover+.sp-form-selection-label::before, .sp-form-selection>input[type="checkbox"]:hover+.sp-form-selection-label::before{ border:10px solid #dddddd; } .sp-form-selection>input[type="radio"]:checked+.sp-form-selection-label::before{ border:4px solid var(--input-color); } .sp-form-date>input[type="date"]{ min-width: unset; } .sp-form-time>input[type="time"] { min-width: unset; } .sp-form-interaction>button { -webkit-box-flex:0; -ms-flex-positive:0; flex-grow:0; padding:.75rem 5em; } } .sp-form-recaptcha { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-pack:start; -ms-flex-pack:start; justify-content:flex-start; } .sp-form-recaptcha-right { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-pack:end; -ms-flex-pack:end; justify-content:flex-end; } .sp-form-recaptcha-center { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-pack:center; -ms-flex-pack:center; justify-content:center; } .sp-form-file-button { padding:.8em 2em; font-weight: bold; cursor:pointer; color:#666666; background-color:#f6f6f6; border:none; border: solid 2px #a0a0a0; border-radius:var(--input-radius); transition: var(--transition); align-items: center; justify-content: center; } .sp-form-file-button::before{ display: inline-block; content: url('data:image/svg+xml;utf-8,<svg fill="%23666" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M14.4,7.9l-5.7,5.7c-0.4,0.4-0.8,0.6-1.2,0.8c-0.7,0.3-1.4,0.3-2.1,0.2c-0.7-0.1-1.4-0.5-1.9-1c-0.4-0.4-0.6-0.8-0.8-1.2c-0.3-0.7-0.3-1.4-0.2-2.1c0.1-0.7,0.5-1.4,1-1.9L9.7,2c0.2-0.2,0.5-0.4,0.8-0.5c0.4-0.2,0.9-0.2,1.3-0.1C12.2,1.4,12.6,1.6,13,2c0.2,0.2,0.4,0.5,0.5,0.8c0.2,0.4,0.2,0.9,0.1,1.3c-0.1,0.4-0.3,0.8-0.6,1.2l-6.2,6.2c-0.1,0.1-0.2,0.1-0.3,0.2c-0.1,0.1-0.3,0.1-0.5,0c-0.2,0-0.3-0.1-0.4-0.2c-0.1-0.1-0.1-0.2-0.2-0.3c-0.1-0.1-0.1-0.3,0-0.5c0-0.2,0.1-0.3,0.2-0.4l5.5-5.5l-0.9-0.9L4.7,9.3C4.5,9.5,4.4,9.7,4.3,10c-0.2,0.4-0.2,0.8-0.1,1.2c0.1,0.4,0.3,0.8,0.6,1.1c0.2,0.2,0.4,0.4,0.7,0.5c0.4,0.2,0.8,0.2,1.2,0.1c0.4-0.1,0.8-0.3,1.1-0.6l6.2-6.2c0.3-0.3,0.6-0.8,0.8-1.2c0.3-0.6,0.3-1.4,0.2-2c-0.1-0.7-0.5-1.3-1-1.8c-0.3-0.3-0.8-0.6-1.2-0.8c-0.6-0.3-1.4-0.3-2-0.2C10,0.2,9.3,0.5,8.8,1L2.5,7.4C2,7.9,1.6,8.5,1.4,9.1C1,10,0.9,11,1.1,11.9c0.2,1,0.6,1.9,1.4,2.6C3,15,3.5,15.4,4.1,15.6C5.1,16,6,16.1,7,15.9c1-0.2,1.9-0.6,2.6-1.4l5.7-5.7L14.4,7.9z"/></svg>'); margin-left: -0.5em; width: 16px; height: 100%; vertical-align: middle; } .sp-form-file-button:focus { outline:0; } .sp-from-file-default-drag-drop-area { color:#333333; background-color:var(--input-color); border:2.0px dashed #6c757d; border-radius:0; width:100%; height:200px; text-align:center; border-radius: var(--input-radius); } .sp-from-file-ondraghover-drag-drop-area { color:#333333; background-color:#dddddd; border:2.0px dashed #6c757d; border-radius:0; width:100%; height:200px; text-align:center; border-radius: var(--input-radius); } .sp-from-file-ondragleave-drag-drop-area { color:#333333; background-color:#dddddd; border:2.0px dashed #6c757d; border-radius:0; width:100%; height:200px; border-radius: var(--input-radius); } .sp-from-file-ondrop-drag-drop-area { color:#333333; background-color:var(--input-color); border:2.0px dashed #6c757d; border-radius:0; width:100%; height:200px; border-radius: var(--input-radius); } .sp-form-embedded>.sp-file-info:last-child { padding-bottom:0; } .sp-file-info { padding-top:1em; padding-bottom:1em; line-height:1.5; } .sp-file-info>div { width:100%; } .main-text { font-size:1em; font-weight:bold; } [class^="sp-step-flow-f"] { margin:3em 0 2em; } [class^="sp-step-flow-f"]>.large-setting { display:flex; justify-content: center; } [class^="sp-step-flow-f"]>.small-setting { display:none; } [class^="sp-step-flow-f"]>.large-setting, [class^="sp-step-flow-f"]>.small-setting { text-align: center; margin: 0 auto; padding: 0 20px; } [class^="sp-step-flow-f"]>.large-setting>.step, [class^="sp-step-flow-f"]>.small-setting>.step { word-wrap: break-word; min-width: 0; text-align:center; } [class^="sp-step-flow-f"]>.large-setting>.step { flex: 1; margin-right:36px; font-size:16px; } [class^="sp-step-flow-f"]>.small-setting>.step { font-size:14px; } [class^="sp-step-flow-f"]>.large-setting>.step:last-child, [class^="sp-step-flow-f"]>.small-setting>.step:last-child { margin-right: 0; } [class^="sp-step-flow-f"]>.large-setting>.step>span, [class^="sp-step-flow-f"]>.small-setting>.step>span { overflow: hidden; text-overflow: ellipsis; position:relative; display:block; padding-top: 16px; white-space:nowrap; color:#D3D6DB; font-weight:bold; } [class^="sp-step-flow-f"]>.large-setting>.step>span::before, [class^="sp-step-flow-f"]>.small-setting>.step>span::before { position: absolute; content: ""; display: block; top: 0; width: 100%; background: #D3D6DB; } [class^="sp-step-flow-f"]>.large-setting>.step>span::before { height: 6px; border-radius: 6px; } [class^="sp-step-flow-f"]>.small-setting>.step>span::before { height: 4px; border-radius: 4px; } [class^="sp-step-flow-f"]>.large-setting>.step.active>span, [class^="sp-step-flow-f"]>.small-setting>.step.active>span { color:var(--main-color); } [class^="sp-step-flow-f"]>.large-setting>.step.active>span::before, [class^="sp-step-flow-f"]>.small-setting>.step.active>span::before { background:var(--main-color); } @media (max-width: 765px) { [class^="sp-step-flow-f"]>.large-setting { display:none; } [class^="sp-step-flow-f"]>.small-setting { display:flex; justify-content: center; counter-reset:step; } [class^="sp-step-flow-f"]>.small-setting>.step>span { display: none; } [class^="sp-step-flow-f"]>.small-setting>.step { display: flex; align-items: center; width: auto; margin: 0; background: none; color: #ffffff; font-weight: bold; } [class^="sp-step-flow-f"]>.small-setting>.step::before { counter-increment: step 1; content: counter(step, decimal); width:24px; height:24px; background: var(--main-color); border-radius: 50%; font-size: 12px; line-height: 24px; } [class^="sp-step-flow-f"]>.small-setting>.step:not(:last-child) { flex-grow: 1; } [class^="sp-step-flow-f"]>.small-setting>.step:not(:last-child)::after { content: ""; width: calc(100% - 24px); height:2px; background: var(--main-color); vertical-align: middle; } [class^="sp-step-flow-f"]>.small-setting>.step.active::after, [class^="sp-step-flow-f"]>.small-setting>.step.active~.step::before, [class^="sp-step-flow-f"]>.small-setting>.step.active~.step::after { background:#D3D6DB; } }
予約キャンセルフォームブロックでは、自動登録の設定を行っております。
▼自動登録 設定
フィールド | 値タイプ | 値 |
---|---|---|
予約キャンセルフラグ | 固定 | キャンセルする |
手順7:予約キャンセルページに更新フォームのブロックを埋め込み
デモで設定しているソースコードは下記となります。
HTML
CSS
また、登録情報変更ページ同様、アクセス日が予約日より前の日付かチェックするPHPを記載します。
PHP
HTMLの「"record[xx]"」、PHPの「"xx"」には、内覧予約DB内の対応するフィールドIDを記載ください。
HTMLの「"fcbxxxx"」、「"ufb0xxxx"」には、ヘッダ、予約キャンセルフォームブロック、フッターのIDを記載ください。
HTML
.sp-free-content-container { font-size:16px; padding:1em; -webkit-box-sizing:border-box; box-sizing:border-box; width:100.0%; color:#333333; word-break:break-word; background-color:#ffffff; border:1.0px solid #dddddd; border-radius:0.25rem; margin:0 auto; text-align: center; } @media (min-width:768px) { .sp-free-content-container-19619 { font-size:initial; padding:3.0em; } } .sp-record-list-card-actions { width: auto; font-size:0.875rem; padding:0.5rem 0; text-align:center; text-decoration:none; flex: 1; } .sp-record-list-card-actions a { color: #ffffff; background-color: #0D60DB; border: 1.0px solid #0D60DB; border-radius: calc(12px / 1.2); /* background-color:#ffffff; */ font-size:0.875rem; padding:0.5rem 0.75rem; text-align:center; text-decoration:none; flex: 1; } .sp-form-container { font-size:16px; padding:1em; box-sizing:border-box; max-width: 960px; color:#505050; background-color:var(--base-color); border:1px solid #E1E5EB; border-radius:var(--input-radius); } .sp-form-container .sp-form-item:not(:last-child) { margin-bottom:0.5em; padding:0.5em 1em; } @media (min-width:768px) { .sp-form-container { font-size:initial; padding:3em; margin:2em auto; } .sp-form-container .sp-form-item:not(:last-child) { margin-bottom:0.5em; padding-bottom:0.5em; } }
h2 { text-align: center; } h1 { text-align: center; } .reserve_attention { display: block; text-align: center; margin: 0.5rem 0; } .url-button { width: auto; /* font-size:0.875rem; */ padding:0.5rem 0; text-align:center; text-decoration:none; flex: 1; color: #ffffff; background-color: #0D60DB; border: 1.0px solid #0D60DB; border-radius: calc(12px / 1.2); } .button-l { padding:0.5rem 6%; margin-right: 0.5rem; } .button-r { padding:0.5rem 5%; margin-left: 0.5rem; } .button { padding:0.5rem 5%; } .sp-url-button { text-align: center; width: auto; margin: 1.5rem auto; /* border: 1px solid #dddddd; */ }
PHP
<?php $today = date("Y-m-d"); $date_record = $SPIRAL->getAuthRecordByFieldId("xx"); if($today < $date_record){ $SPIRAL->setTHValue("check",1); } else{ $SPIRAL->setTHValue("check",0); } ?>
HTMLの「"fcbxxxx"」、「"ufb0xxxx"」には、ヘッダ、予約キャンセルフォームブロック、フッターのIDを記載ください。
手順8:案内後アンケート回答ページを作成
内覧予約認証エリアの「+」ボタンから新規ページを作成します。
案内後アンケート回答ページはクリックログインページのため、認証は「あり」、クリックログインは「許可する」で設定します。
設定方法は、ソース設定を選択します。
案内後アンケート回答ページはクリックログインページのため、認証は「あり」、クリックログインは「許可する」で設定します。
設定方法は、ソース設定を選択します。
手順9:案内後アンケート回答ページに埋め込む案内後アンケートフォームブロックを作成
案内後アンケートフォームは、登録フォームブロックで作成します。
登録フォームブロックは、ソース設定で作成します。
HTML
CSS
HTMLの「"f0xx"」には、内覧予約DB内の対応するフィールドIDを記載ください。
登録フォームブロックは、ソース設定で作成します。
HTML
<div class="sp-form-container"> <div class="sp-step-flow-f24431"> <div class="large-setting arrow sp-clearfix"> <div class="step active" title="入力"> <span>入力</span> </div> <div class="step" title="確認"> <span>確認</span> </div> <div class="step" title="完了"> <span>完了</span> </div> </div> <div class="small-setting arrow sp-clearfix"> <div class="step active" title="入力"> <span>入力</span> </div> <div class="step" title="確認"> <span>確認</span> </div> <div class="step" title="完了"> <span>完了</span> </div> </div> </div> <div class="sp-form-item sp-form-html" th:inline="none"><p><span style="font-size: 18pt;">案内後アンケートフォーム</span></p></div> <div class="sp-form-item sp-form-html" th:inline="none">アンケート事項をご入力の上、「確認画面へ」ボタンを押してください<br>ご意見・ご要望などありましたら、「その他」に記載をお願いいたします</div> <!--/* 物件名(propertyRef.propertyName) */--> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> 物件名 </div> <div class="sp-form-data"> <span class="sp-form-embedded" th:text="${siteClient.record[13] != null} ? (${siteClient.record[13][2]} ?: '値なし')">Example</span> </div> </div> <!--/* 来場された目的(purpose) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <div class="sp-form-dropdown"> <select class="sp-form-control" th:name="${fields['f0xx'].name}"> <option value="" th:text="${fields['f0xx'].unselectedLabel}" th:selected="${inputs['f0xx'] == null}">Select option</option> <option th:each="option : ${fields['f0xx'].options}" th:value="${option.id}" th:text="${option.label}" th:selected="${inputs['f0xx'] == #strings.toString(option.id)}">Item</option> </select> <span class="sp-form-dropdown-icon"></span> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:if="${errors['f0xx'] != null}" th:text="${errors['f0xx'].message}">Error message</span> </div> </div> <!--/* 案内は参考になりましたでしょうか・(useful) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <div class="sp-form-dropdown"> <select class="sp-form-control" th:name="${fields['f0xx'].name}"> <option value="" th:text="${fields['f0xx'].unselectedLabel}" th:selected="${inputs['f0xx'] == null}">Select option</option> <option th:each="option : ${fields['f0xx'].options}" th:value="${option.id}" th:text="${option.label}" th:selected="${inputs['f0xx'] == #strings.toString(option.id)}">Item</option> </select> <span class="sp-form-dropdown-icon"></span> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:if="${errors['f0xx'] != null}" th:text="${errors['f0xx'].message}">Error message</span> </div> </div> <!--/* 案内はいかがでしたでしょうか。(guideSatisfact) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <div class="sp-form-dropdown"> <select class="sp-form-control" th:name="${fields['f0xx'].name}"> <option value="" th:text="${fields['f0xx'].unselectedLabel}" th:selected="${inputs['f0xx'] == null}">Select option</option> <option th:each="option : ${fields['f0xx'].options}" th:value="${option.id}" th:text="${option.label}" th:selected="${inputs['f0xx'] == #strings.toString(option.id)}">Item</option> </select> <span class="sp-form-dropdown-icon"></span> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:if="${errors['f0xx'] != null}" th:text="${errors['f0xx'].message}">Error message</span> </div> </div> <!--/* 部屋はいかがでしたでしょうか。(roomSatisfact) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <div class="sp-form-dropdown"> <select class="sp-form-control" th:name="${fields['f0xx'].name}"> <option value="" th:text="${fields['f0xx'].unselectedLabel}" th:selected="${inputs['f0xx'] == null}">Select option</option> <option th:each="option : ${fields['f0xx'].options}" th:value="${option.id}" th:text="${option.label}" th:selected="${inputs['f0xx'] == #strings.toString(option.id)}">Item</option> </select> <span class="sp-form-dropdown-icon"></span> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:if="${errors['f0xx'] != null}" th:text="${errors['f0xx'].message}">Error message</span> </div> </div> <!--/* 参照_物件マスタ(propertyRef) */--> <sp:input-field name="f0xx"></sp:input-field> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> <!-- </div> --> <div class="sp-form-data"> <input type="hidden" class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:value="${siteClient.record[17]}"> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:if="${errors['f0xx'] != null}" th:text="${errors['f0xx'].message}">Error message</span> </div> <!-- </div> --> <div class="sp-form-item sp-form-field" th:if="${fields['f0xx'].isTemporary}"> <div class="sp-form-label"> Label </th:block> --> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <input type="text" class="sp-form-control" th:name="${fields['f0xx'].collationName}" th:placeholder="${fields['f0xx'].placeholder.collation}" th:value="${inputs['f0xx_collation']}"> <span class="sp-form-error" th:if="${errors['f0xx_collation'] != null}" th:text="${errors['f0xx_collation'].message}">Error message</span> </div> </div> <!--/* その他(comment) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <textarea class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:text="${inputs['f0xx']}"></textarea> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:if="${errors['f0xx'] != null}" th:text="${errors['f0xx'].message}">Error message</span> </div> </div> <div class="sp-form-item sp-form-interaction"> <button class="sp-form-prev-button" type="submit" name="action" value="previous" th:if="!${step.isFirst}" th:text="${step.prevButtonLabel}">Prev</button> <button class="sp-form-next-button" type="submit" name="action" value="next" th:text="${step.nextButtonLabel}">Next</button> </div> </div>
:root { /*============================= カスタムプロパティ ==============================*/ --base-color: #FFFFFF; /* フォームブロックの背景色 */ --main-color: #0D60DB; /* メインカラー */ --accent-color: #B8250F; /* アクセントカラー */ --input-color: #F5F7FA; /* 入力欄の背景色 */ --input-border-color: #D3D6DB; /* 入力欄の枠線の色 */ --input-radius: 12px; /* 入力欄の角の丸さ */ --transition: 0.1s; /* アニメーション時間 */ /*------ 合計100%になるよう調整 -------*/ --label-width: 25%; /* ラベル部分の幅 */ --data-width: 75%; /* データ部分の幅 */ } .sp-record-list-card-actions { width: auto; font-size:0.875rem; padding:0.5rem 0; text-align:center; text-decoration:none; flex: 1; } .sp-record-list-card-actions a { color: #ffffff; background-color: #0D60DB; border: 1.0px solid #0D60DB; border-radius: calc(12px / 1.2); /* background-color:#ffffff; */ font-size:0.875rem; padding:0.5rem 0.75rem; text-align:center; text-decoration:none; flex: 1; } .sp-form-container { font-size:16px; padding:1em; box-sizing:border-box; max-width: 960px; color:#505050; background-color:var(--base-color); border:1px solid #E1E5EB; border-radius:var(--input-radius); } .sp-form-container .sp-form-item:not(:last-child) { margin-bottom:0.5em; padding:0.5em 1em; } .sp-form-field, .sp-form-group { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:vertical; -webkit-box-direction:normal; -ms-flex-direction:column; flex-direction:column; } .sp-form-field>.sp-form-label, .sp-form-group>.sp-form-label { font-size:1.15em; font-weight:bold; padding:.25em 0; word-break:break-all; box-sizing:border-box; color:#333333; } .sp-form-group-item>.sp-form-label { word-break:break-all; display:inline-block; margin-bottom:.2em; } .sp-form-field>.sp-form-data, .sp-form-group>.sp-form-data { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:vertical; -webkit-box-direction:normal; -ms-flex-direction:column; flex-direction:column; word-break:break-all; padding:0.25em 0; box-sizing:border-box; } .sp-form-group-item>.sp-form-data { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:vertical; -webkit-box-direction:normal; -ms-flex-direction:column; flex-direction:column; } .sp-form-required { display:inline-block; margin:0 .5em; padding: 3px 6px; background:var(--accent-color); color:#ffffff; line-height:1; border-radius:.25em; font-size:0.7em; font-weight: bold; vertical-align: middle; } .sp-form-group-item:not(:last-child) { margin-bottom:.5em; } .sp-form-noted { font-size:.8em; color:#808080; word-break:break-all; margin-top:.5em; padding-left:min(calc(var(--input-radius) / 2 - 4px), 8px); } .sp-form-error { font-size:.8em; color:var(--accent-color); padding-left:min(calc(var(--input-radius) / 2 - 4px), 8px); } .sp-form-control { -moz-appearance:none; -webkit-appearance:none; -ms-progress-appearance:none; appearance:none; font-family:inherit; font-size:1em; line-height:1.5; padding:.3em .7em; padding-left:clamp(12px, calc(var(--input-radius) - 2px), 24px); background:var(--input-color); color:#333333; box-sizing:border-box; width:100%; height:48px; margin-bottom:.3em; border:none; outline:none; border-radius:var(--input-radius); box-shadow:0 0 0 0.5px var(--input-border-color); } .sp-form-control:focus { box-shadow:0 0 0 2px var(--main-color); } .sp-form-control[type="number"] { height: 36px; } .sp-form-control:placeholder-shown { color:#aaa; } .sp-form-control::placeholder { color:#aaa; } .sp-form-control::-ms-input-placeholder { color:#aaa; } .sp-form-control:-ms-input-placeholder { color:#aaa; } .sp-form-control:-moz-placeholder { color:#aaa; } textarea.sp-form-control { resize:vertical; padding-top:clamp(6px, calc(var(--input-radius) / 2), 18px); height:calc(1.5em * 5); } select.sp-form-control, option.sp-form-control { -moz-appearance:none; -webkit-appearance:none; -ms-progress-appearance:none; appearance:none; padding-right:1.5em; } .sp-form-control>option { background:#FFFFFF;} select.sp-form-control::-ms-expand { display:none; } .sp-form-phone .sp-form-control { max-width:20em; } .sp-form-phone>*:not(:only-child) { margin-right:.5rem; } .sp-form-dropdown { position:relative; } .sp-form-dropdown-icon { display:block; position:absolute; top:1.3em; right:1em; line-height:0; pointer-events:none; } .sp-form-dropdown-icon:after { content:""; display:block; border-top:0.333em solid #888; border-right:.333em solid transparent; border-left:.333em solid transparent; } .sp-form-selection { display:block; cursor: pointer; margin-bottom:.3em; padding:.25em .75em .35em; background:var(--input-color); border-radius: var(--input-radius); box-shadow:0 0 0 0.5px var(--input-border-color) ; } .sp-form-selection-label { display: inline-block; position: relative; vertical-align:middle; padding: 4px 0; } .sp-form-datetimes, .sp-form-date, .sp-form-time, .sp-form-timezone { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:horizontal; -webkit-box-direction:normal; -ms-flex-flow:row wrap; flex-flow:row wrap; -webkit-box-align:center; -ms-flex-align:center; align-items:center; } .sp-form-datetime, .sp-form-date, .sp-form-time, .sp-form-timezone { margin-right:.5rem; -ms-flex-wrap:nowrap; flex-wrap:nowrap; } .sp-form-datetime { max-width:20em; } .sp-form-phone { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:horizontal; -webkit-box-direction:normal; -ms-flex-flow:row wrap; flex-flow:row wrap; -webkit-box-align:center; -ms-flex-align:center; align-items:center; } .sp-form-date-separator { width:1em; margin-bottom: .3em; text-align:center; -ms-flex-negative:1; flex-shrink:0; } .sp-form-number { max-width:20em; } .sp-form-email-reenter, .sp-form-password-reenter { font-size:.9em; margin-bottom:.2em; padding-left:min(calc(var(--input-radius) / 2 - 4px), 8px); } .sp-form-html p { margin:0; } .sp-form-interaction { display:-webkit-box; display:-ms-flexbox; display:flex; -ms-flex-wrap:wrap; flex-wrap:wrap; margin-top:1em; } .sp-form-prev-button { color:#333333; background-color:var(--base-color); border:2.0px solid #666666; } .sp-form-next-button, .sp-form-login-button { color:#ffffff; background-color:var(--main-color); border:none; } .sp-form-field .sp-form-embedded { padding-left:.25em; } .sp-form-selection>input[type="radio"], .sp-form-selection>input[type="checkbox"] { display: none; vertical-align:middle; margin-left:0; } .sp-form-selection>input[type="radio"]+.sp-form-selection-label::before, .sp-form-selection>input[type="checkbox"]+.sp-form-selection-label::before{ display: inline-block; content:""; position: relative; box-sizing: border-box; top: 4px; margin-right: 6px; width: 20px; height: 20px; background: #ffffff; border:10px solid #ffffff; box-shadow: 0 0 0 0.5px var(--input-border-color); transition: var(--transition); } .sp-form-selection>input[type="radio"]+.sp-form-selection-label::before { border-radius: 50%; } .sp-form-selection>input[type="checkbox"]+.sp-form-selection-label::before { border-radius: min(var(--input-radius), 4px); } .sp-form-selection>input[type="radio"]:checked+.sp-form-selection-label::before{ background: var(--main-color); border:4px solid #ffffff; } .sp-form-selection>input[type="checkbox"]+.sp-form-selection-label::after{ border-right: 3px solid var(--main-color); border-bottom: 3px solid var(--main-color); content: ''; display: inline-block; width: 6px; height: 10px; left: 9px; margin-top: -7px; position: absolute; top: 50%; transform: rotate(45deg); opacity: 0; transition: var(--transition); } .sp-form-selection>input[type="checkbox"]:checked+.sp-form-selection-label::after{ left: 6px; opacity: 1; } .sp-form-date>input, .sp-form-time>input { max-width:7em; } .sp-form-date>input[type="date"]{ min-width: 140px; max-width: none; } .sp-form-time>input[type="time"] { min-width: 92px; max-width: none; } .sp-form-interaction>button { -webkit-box-flex:1; -ms-flex-positive:1; flex-grow:1; cursor:pointer; font-size:1em; font-weight:bold; line-height:1.5; margin:.5rem; padding:.75rem 0; text-align:center; -webkit-user-select:none; -moz-user-select:none; -ms-user-select:none; user-select:none; white-space:nowrap; border-radius:var(--input-radius); } @media (min-width:768px) { .sp-form-container { font-size:initial; padding:3em; margin:2em auto; } .sp-form-container .sp-form-item:not(:last-child) { margin-bottom:0.5em; padding-bottom:0.5em; } .sp-form-field, .sp-form-group { -webkit-box-orient:horizontal; -webkit-box-direction:normal; -ms-flex-flow:row nowrap; flex-flow:row nowrap; } .sp-form-field>.sp-form-label, .sp-form-group>.sp-form-label { font-size:1em; width:var(--label-width); padding:.5em; } .sp-form-group .sp-form-group-item>.sp-form-label { font-size:.9em; padding-right:.5em; } .sp-form-field>.sp-form-data, .sp-form-group>.sp-form-data { font-size:1em; width:var(--data-width); padding:.5em; } .sp-form-group>.sp-form-data { -webkit-box-orient:horizontal; -webkit-box-direction:normal; -ms-flex-flow:row wrap; flex-flow:row wrap; } .sp-form-group.sp-form-group-vertical>.sp-form-data { -webkit-box-orient:vertical; -webkit-box-direction:normal; -ms-flex-direction:column; flex-direction:column; } .sp-form-required { font-size:0.8em; } .sp-form-group-item { padding:.25em; } .sp-form-group-item:not(:last-child) { margin-bottom:0; } .sp-form-control { font-size:.9em; } .sp-form-selection { font-size:.9em; margin:0 .5em 0 0; padding-right:1em; background:none; box-shadow:none; } .sp-form-selection-vertical>.sp-form-selection { margin:0 auto 0 0; padding-right: 4em; } .sp-form-selection-vertical { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:vertical; -webkit-box-direction:normal; -ms-flex-direction:column; flex-direction:column; } .sp-form-selection-horizontal { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:horizontal; -webkit-box-direction:normal; -ms-flex-flow:row wrap; flex-flow:row wrap; } .sp-form-interaction { justify-content:center; margin-top:2em; } .sp-form-embedded { font-size:.9em; } .sp-form-group-item .sp-form-embedded { padding-right:5em; } .sp-form-selection>input[type="radio"]+.sp-form-selection-label::before, .sp-form-selection>input[type="checkbox"]+.sp-form-selection-label::before{ background: var(--input-color); border:10px solid var(--input-color); } .sp-form-selection>input[type="radio"]:hover+.sp-form-selection-label::before, .sp-form-selection>input[type="checkbox"]:hover+.sp-form-selection-label::before{ border:10px solid #dddddd; } .sp-form-selection>input[type="radio"]:checked+.sp-form-selection-label::before{ border:4px solid var(--input-color); } .sp-form-date>input[type="date"]{ min-width: unset; } .sp-form-time>input[type="time"] { min-width: unset; } .sp-form-interaction>button { -webkit-box-flex:0; -ms-flex-positive:0; flex-grow:0; padding:.75rem 5em; } } .sp-form-recaptcha { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-pack:start; -ms-flex-pack:start; justify-content:flex-start; } .sp-form-recaptcha-right { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-pack:end; -ms-flex-pack:end; justify-content:flex-end; } .sp-form-recaptcha-center { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-pack:center; -ms-flex-pack:center; justify-content:center; } .sp-form-file-button { padding:.8em 2em; font-weight: bold; cursor:pointer; color:#666666; background-color:#f6f6f6; border:none; border: solid 2px #a0a0a0; border-radius:var(--input-radius); transition: var(--transition); align-items: center; justify-content: center; } .sp-form-file-button::before{ display: inline-block; content: url('data:image/svg+xml;utf-8,<svg fill="%23666" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M14.4,7.9l-5.7,5.7c-0.4,0.4-0.8,0.6-1.2,0.8c-0.7,0.3-1.4,0.3-2.1,0.2c-0.7-0.1-1.4-0.5-1.9-1c-0.4-0.4-0.6-0.8-0.8-1.2c-0.3-0.7-0.3-1.4-0.2-2.1c0.1-0.7,0.5-1.4,1-1.9L9.7,2c0.2-0.2,0.5-0.4,0.8-0.5c0.4-0.2,0.9-0.2,1.3-0.1C12.2,1.4,12.6,1.6,13,2c0.2,0.2,0.4,0.5,0.5,0.8c0.2,0.4,0.2,0.9,0.1,1.3c-0.1,0.4-0.3,0.8-0.6,1.2l-6.2,6.2c-0.1,0.1-0.2,0.1-0.3,0.2c-0.1,0.1-0.3,0.1-0.5,0c-0.2,0-0.3-0.1-0.4-0.2c-0.1-0.1-0.1-0.2-0.2-0.3c-0.1-0.1-0.1-0.3,0-0.5c0-0.2,0.1-0.3,0.2-0.4l5.5-5.5l-0.9-0.9L4.7,9.3C4.5,9.5,4.4,9.7,4.3,10c-0.2,0.4-0.2,0.8-0.1,1.2c0.1,0.4,0.3,0.8,0.6,1.1c0.2,0.2,0.4,0.4,0.7,0.5c0.4,0.2,0.8,0.2,1.2,0.1c0.4-0.1,0.8-0.3,1.1-0.6l6.2-6.2c0.3-0.3,0.6-0.8,0.8-1.2c0.3-0.6,0.3-1.4,0.2-2c-0.1-0.7-0.5-1.3-1-1.8c-0.3-0.3-0.8-0.6-1.2-0.8c-0.6-0.3-1.4-0.3-2-0.2C10,0.2,9.3,0.5,8.8,1L2.5,7.4C2,7.9,1.6,8.5,1.4,9.1C1,10,0.9,11,1.1,11.9c0.2,1,0.6,1.9,1.4,2.6C3,15,3.5,15.4,4.1,15.6C5.1,16,6,16.1,7,15.9c1-0.2,1.9-0.6,2.6-1.4l5.7-5.7L14.4,7.9z"/></svg>'); margin-left: -0.5em; width: 16px; height: 100%; vertical-align: middle; } .sp-form-file-button:focus { outline:0; } .sp-from-file-default-drag-drop-area { color:#333333; background-color:var(--input-color); border:2.0px dashed #6c757d; border-radius:0; width:100%; height:200px; text-align:center; border-radius: var(--input-radius); } .sp-from-file-ondraghover-drag-drop-area { color:#333333; background-color:#dddddd; border:2.0px dashed #6c757d; border-radius:0; width:100%; height:200px; text-align:center; border-radius: var(--input-radius); } .sp-from-file-ondragleave-drag-drop-area { color:#333333; background-color:#dddddd; border:2.0px dashed #6c757d; border-radius:0; width:100%; height:200px; border-radius: var(--input-radius); } .sp-from-file-ondrop-drag-drop-area { color:#333333; background-color:var(--input-color); border:2.0px dashed #6c757d; border-radius:0; width:100%; height:200px; border-radius: var(--input-radius); } .sp-form-embedded>.sp-file-info:last-child { padding-bottom:0; } .sp-file-info { padding-top:1em; padding-bottom:1em; line-height:1.5; } .sp-file-info>div { width:100%; } .main-text { font-size:1em; font-weight:bold; } [class^="sp-step-flow-f"] { margin:3em 0 2em; } [class^="sp-step-flow-f"]>.large-setting { display:flex; justify-content: center; } [class^="sp-step-flow-f"]>.small-setting { display:none; } [class^="sp-step-flow-f"]>.large-setting, [class^="sp-step-flow-f"]>.small-setting { text-align: center; margin: 0 auto; padding: 0 20px; } [class^="sp-step-flow-f"]>.large-setting>.step, [class^="sp-step-flow-f"]>.small-setting>.step { word-wrap: break-word; min-width: 0; text-align:center; } [class^="sp-step-flow-f"]>.large-setting>.step { flex: 1; margin-right:36px; font-size:16px; } [class^="sp-step-flow-f"]>.small-setting>.step { font-size:14px; } [class^="sp-step-flow-f"]>.large-setting>.step:last-child, [class^="sp-step-flow-f"]>.small-setting>.step:last-child { margin-right: 0; } [class^="sp-step-flow-f"]>.large-setting>.step>span, [class^="sp-step-flow-f"]>.small-setting>.step>span { overflow: hidden; text-overflow: ellipsis; position:relative; display:block; padding-top: 16px; white-space:nowrap; color:#D3D6DB; font-weight:bold; } [class^="sp-step-flow-f"]>.large-setting>.step>span::before, [class^="sp-step-flow-f"]>.small-setting>.step>span::before { position: absolute; content: ""; display: block; top: 0; width: 100%; background: #D3D6DB; } [class^="sp-step-flow-f"]>.large-setting>.step>span::before { height: 6px; border-radius: 6px; } [class^="sp-step-flow-f"]>.small-setting>.step>span::before { height: 4px; border-radius: 4px; } [class^="sp-step-flow-f"]>.large-setting>.step.active>span, [class^="sp-step-flow-f"]>.small-setting>.step.active>span { color:var(--main-color); } [class^="sp-step-flow-f"]>.large-setting>.step.active>span::before, [class^="sp-step-flow-f"]>.small-setting>.step.active>span::before { background:var(--main-color); } @media (max-width: 765px) { [class^="sp-step-flow-f"]>.large-setting { display:none; } [class^="sp-step-flow-f"]>.small-setting { display:flex; justify-content: center; counter-reset:step; } [class^="sp-step-flow-f"]>.small-setting>.step>span { display: none; } [class^="sp-step-flow-f"]>.small-setting>.step { display: flex; align-items: center; width: auto; margin: 0; background: none; color: #ffffff; font-weight: bold; } [class^="sp-step-flow-f"]>.small-setting>.step::before { counter-increment: step 1; content: counter(step, decimal); width:24px; height:24px; background: var(--main-color); border-radius: 50%; font-size: 12px; line-height: 24px; } [class^="sp-step-flow-f"]>.small-setting>.step:not(:last-child) { flex-grow: 1; } [class^="sp-step-flow-f"]>.small-setting>.step:not(:last-child)::after { content: ""; width: calc(100% - 24px); height:2px; background: var(--main-color); vertical-align: middle; } [class^="sp-step-flow-f"]>.small-setting>.step.active::after, [class^="sp-step-flow-f"]>.small-setting>.step.active~.step::before, [class^="sp-step-flow-f"]>.small-setting>.step.active~.step::after { background:#D3D6DB; } }
手順10:案内後アンケート回答ページに更新フォームのブロックを埋め込み
デモで設定しているソースコードは下記となります。
HTML
CSS
HTMLの「"fcbxxxx"」、「"ifbxxxx"」には、それぞれヘッダ、案内後アンケートフォームブロック、フッターのIDを記載ください。
HTML
<!-- ヘッダ --> <sp:block name="fcb0xxxx"></sp:block> <!-- 案内後アンケートフォーム --> <h2>案内後アンケート</h2> <sp:block name="ifb0xxxx"></sp:block> <!-- フッター --> <sp:block name="fcb0xxxx"></sp:block>
h2 { text-align: center; } h1 { text-align: center; } .reserve_attention { display: block; text-align: center; margin: 0.5rem 0; } .url-button { width: auto; /* font-size:0.875rem; */ padding:0.5rem 0; text-align:center; text-decoration:none; flex: 1; color: #ffffff; background-color: #0D60DB; border: 1.0px solid #0D60DB; border-radius: calc(12px / 1.2); } .button-l { padding:0.5rem 6%; margin-right: 0.5rem; } .button-r { padding:0.5rem 5%; margin-left: 0.5rem; } .button { padding:0.5rem 5%; } .sp-url-button { text-align: center; width: auto; margin: 1.5rem auto; /* border: 1px solid #dddddd; */ }
手順11:検討状況アンケートページを作成
内覧予約認証エリアの「+」ボタンから新規ページを作成します。
検討状況アンケートページはクリックログインページのため、認証は「あり」、クリックログインは「許可する」で設定します。
設定方法は、ソース設定を選択します。
検討状況アンケートページはクリックログインページのため、認証は「あり」、クリックログインは「許可する」で設定します。
設定方法は、ソース設定を選択します。
手順12:検討状況アンケートページに埋め込む検討状況アンケート回答フォームを作成
検討状況アンケート回答フォームは、更新フォームブロックで作成します。
更新フォームブロックは、ソース設定で作成します。
HTML
CSS
HTMLの「"f0xx"」には、内覧予約DB内の対応するフィールドIDを記載ください。
更新フォームブロックは、ソース設定で作成します。
HTML
<div class="sp-form-container"> <div class="sp-step-flow-f24431"> <div class="large-setting arrow sp-clearfix"> <div class="step active" title="入力"> <span>入力</span> </div> <div class="step" title="確認"> <span>確認</span> </div> <div class="step" title="完了"> <span>完了</span> </div> </div> <div class="small-setting arrow sp-clearfix"> <div class="step active" title="入力"> <span>入力</span> </div> <div class="step" title="確認"> <span>確認</span> </div> <div class="step" title="完了"> <span>完了</span> </div> </div> </div> <div class="sp-form-item sp-form-html" th:inline="none"><p><span style="font-size: 18pt;">検討状況アンケート回答フォーム</span></p></div> <div class="sp-form-item sp-form-html" th:inline="none">先日内覧いただきました物件の検討状況をご入力の上、「確認画面へ」ボタンを押してください<br> 「検討理由」には検討をしていただいております理由を、<br>「検討備考欄」には知りたい情報や求めるプランなどをご入力ください</div> <!--/* 検討状況(consideStatus) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <div class="sp-form-dropdown"> <select class="sp-form-control" th:name="${fields['f0xx'].name}"> <option value="" th:text="${fields['f0xx'].unselectedLabel}" th:selected="${inputs['f0xx'] == null}">Select option</option> <option th:each="option : ${fields['f0xx'].options}" th:value="${option.id}" th:text="${option.label}" th:selected="${inputs['f0xx'] == #strings.toString(option.id)}">Item</option> </select> <span class="sp-form-dropdown-icon"></span> </div> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:if="${errors['f0xx'] != null}" th:text="${errors['f0xx'].message}">Error message</span> </div> </div> <!--/* 検討理由(consideReason) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <textarea class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:text="${#maps.containsKey(inputs, 'f0xx') ? inputs['f0xx'] : siteClient.record[24]}"></textarea> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:if="${errors['f0xx'] != null}" th:text="${errors['f0xx'].message}">Error message</span> </div> </div> <!--/* 検討備考欄(consideRemarks) */--> <sp:input-field name="f0xx"></sp:input-field> <div class="sp-form-item sp-form-field"> <div class="sp-form-label"> <th:block th:text="${fields['f0xx'].label}"> Label </th:block> <span class="sp-form-required" th:if="${fields['f0xx'].required}" th:text="${fields['f0xx'].requiredIndicator}">*</span> </div> <div class="sp-form-data"> <textarea class="sp-form-control" th:name="${fields['f0xx'].name}" th:placeholder="${fields['f0xx'].placeholder}" th:text="${#maps.containsKey(inputs, 'f0xx') ? inputs['f0xx'] : siteClient.record[25]}"></textarea> <span class="sp-form-noted" th:if="${fields['f0xx'].help != null}" th:text="${fields['f0xx'].help}">Help text</span> <span class="sp-form-error" th:if="${errors['f0xx'] != null}" th:text="${errors['f0xx'].message}">Error message</span> </div> </div> <div class="sp-form-item sp-form-interaction"> <button class="sp-form-prev-button" type="submit" name="action" value="previous" th:if="!${step.isFirst}" th:text="${step.prevButtonLabel}">Prev</button> <button class="sp-form-next-button" type="submit" name="action" value="next" th:text="${step.nextButtonLabel}">Next</button> </div> </div>
:root { /*============================= カスタムプロパティ ==============================*/ --base-color: #FFFFFF; /* フォームブロックの背景色 */ --main-color: #0D60DB; /* メインカラー */ --accent-color: #B8250F; /* アクセントカラー */ --input-color: #F5F7FA; /* 入力欄の背景色 */ --input-border-color: #D3D6DB; /* 入力欄の枠線の色 */ --input-radius: 12px; /* 入力欄の角の丸さ */ --transition: 0.1s; /* アニメーション時間 */ /*------ 合計100%になるよう調整 -------*/ --label-width: 25%; /* ラベル部分の幅 */ --data-width: 75%; /* データ部分の幅 */ } .sp-form-container { font-size:16px; padding:1em; box-sizing:border-box; max-width: 960px; color:#505050; background-color:var(--base-color); border:1px solid #E1E5EB; border-radius:var(--input-radius); } .sp-form-container .sp-form-item:not(:last-child) { margin-bottom:0.5em; padding:0.5em 1em; } .sp-form-field, .sp-form-group { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:vertical; -webkit-box-direction:normal; -ms-flex-direction:column; flex-direction:column; } .sp-form-field>.sp-form-label, .sp-form-group>.sp-form-label { font-size:1.15em; font-weight:bold; padding:.25em 0; word-break:break-all; box-sizing:border-box; color:#333333; } .sp-form-group-item>.sp-form-label { word-break:break-all; display:inline-block; margin-bottom:.2em; } .sp-form-field>.sp-form-data, .sp-form-group>.sp-form-data { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:vertical; -webkit-box-direction:normal; -ms-flex-direction:column; flex-direction:column; word-break:break-all; padding:0.25em 0; box-sizing:border-box; } .sp-form-group-item>.sp-form-data { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:vertical; -webkit-box-direction:normal; -ms-flex-direction:column; flex-direction:column; } .sp-form-required { display:inline-block; margin:0 .5em; padding: 3px 6px; background:var(--accent-color); color:#ffffff; line-height:1; border-radius:.25em; font-size:0.7em; font-weight: bold; vertical-align: middle; } .sp-form-group-item:not(:last-child) { margin-bottom:.5em; } .sp-form-noted { font-size:.8em; color:#808080; word-break:break-all; margin-top:.5em; padding-left:min(calc(var(--input-radius) / 2 - 4px), 8px); } .sp-form-error { font-size:.8em; color:var(--accent-color); padding-left:min(calc(var(--input-radius) / 2 - 4px), 8px); } .sp-form-control { -moz-appearance:none; -webkit-appearance:none; -ms-progress-appearance:none; appearance:none; font-family:inherit; font-size:1em; line-height:1.5; padding:.3em .7em; padding-left:clamp(12px, calc(var(--input-radius) - 2px), 24px); background:var(--input-color); color:#333333; box-sizing:border-box; width:100%; height:48px; margin-bottom:.3em; border:none; outline:none; border-radius:var(--input-radius); box-shadow:0 0 0 0.5px var(--input-border-color); } .sp-form-control:focus { box-shadow:0 0 0 2px var(--main-color); } .sp-form-control[type="number"] { height: 36px; } .sp-form-control:placeholder-shown { color:#aaa; } .sp-form-control::placeholder { color:#aaa; } .sp-form-control::-ms-input-placeholder { color:#aaa; } .sp-form-control:-ms-input-placeholder { color:#aaa; } .sp-form-control:-moz-placeholder { color:#aaa; } textarea.sp-form-control { resize:vertical; padding-top:clamp(6px, calc(var(--input-radius) / 2), 18px); height:calc(1.5em * 5); } select.sp-form-control, option.sp-form-control { -moz-appearance:none; -webkit-appearance:none; -ms-progress-appearance:none; appearance:none; padding-right:1.5em; } .sp-form-control>option { background:#FFFFFF;} select.sp-form-control::-ms-expand { display:none; } .sp-form-phone .sp-form-control { max-width:20em; } .sp-form-phone>*:not(:only-child) { margin-right:.5rem; } .sp-form-dropdown { position:relative; } .sp-form-dropdown-icon { display:block; position:absolute; top:1.3em; right:1em; line-height:0; pointer-events:none; } .sp-form-dropdown-icon:after { content:""; display:block; border-top:0.333em solid #888; border-right:.333em solid transparent; border-left:.333em solid transparent; } .sp-form-selection { display:block; cursor: pointer; margin-bottom:.3em; padding:.25em .75em .35em; background:var(--input-color); border-radius: var(--input-radius); box-shadow:0 0 0 0.5px var(--input-border-color) ; } .sp-form-selection-label { display: inline-block; position: relative; vertical-align:middle; padding: 4px 0; } .sp-form-datetimes, .sp-form-date, .sp-form-time, .sp-form-timezone { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:horizontal; -webkit-box-direction:normal; -ms-flex-flow:row wrap; flex-flow:row wrap; -webkit-box-align:center; -ms-flex-align:center; align-items:center; } .sp-form-datetime, .sp-form-date, .sp-form-time, .sp-form-timezone { margin-right:.5rem; -ms-flex-wrap:nowrap; flex-wrap:nowrap; } .sp-form-datetime { max-width:20em; } .sp-form-phone { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:horizontal; -webkit-box-direction:normal; -ms-flex-flow:row wrap; flex-flow:row wrap; -webkit-box-align:center; -ms-flex-align:center; align-items:center; } .sp-form-date-separator { width:1em; margin-bottom: .3em; text-align:center; -ms-flex-negative:1; flex-shrink:0; } .sp-form-number { max-width:20em; } .sp-form-email-reenter, .sp-form-password-reenter { font-size:.9em; margin-bottom:.2em; padding-left:min(calc(var(--input-radius) / 2 - 4px), 8px); } .sp-form-html p { margin:0; } .sp-form-interaction { display:-webkit-box; display:-ms-flexbox; display:flex; -ms-flex-wrap:wrap; flex-wrap:wrap; margin-top:1em; } .sp-form-prev-button { color:#333333; background-color:var(--base-color); border:2.0px solid #666666; } .sp-form-next-button, .sp-form-login-button { color:#ffffff; background-color:var(--main-color); border:none; } .sp-form-field .sp-form-embedded { padding-left:.25em; } .sp-form-selection>input[type="radio"], .sp-form-selection>input[type="checkbox"] { display: none; vertical-align:middle; margin-left:0; } .sp-form-selection>input[type="radio"]+.sp-form-selection-label::before, .sp-form-selection>input[type="checkbox"]+.sp-form-selection-label::before{ display: inline-block; content:""; position: relative; box-sizing: border-box; top: 4px; margin-right: 6px; width: 20px; height: 20px; background: #ffffff; border:10px solid #ffffff; box-shadow: 0 0 0 0.5px var(--input-border-color); transition: var(--transition); } .sp-form-selection>input[type="radio"]+.sp-form-selection-label::before { border-radius: 50%; } .sp-form-selection>input[type="checkbox"]+.sp-form-selection-label::before { border-radius: min(var(--input-radius), 4px); } .sp-form-selection>input[type="radio"]:checked+.sp-form-selection-label::before{ background: var(--main-color); border:4px solid #ffffff; } .sp-form-selection>input[type="checkbox"]+.sp-form-selection-label::after{ border-right: 3px solid var(--main-color); border-bottom: 3px solid var(--main-color); content: ''; display: inline-block; width: 6px; height: 10px; left: 9px; margin-top: -7px; position: absolute; top: 50%; transform: rotate(45deg); opacity: 0; transition: var(--transition); } .sp-form-selection>input[type="checkbox"]:checked+.sp-form-selection-label::after{ left: 6px; opacity: 1; } .sp-form-date>input, .sp-form-time>input { max-width:7em; } .sp-form-date>input[type="date"]{ min-width: 140px; max-width: none; } .sp-form-time>input[type="time"] { min-width: 92px; max-width: none; } .sp-form-interaction>button { -webkit-box-flex:1; -ms-flex-positive:1; flex-grow:1; cursor:pointer; font-size:1em; font-weight:bold; line-height:1.5; margin:.5rem; padding:.75rem 0; text-align:center; -webkit-user-select:none; -moz-user-select:none; -ms-user-select:none; user-select:none; white-space:nowrap; border-radius:var(--input-radius); } @media (min-width:768px) { .sp-form-container { font-size:initial; padding:3em; margin:2em auto; } .sp-form-container .sp-form-item:not(:last-child) { margin-bottom:0.5em; padding-bottom:0.5em; } .sp-form-field, .sp-form-group { -webkit-box-orient:horizontal; -webkit-box-direction:normal; -ms-flex-flow:row nowrap; flex-flow:row nowrap; } .sp-form-field>.sp-form-label, .sp-form-group>.sp-form-label { font-size:1em; width:var(--label-width); padding:.5em; } .sp-form-group .sp-form-group-item>.sp-form-label { font-size:.9em; padding-right:.5em; } .sp-form-field>.sp-form-data, .sp-form-group>.sp-form-data { font-size:1em; width:var(--data-width); padding:.5em; } .sp-form-group>.sp-form-data { -webkit-box-orient:horizontal; -webkit-box-direction:normal; -ms-flex-flow:row wrap; flex-flow:row wrap; } .sp-form-group.sp-form-group-vertical>.sp-form-data { -webkit-box-orient:vertical; -webkit-box-direction:normal; -ms-flex-direction:column; flex-direction:column; } .sp-form-required { font-size:0.8em; } .sp-form-group-item { padding:.25em; } .sp-form-group-item:not(:last-child) { margin-bottom:0; } .sp-form-control { font-size:.9em; } .sp-form-selection { font-size:.9em; margin:0 .5em 0 0; padding-right:1em; background:none; box-shadow:none; } .sp-form-selection-vertical>.sp-form-selection { margin:0 auto 0 0; padding-right: 4em; } .sp-form-selection-vertical { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:vertical; -webkit-box-direction:normal; -ms-flex-direction:column; flex-direction:column; } .sp-form-selection-horizontal { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-orient:horizontal; -webkit-box-direction:normal; -ms-flex-flow:row wrap; flex-flow:row wrap; } .sp-form-interaction { justify-content:center; margin-top:2em; } .sp-form-embedded { font-size:.9em; } .sp-form-group-item .sp-form-embedded { padding-right:5em; } .sp-form-selection>input[type="radio"]+.sp-form-selection-label::before, .sp-form-selection>input[type="checkbox"]+.sp-form-selection-label::before{ background: var(--input-color); border:10px solid var(--input-color); } .sp-form-selection>input[type="radio"]:hover+.sp-form-selection-label::before, .sp-form-selection>input[type="checkbox"]:hover+.sp-form-selection-label::before{ border:10px solid #dddddd; } .sp-form-selection>input[type="radio"]:checked+.sp-form-selection-label::before{ border:4px solid var(--input-color); } .sp-form-date>input[type="date"]{ min-width: unset; } .sp-form-time>input[type="time"] { min-width: unset; } .sp-form-interaction>button { -webkit-box-flex:0; -ms-flex-positive:0; flex-grow:0; padding:.75rem 5em; } } .sp-form-recaptcha { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-pack:start; -ms-flex-pack:start; justify-content:flex-start; } .sp-form-recaptcha-right { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-pack:end; -ms-flex-pack:end; justify-content:flex-end; } .sp-form-recaptcha-center { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-pack:center; -ms-flex-pack:center; justify-content:center; } .sp-form-file-button { padding:.8em 2em; font-weight: bold; cursor:pointer; color:#666666; background-color:#f6f6f6; border:none; border: solid 2px #a0a0a0; border-radius:var(--input-radius); transition: var(--transition); align-items: center; justify-content: center; } .sp-form-file-button::before{ display: inline-block; content: url('data:image/svg+xml;utf-8,<svg fill="%23666" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M14.4,7.9l-5.7,5.7c-0.4,0.4-0.8,0.6-1.2,0.8c-0.7,0.3-1.4,0.3-2.1,0.2c-0.7-0.1-1.4-0.5-1.9-1c-0.4-0.4-0.6-0.8-0.8-1.2c-0.3-0.7-0.3-1.4-0.2-2.1c0.1-0.7,0.5-1.4,1-1.9L9.7,2c0.2-0.2,0.5-0.4,0.8-0.5c0.4-0.2,0.9-0.2,1.3-0.1C12.2,1.4,12.6,1.6,13,2c0.2,0.2,0.4,0.5,0.5,0.8c0.2,0.4,0.2,0.9,0.1,1.3c-0.1,0.4-0.3,0.8-0.6,1.2l-6.2,6.2c-0.1,0.1-0.2,0.1-0.3,0.2c-0.1,0.1-0.3,0.1-0.5,0c-0.2,0-0.3-0.1-0.4-0.2c-0.1-0.1-0.1-0.2-0.2-0.3c-0.1-0.1-0.1-0.3,0-0.5c0-0.2,0.1-0.3,0.2-0.4l5.5-5.5l-0.9-0.9L4.7,9.3C4.5,9.5,4.4,9.7,4.3,10c-0.2,0.4-0.2,0.8-0.1,1.2c0.1,0.4,0.3,0.8,0.6,1.1c0.2,0.2,0.4,0.4,0.7,0.5c0.4,0.2,0.8,0.2,1.2,0.1c0.4-0.1,0.8-0.3,1.1-0.6l6.2-6.2c0.3-0.3,0.6-0.8,0.8-1.2c0.3-0.6,0.3-1.4,0.2-2c-0.1-0.7-0.5-1.3-1-1.8c-0.3-0.3-0.8-0.6-1.2-0.8c-0.6-0.3-1.4-0.3-2-0.2C10,0.2,9.3,0.5,8.8,1L2.5,7.4C2,7.9,1.6,8.5,1.4,9.1C1,10,0.9,11,1.1,11.9c0.2,1,0.6,1.9,1.4,2.6C3,15,3.5,15.4,4.1,15.6C5.1,16,6,16.1,7,15.9c1-0.2,1.9-0.6,2.6-1.4l5.7-5.7L14.4,7.9z"/></svg>'); margin-left: -0.5em; width: 16px; height: 100%; vertical-align: middle; } .sp-form-file-button:focus { outline:0; } .sp-from-file-default-drag-drop-area { color:#333333; background-color:var(--input-color); border:2.0px dashed #6c757d; border-radius:0; width:100%; height:200px; text-align:center; border-radius: var(--input-radius); } .sp-from-file-ondraghover-drag-drop-area { color:#333333; background-color:#dddddd; border:2.0px dashed #6c757d; border-radius:0; width:100%; height:200px; text-align:center; border-radius: var(--input-radius); } .sp-from-file-ondragleave-drag-drop-area { color:#333333; background-color:#dddddd; border:2.0px dashed #6c757d; border-radius:0; width:100%; height:200px; border-radius: var(--input-radius); } .sp-from-file-ondrop-drag-drop-area { color:#333333; background-color:var(--input-color); border:2.0px dashed #6c757d; border-radius:0; width:100%; height:200px; border-radius: var(--input-radius); } .sp-form-embedded>.sp-file-info:last-child { padding-bottom:0; } .sp-file-info { padding-top:1em; padding-bottom:1em; line-height:1.5; } .sp-file-info>div { width:100%; } .main-text { font-size:1em; font-weight:bold; } [class^="sp-step-flow-f"] { margin:3em 0 2em; } [class^="sp-step-flow-f"]>.large-setting { display:flex; justify-content: center; } [class^="sp-step-flow-f"]>.small-setting { display:none; } [class^="sp-step-flow-f"]>.large-setting, [class^="sp-step-flow-f"]>.small-setting { text-align: center; margin: 0 auto; padding: 0 20px; } [class^="sp-step-flow-f"]>.large-setting>.step, [class^="sp-step-flow-f"]>.small-setting>.step { word-wrap: break-word; min-width: 0; text-align:center; } [class^="sp-step-flow-f"]>.large-setting>.step { flex: 1; margin-right:36px; font-size:16px; } [class^="sp-step-flow-f"]>.small-setting>.step { font-size:14px; } [class^="sp-step-flow-f"]>.large-setting>.step:last-child, [class^="sp-step-flow-f"]>.small-setting>.step:last-child { margin-right: 0; } [class^="sp-step-flow-f"]>.large-setting>.step>span, [class^="sp-step-flow-f"]>.small-setting>.step>span { overflow: hidden; text-overflow: ellipsis; position:relative; display:block; padding-top: 16px; white-space:nowrap; color:#D3D6DB; font-weight:bold; } [class^="sp-step-flow-f"]>.large-setting>.step>span::before, [class^="sp-step-flow-f"]>.small-setting>.step>span::before { position: absolute; content: ""; display: block; top: 0; width: 100%; background: #D3D6DB; } [class^="sp-step-flow-f"]>.large-setting>.step>span::before { height: 6px; border-radius: 6px; } [class^="sp-step-flow-f"]>.small-setting>.step>span::before { height: 4px; border-radius: 4px; } [class^="sp-step-flow-f"]>.large-setting>.step.active>span, [class^="sp-step-flow-f"]>.small-setting>.step.active>span { color:var(--main-color); } [class^="sp-step-flow-f"]>.large-setting>.step.active>span::before, [class^="sp-step-flow-f"]>.small-setting>.step.active>span::before { background:var(--main-color); } @media (max-width: 765px) { [class^="sp-step-flow-f"]>.large-setting { display:none; } [class^="sp-step-flow-f"]>.small-setting { display:flex; justify-content: center; counter-reset:step; } [class^="sp-step-flow-f"]>.small-setting>.step>span { display: none; } [class^="sp-step-flow-f"]>.small-setting>.step { display: flex; align-items: center; width: auto; margin: 0; background: none; color: #ffffff; font-weight: bold; } [class^="sp-step-flow-f"]>.small-setting>.step::before { counter-increment: step 1; content: counter(step, decimal); width:24px; height:24px; background: var(--main-color); border-radius: 50%; font-size: 12px; line-height: 24px; } [class^="sp-step-flow-f"]>.small-setting>.step:not(:last-child) { flex-grow: 1; } [class^="sp-step-flow-f"]>.small-setting>.step:not(:last-child)::after { content: ""; width: calc(100% - 24px); height:2px; background: var(--main-color); vertical-align: middle; } [class^="sp-step-flow-f"]>.small-setting>.step.active::after, [class^="sp-step-flow-f"]>.small-setting>.step.active~.step::before, [class^="sp-step-flow-f"]>.small-setting>.step.active~.step::after { background:#D3D6DB; } }
手順13:検討状況アンケートページに更新フォームのブロックを埋め込み
デモで設定しているソースコードは下記となります。
HTML
CSS
HTMLの「"fcbxxxx"」、「"ufbxxxx"」には、それぞれしたヘッダ、検討状況アンケート回答フォーム、フッターのIDを記載ください。
HTML
<!-- ヘッダ --> <sp:block name="fcb0xxxx"></sp:block> <!-- 検討状況アンケート回答フォーム --> <h2>検討状況アンケート</h2> <sp:block name="ufb0xxxx"></sp:block> <!-- フッター --> <sp:block name="fcb0xxxx"></sp:block>
h2 { text-align: center; } h1 { text-align: center; } .reserve_attention { display: block; text-align: center; margin: 0.5rem 0; } .url-button { width: auto; /* font-size:0.875rem; */ padding:0.5rem 0; text-align:center; text-decoration:none; flex: 1; color: #ffffff; background-color: #0D60DB; border: 1.0px solid #0D60DB; border-radius: calc(12px / 1.2); } .button-l { padding:0.5rem 6%; margin-right: 0.5rem; } .button-r { padding:0.5rem 5%; margin-left: 0.5rem; } .button { padding:0.5rem 5%; } .sp-url-button { text-align: center; width: auto; margin: 1.5rem auto; /* border: 1px solid #dddddd; */ }
HTMLの「"fcbxxxx"」、「"ufbxxxx"」には、それぞれしたヘッダ、検討状況アンケート回答フォーム、フッターのIDを記載ください。
資料請求認証エリアと資料請求認証エリア内ページの作成
手順1:認証エリアの作成
認証エリアから認証用のページを作成します。
IDフィールドは、「メールアドレス」、パスワードは「なし」を選択してください。
IDフィールドは、「メールアドレス」、パスワードは「なし」を選択してください。
手順2:資料ダウンロードページを作成
手順1で作成した認証エリアの「+」ボタンから新規ページを作成します。
資料ダウンロードページはクリックログインページのため、認証は「あり」、クリックログインは「許可する」で設定します。
設定方法は、ソース設定を選択します。
資料ダウンロードページはクリックログインページのため、認証は「あり」、クリックログインは「許可する」で設定します。
設定方法は、ソース設定を選択します。
手順3:資料ダウンロードページに埋め込むダウンロード資料一覧を作成
資料ダウンロードページ内に物件に紐づく資料の情報を表示します。
手順2で作成したページの BODY から「+」ボタンを押下し、レコードリストブロックを作成します。
物件資料情報を表示するためには、レコード公開範囲を設定する必要があります。
サイト管理から、レコード公開範囲を設定します。
レコード公開範囲から「+」ボタンを押下し、物件マスタDBを選択します。
公開範囲は「一般公開およびエリア認証時公開」とし、一般公開は条件抽出を「抽出しない」で、
エリア認証時公開範囲はログインフィルタのフィールド値関係抽出で、「物件ID」「等しい」「物件ID」で設定ください。
設定方法は、ソース設定を選択します。
公開するレコードを絞りたいので、レコードリストブロックからリスト設定を設定します。
HTML
CSS
HTMLの「"f0xx"」には、物件マスタDB内の対応するフィールドIDを記載ください。
手順2で作成したページの BODY から「+」ボタンを押下し、レコードリストブロックを作成します。
物件資料情報を表示するためには、レコード公開範囲を設定する必要があります。
サイト管理から、レコード公開範囲を設定します。
レコード公開範囲から「+」ボタンを押下し、物件マスタDBを選択します。
公開範囲は「一般公開およびエリア認証時公開」とし、一般公開は条件抽出を「抽出しない」で、
エリア認証時公開範囲はログインフィルタのフィールド値関係抽出で、「物件ID」「等しい」「物件ID」で設定ください。
設定方法は、ソース設定を選択します。
公開するレコードを絞りたいので、レコードリストブロックからリスト設定を設定します。
レコードリストブロックのリスト設定は下記のように設定ください。
フィルタ | 初期ソート | 初期表示件数 |
---|---|---|
なし | (ID) 降順 | 20件 |
HTML
<div class="sp-record-list-container"> <!-- <div class="sp-record-list-parts sp-html-parts" th:inline="none"><p><span style="font-size: 18pt;">内覧予約資料ダウンロード一覧</span></p></div> --> <div style="text-align: center;">「物件資料」のファイルをクリックし、ダウンロードをお願いいたします</div> <div class="sp-record-list-parts sp-record-list-pagination"> <div class="sp-record-list-pagination-left"></div> <div class="sp-record-list-pagination-center"></div> <div class="sp-record-list-pagination-right"></div> </div> <div class="sp-record-list-parts"> <table class="sp-record-list-table sp-table-hover"> <thead> <tr> <!--/* 物件名 (propertyName) */--> <th scope="col"> <a th:class="${pagination.isSorted('f0xx')} ? |sp-${pagination.getSortDirection('f0xx')}-sorted|" th:href="${pagination.getLinkWithSort('f0xx')}"> <span th:text="${fields['f0xx'].label}">Label</span> <span class="sp-sorting-desc"><i class="fa fa-angle-down"></i></span> <span class="sp-sorting-asc"><i class="fa fa-angle-up"></i></span> </a> </th> <!--/* 広さ (spaciousness) */--> <th scope="col"> <span th:text="${fields['f0xx'].label}">Label</span> </th> <!--/* 価格 (price) */--> <th scope="col"> <span th:text="${fields['f0xx'].label}">Label</span> </th> <!--/* 備考・詳細 (remarksDetail) */--> <th scope="col"> <span th:text="${fields['f0xx'].label}">Label</span> </th> <!--/* 物件資料 (propertyData) */--> <th scope="col"> <span th:text="${fields['f0xx'].label}">Label</span> </th> </tr> </thead> <tbody> <tr th:each="record, stat : ${pageRecords}"> <!--/* 物件名 (propertyName) */--> <sp:record-data-field name="f0xx"></sp:record-data-field> <td> <span th:text="${record['f0xx']}">Example</span> </td> <!--/* 広さ (spaciousness) */--> <sp:record-data-field name="f0xx"></sp:record-data-field> <td> <span th:text="${record['f0xx']}">Example</span> </td> <!--/* 価格 (price) */--> <sp:record-data-field name="f0xx"></sp:record-data-field> <td> <span th:text="${record['f0xx']}">Example</span> </td> <!--/* 備考・詳細 (remarksDetail) */--> <sp:record-data-field name="f0xx"></sp:record-data-field> <td> <span th:text="${record['f0xx']}">Example</span> </td> <!--/* 物件資料 (propertyData) */--> <sp:record-data-field name="f0xx"></sp:record-data-field> <td th:with="files=${record['f0xx']}" th:remove="${files == null ? 'body' : 'none'}"> <th:block th:if="${files.size == 1}" th:with="file=${files[0]}"> <a class="sp-form-file-bold-link" th:title="|${file.fileName} (${file.fileSize})|" th:text="${file.fileName}" th:href="${file.fileUrl}"></a> <span class="sp-form-file-text-label" th:text="|(${file.fileSize})|">Example</span> </th:block> <span class="sp-form-file-text-label" th:if="${files.size gt 1}" th:text="|${files.size} files|">Example</span> </td> </tr> </tbody> </table> <div class="sp-record-list-no-records" th:if="${recordList.totalRecordCount == 0}"> 表示できるデータがありません </div> </div> <div class="sp-record-list-parts sp-record-list-pagination"> <div class="sp-record-list-pagination-left"></div> <div class="sp-record-list-pagination-center"> <ul class="sp-page-navs" th:with="pageNavItemSize = 5" th:if="${recordList.totalRecordCount != 0}"> <li class="sp-page-nav-item" th:if="!${pagination.isFirstPage}"> <a th:href="${pagination.firstPageLink}"><<</a> </li> <li class="sp-page-nav-item" th:if="!${pagination.isFirstPage}"> <a th:href="${pagination.prevPageLink}"><</a> </li> <li class="sp-page-nav-item" th:each="item : ${pagination.getPrevPageNavItems(pageNavItemSize)}"> <a th:text="${item.pageNum}" th:href="${item.link}">Page Number</a> </li> <li class="sp-page-nav-item sp-page-nav-current"> <span th:text="${pagination.currentPageNum}">Page Number</span> </li> <li class="sp-page-nav-item" th:each="item : ${pagination.getNextPageNavItems(pageNavItemSize)}"> <a th:text="${item.pageNum}" th:href="${item.link}">Page Number</a> </li> <li class="sp-page-nav-more" th:if="${pagination.showEllipsis}">...</li> <li class="sp-page-nav-item" th:if="!${pagination.isLastPage}"> <a th:href="${pagination.nextPageLink}">></a> </li> <li class="sp-page-nav-item" th:if="!${pagination.isLastPage} and !${recordList.recordCountLimitExceeded}"> <a th:href="${pagination.lastPageLink}">>></a> </li> </ul> </div> <div class="sp-record-list-pagination-right"></div> </div> </div>
CSS
:root { /*============================= カスタムプロパティ ==============================*/ --background-color: #FFFFFF; /* ページの背景色 */ --main-color: #0D60DB; /* メインカラー */ --table-border: 1.5px solid #EBEBEB; /* レコードリストの枠線(外周) */ --table-shadow: 0 2px 5px rgba(0,0,0,0.2); /* レコードリストの影 */ --mobile-table-width: 200%; /* スマホ表示時のレコードリストの横幅 */ --th-color:#FFFFFF; /* ヘッダ行の背景色 */ --th-txtcolor:#333333;/* ヘッダ行の文字色 */ --th-col-border: none; /* ヘッダ行の縦線 */ --th-bottom-border: 1.5px solid #EBEBEB; /* ヘッダ行の下線 */ --data-color: #FFFFFF; /* データ行の背景色 */ --even-color: #FFFFFF; /* データ行の背景色(偶数行) */ --hover-color: #E9F6FF; /* データ行の背景色(マウスオーバー時) */ --data-padding: 16px; /* データ行の余白(上下) */ --link-color: #4286F4; /* リンク列の文字色 */ --row-border: 1.5px solid #EBEBEB; /* リストの横線 */ --col-border: none; /* リストの縦線 */ --border-radius: 12px; /* 角の丸さ */ word-break: break-all; /*------ 項目ごとの横幅を固定したい場合は合計100%になるよう調整 -------*/ --col01-width: ; /* 項目1 */ --col02-width: ; /* 項目2 */ --col03-width: ; /* 項目3 */ --col04-width: ; /* 項目4 */ --col05-width: ; /* 項目5 */ --col06-width: ; /* 項目6 */ --col07-width: ; /* 項目7 */ --col08-width: ; /* 項目8 */ --col09-width: ; /* 項目9 */ --col10-width: ; /* 項目10 */ } body{ background: var(--background-color); } .sp-record-list-container { color:#333333; width: clamp(600px, 80%, 1500px); margin:0 auto; } .sp-record-list-container .sp-html-parts p { margin:0; } .sp-record-list-container .sp-record-list-parts { margin: 0 1rem .5rem; } .sp-record-list-container .sp-record-list-table { line-height:1.15; border-collapse:collapse; width:100%; height: 100%; margin-bottom:1rem; color:#333333; border-radius: var(--border-radius); border: var(--table-border); border-collapse: separate; border-spacing: 0; box-shadow: var(--table-shadow); overflow: hidden; } .sp-record-list-container .sp-record-list-table caption { padding-top:0.75rem; padding-bottom:0.75rem; color:#6c757d; text-align:left; caption-side:bottom; } .sp-record-list-container .sp-record-list-table a { text-decoration:none; } .sp-record-list-container .sp-record-list-table a:hover { text-decoration:underline; } .sp-record-list-container .sp-record-list-table th, .sp-record-list-container .sp-record-list-table td { vertical-align:top; border-top:var(--row-border); } .sp-record-list-container .sp-record-list-table td:not(:last-child) { border-right: var(--col-border); } .sp-record-list-container .sp-record-list-table th { text-align:inherit; padding: 1.0rem 0.75rem; } .sp-record-list-container .sp-record-list-table td { padding: var(--data-padding) 0.75rem; } .sp-record-list-container .sp-record-list-table thead th { background: var(--th-color); color:var(--th-txtcolor); padding: calc(var(--data-padding) * 1.2) 0.75rem; font-weight:bold; vertical-align:top; border-bottom:var(--th-bottom-border); text-align:left; } .sp-record-list-container .sp-record-list-table thead th:not(:last-child){ border-right: var(--th-col-border); } .sp-record-list-container .sp-record-list-table thead th:nth-child(1) { width: var(--col01-width);} .sp-record-list-container .sp-record-list-table thead th:nth-child(2) { width: var(--col02-width);} .sp-record-list-container .sp-record-list-table thead th:nth-child(3) { width: var(--col03-width);} .sp-record-list-container .sp-record-list-table thead th:nth-child(4) { width: var(--col04-width);} .sp-record-list-container .sp-record-list-table thead th:nth-child(5) { width: var(--col05-width);} .sp-record-list-container .sp-record-list-table thead th:nth-child(6) { width: var(--col06-width);} .sp-record-list-container .sp-record-list-table thead th:nth-child(7) { width: var(--col07-width);} .sp-record-list-container .sp-record-list-table thead th:nth-child(8) { width: var(--col08-width);} .sp-record-list-container .sp-record-list-table thead th:nth-child(9) { width: var(--col09-width);} .sp-record-list-container .sp-record-list-table thead th:nth-child(10) { width: var(--col10-width);} .sp-record-list-container .sp-record-list-table thead th.sp-nowrap { white-space:nowrap; } .sp-record-list-container .sp-record-list-table thead th.sp-nowrap-truncate { white-space:nowrap; } .sp-record-list-container .sp-record-list-table thead th.sp-nowrap-truncate a>span:first-child { display:inline-block; vertical-align:middle; max-width:12rem; overflow:hidden; text-overflow:ellipsis; } .sp-record-list-container .sp-record-list-table thead th a { color:inherit; text-decoration:none; } .sp-record-list-container .sp-record-list-table thead th a .sp-sorting-asc, .sp-record-list-container .sp-record-list-table thead th a .sp-sorting-desc { color: var(--th-txtcolor); } .sp-record-list-container .sp-record-list-table thead th a .sp-sorting-asc .fa, .sp-record-list-container .sp-record-list-table thead th a .sp-sorting-desc .fa { font-weight:bold; } .sp-record-list-container .sp-record-list-table thead th a .sp-sorting-desc { visibility:hidden; } .sp-record-list-container .sp-record-list-table thead th a .sp-sorting-asc { display:none; } .sp-record-list-container .sp-record-list-table thead th a.sp-desc-sorted .sp-sorting-desc { visibility:visible; } .sp-record-list-container .sp-record-list-table thead th a.sp-asc-sorted .sp-sorting-asc { display:inline; } .sp-record-list-container .sp-record-list-table thead th a.sp-asc-sorted .sp-sorting-desc { display:none; } .sp-record-list-container .sp-record-list-table thead th a:hover { color:#333333; text-decoration:none; } .sp-record-list-container .sp-record-list-table thead th a:hover:not(.sp-sorted) .sp-sorting-desc { visibility:visible; } .sp-record-list-container .sp-record-list-table tbody+tbody { border-top:2px solid #dddddd; } .sp-record-list-container .sp-record-list-table tbody tr td{ transition: .1s; } .sp-record-list-container .sp-record-list-table tbody tr:hover td{ background:var(--hover-color); } .sp-record-list-container .sp-record-list-table tbody tr{ background: var(--data-color); } .sp-record-list-container .sp-record-list-table tbody tr:nth-child(even){ background: var(--even-color); } .sp-record-list-container .sp-record-list-table tr:first-child th, .sp-record-list-container .sp-record-list-table tr:first-child td { border-top:0; } .sp-record-list-container .sp-record-list-table td a:not(.sp-form-file-bold-link) { color: var(--link-color); font-weight:bold; display: inline-block; width: 100%; height: 100%; padding: var(--data-padding) 0.75rem; margin: calc(-1 * var(--data-padding)) -0.75rem; transition: .1s; } .sp-record-list-container .sp-record-list-table td span:nth-child(n+2) { margin-left:.1rem; } .sp-record-list-container .sp-record-list-table a.sp-form-file-bold-link { text-decoration:none; color: var(--link-color); cursor:pointer; font-weight:bold; } .sp-record-list-container .sp-record-list-table a.sp-form-file-bold-link:hover { text-decoration:underline; } .sp-form-file-text-label { color:#6c757d; } .sp-record-list-container .sp-table-sm th, .sp-record-list-container .sp-table-sm td { padding:0.3rem; } .sp-record-list-container .sp-table-bordered { border:1px solid #dddddd; } .sp-record-list-container .sp-table-bordered th, .sp-record-list-container .sp-table-bordered td { border:1px solid #dddddd; } .sp-record-list-container .sp-table-bordered thead th, .sp-record-list-container .sp-table-bordered thead td { border-bottom-width:2px; } .sp-record-list-container .sp-table-borderless th, .sp-record-list-container .sp-table-borderless td, .sp-record-list-container .sp-table-borderless tbody+tbody { border:0; } .sp-record-list-container .sp-record-list-no-records { margin:6.25rem auto; text-align:center; color:#808080; } .sp-record-list-pagination { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-pack:justify; -ms-flex-pack:justify; justify-content:space-between; -webkit-box-align:center; -ms-flex-align:center; align-items:center; } .sp-record-list-pagination .sp-record-list-pagination-left, .sp-record-list-pagination .sp-record-list-pagination-center, .sp-record-list-pagination .sp-record-list-pagination-right { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-align:center; -ms-flex-align:center; align-items:center; } .sp-record-list-pagination .sp-record-list-pagination-left>*, .sp-record-list-pagination .sp-record-list-pagination-center>*, .sp-record-list-pagination .sp-record-list-pagination-right>* { margin:0 .5rem; } .sp-record-list-pagination .sp-record-list-pagination-left { -webkit-box-pack:start; -ms-flex-pack:start; justify-content:flex-start; } .sp-record-list-pagination .sp-record-list-pagination-center { -webkit-box-pack:center; -ms-flex-pack:center; justify-content:center; } .sp-record-list-pagination .sp-record-list-pagination-right { -webkit-box-pack:end; -ms-flex-pack:end; justify-content:flex-end; } .sp-record-list-pagination .sp-form-control { -webkit-appearance:none; -moz-appearance:none; appearance:none; font-family:inherit; font-size:1rem; line-height:1.5; padding:.3rem .7rem; color:#333333; -webkit-box-sizing:border-box; box-sizing:border-box; width:100%; margin: 1px 1px calc(0.2rem + 1px); border:1px solid #dddddd; border-radius:calc(var(--border-radius) / 1.2); box-sizing:border-box; outline:none; } .sp-record-list-pagination .sp-form-control:focus { margin: 0 0 0.2rem; border: 2px solid var(--main-color); } .sp-record-list-pagination .sp-form-inline .sp-form-control { display:inline-block; width:auto; vertical-align:middle; } .sp-record-list-pagination select.sp-form-control, .sp-record-list-pagination option.sp-form-control { -webkit-appearance:none; -moz-appearance:none; appearance:none; padding-right:1.5rem; } .sp-record-list-pagination select.sp-form-control::-ms-expand { display:none; } .sp-record-list-pagination .sp-form-dropdown { position:relative; } .sp-record-list-pagination .sp-form-dropdown-inline { position:relative; display:inline-block; } .sp-record-list-pagination .sp-form-dropdown-icon { display:block; position:absolute; top:1rem; right:.5rem; line-height:0; pointer-events:none; } .sp-record-list-pagination .sp-form-dropdown-icon:after { content:""; display:block; border-top:.333rem solid #888888; border-right:.333rem solid transparent; border-left:.333rem solid transparent; } .sp-record-list-pagination ul.sp-page-navs { display:-webkit-box; display:-ms-flexbox; display:flex; padding-left:0; list-style:none; } .sp-record-list-pagination ul.sp-page-navs li.sp-page-nav-item { line-height:1.25rem; text-align:center; -webkit-user-select:none; -moz-user-select:none; -ms-user-select:none; user-select:none; white-space:nowrap; } .sp-record-list-pagination ul.sp-page-navs li.sp-page-nav-item a, .sp-record-list-pagination ul.sp-page-navs li.sp-page-nav-item span { display:inline-block; margin:0 0.2rem; padding:.375rem .75rem; border-radius:calc(var(--border-radius) / 1.2); color:var(--main-color); font-weight: bold; } .sp-record-list-pagination ul.sp-page-navs li.sp-page-nav-item a .fa, .sp-record-list-pagination ul.sp-page-navs li.sp-page-nav-item span .fa { font-size:1.125rem; width:1rem; } .sp-record-list-pagination ul.sp-page-navs li.sp-page-nav-item a { text-decoration:none; } .sp-record-list-pagination ul.sp-page-navs li.sp-page-nav-item a:hover { background-color:rgba(0,0,0,0.075); } .sp-record-list-pagination ul.sp-page-navs li.sp-page-nav-item span { background-color:rgba(0,0,0,0.075); color: var(--main-color); font-weight: bold; } .sp-record-list-pagination ul.sp-page-navs li.sp-page-nav-item.sp-page-nav-current span { background-color:var(--main-color); border-color:var(--main-color); color:#ffffff; } .sp-record-list-pagination ul.sp-page-navs li.sp-page-nav-more { line-height:1rem; text-align:center; margin:0 .2rem; padding:.375rem .3rem; } @media (max-width: 765px) { .sp-record-list-container .sp-record-list-parts { margin: 0 0 .5rem; } .sp-record-list-container [class="sp-record-list-parts"]{ overflow-x: auto; } .sp-record-list-container .sp-record-list-table { width: var(--mobile-table-width); font-size: .9em; box-shadow: unset; } }
HTMLの「"f0xx"」には、物件マスタDB内の対応するフィールドIDを記載ください。
手順4:資料ダウンロードページにブロックを埋め込み
手順2で作成した資料ダウンロードページの body にブロックを埋め込みます。
デモで設定しているソースコードは下記となります。
HTML
CSS
HTMLの「"fcbxxxx"」、「"ribxxxx"」、「"rlbxxxx"」には、それぞれヘッダ、物件詳細ブロック、ダウンロード資料一覧、フッターのIDを記載ください。
デモで設定しているソースコードは下記となります。
HTML
<!-- ヘッダ --> <sp:block name="fcb0xxxx"></sp:block> <!-- 資料ダウンロード一覧 --> <h2>資料ダウンロード</h2> <sp:block name="rlb0xxxx"></sp:block> <!-- フッター --> <sp:block name="fcb0xxxx"></sp:block>
h2 { text-align: center; } h1 { text-align: center; } .reserve_attention { display: block; text-align: center; margin: 0.5rem 0; } .url-button { width: auto; /* font-size:0.875rem; */ padding:0.5rem 0; text-align:center; text-decoration:none; flex: 1; color: #ffffff; background-color: #0D60DB; border: 1.0px solid #0D60DB; border-radius: calc(12px / 1.2); } .button-l { padding:0.5rem 6%; margin-right: 0.5rem; } .button-r { padding:0.5rem 5%; margin-left: 0.5rem; } .button { padding:0.5rem 5%; } .sp-url-button { text-align: center; width: auto; margin: 1.5rem auto; /* border: 1px solid #dddddd; */ }
HTMLの「"fcbxxxx"」、「"ribxxxx"」、「"rlbxxxx"」には、それぞれヘッダ、物件詳細ブロック、ダウンロード資料一覧、フッターのIDを記載ください。
最後に
設定後は動作確認を必ず行い、動作に問題がないか確認をしてください。
また、不具合やほかのやり方が知りたい等あれば、下記の「コンテンツに関しての要望はこちら」からご連絡ください。
サイト設計・構築が完了したので次はユーザ・アプリロール・グループ設定に進みます。
関連記事はこちら
また、不具合やほかのやり方が知りたい等あれば、下記の「コンテンツに関しての要望はこちら」からご連絡ください。
サイト設計・構築が完了したので次はユーザ・アプリロール・グループ設定に進みます。
関連記事はこちら
- アプリ(DB・メール)設計・構築
- サイト設計・構築
- ユーザ・アプリロール・グループ設定