残席状況表示
セミナーなどの定員数や枠数に対して、申込み数の合計から、残り数を算出し、レコードアイテムブロックにて、自動的に「残席わずか」と表示したり、申込ボタンの表示を変えるサンプルプログラムです。
レコードアイテムブロックを設定したページのPHP
<?php
//------------------------------------------------
//残席わずか表示
//------------------------------------------------
$param = explode(".", $SPIRAL->getParam("record"));//レコードアイテムブロックが表示された時、URLクエリパラメータから「レコードID」を取得。
$record_id = $param[1];
$apikey = $SPIRAL->getEnvValue("apikey");//PHP環境変数からAPIキーを取得
$apiurl = $SPIRAL->getEnvValue("apiurl");//PHP環境変数からAPIURLを取得
$header = array(
"Authorization:Bearer " . $apikey,
"Content-Type:application/json",
);
//セミナーマスタに登録されている定員数を取得
$query = "?fields=semi_id,capa&where=@_id='" . $record_id . "'";
$semiid_url = $apiurl . "{appId}/dbs/{dbId}/records" . $query;
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_URL , $semiid_url);
curl_setopt($curl, CURLOPT_HTTPHEADER , $header);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST , "GET");
$response = curl_exec($curl);
if (curl_errno($curl)) echo curl_error($curl);
curl_close($curl);
$data = json_decode($response , true);
//APIエラーを取得
if(array_key_exists('status', $data)){//APIのエラーが発生した場合、APIのレスポンスにstatusが200以外で返ってくるので、statusをチェック
if($data["status"] != 200){
$SPIRAL->setTHValue("APIERROR", $data["message"]);//APIのエラーをThymeleafにセット
}
}else{
$items = $data["items"];
foreach($items as $item){
$semi_id = $item["semi_id"];//レコードIDからセミナーIDを取得
$capa = $item["capa"];//レコードIDから定員数を取得
//セミナー申込に登録されているレコード件数を取得
$query = "?fields=semi_id&enableTotalCount=true&where=@semi_id='" . $semi_id . "'";
$semient_url = $apiurl . "{appId}/dbs/{dbId}/records" . $query;
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_URL , $semient_url);
curl_setopt($curl, CURLOPT_HTTPHEADER , $header);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST , "GET");
$response = curl_exec($curl);
if (curl_errno($curl)) echo curl_error($curl);
curl_close($curl);
$data = json_decode($response , true);
$count = $data["totalCount"];//申込み合計数を取得
//残席状況算出
if($capa == $count || $capa == 0){
$limit = 0;//残席0
}else if($capa > $count){
if(($capa-5) <= $count){
$limit = 1;//残席わずか
}else{
$limit = 2;//席に余裕あり
}
}
$SPIRAL->setTHValue("limit", $limit);//Thymeleafに残り数をセット
}
}
?>
レコードアイテムブロックのbody
<div class="sp-record-item-container" th:if="${record != null}">
<div class="sp-record-item-parts sp-html-parts">
<p><span style="font-size: 1.5rem;">開催予定のセミナー</span></p>
</div>
<!--/* セミナー名称 */-->
<sp:record-item-field name="f01"></sp:record-item-field>
<div class="sp-record-item-parts sp-record-item-field">
<div class="sp-record-item-label" th:text="${fields['f01'].label}">Label</div>
<div class="sp-record-item-data">
<span class="sp-record-item-embedded" th:text="${record['f01']}">Example</span>
</div>
</div>
<!--/* 開催日 */-->
<sp:record-item-field name="f012"></sp:record-item-field>
<div class="sp-record-item-parts sp-record-item-field">
<div class="sp-record-item-label" th:text="${fields['f012'].label}">Label</div>
<div class="sp-record-item-data">
<span class="sp-record-item-embedded" th:text="${record['f012'] != null} ? ${record['f012'].format('MM/dd')} : ''">01/01</span>
</div>
</div>
<!--/* 開催時間*/-->
<sp:record-item-field name="f010"></sp:record-item-field>
<div class="sp-record-item-parts sp-record-item-field">
<div class="sp-record-item-label" th:text="${fields['f010'].label}">Label</div>
<div class="sp-record-item-data">
<span class="sp-record-item-embedded" th:text="${record['f010'] != null} ? ${record['f010'].format('yyyy/MM/dd HH:mm:ss')} : ''">2000/01/01 12:00:00</span>
</div>
</div>
<!--/* 開催場所 */-->
<sp:record-item-field name="f02"></sp:record-item-field>
<div class="sp-record-item-parts sp-record-item-field">
<div class="sp-record-item-label" th:text="${fields['f02'].label}">Label</div>
<div class="sp-record-item-data">
<span class="sp-record-item-embedded" th:if="${record['f02'] != null}">
<th:block th:each="line, stat : ${record['f02'].lines}">
<th:block th:text="${line}"></th:block>
<br th:unless="${stat.last}">
</th:block>
</span>
</div>
</div>
<!--/* 受付状況 */-->
<div class="sp-record-item-parts sp-record-item-field">
<div class="sp-record-item-label">受付状況</div>
<div class="sp-record-item-data">
<div th:if="${cp.result.isSuccess}">
<p th:text="${cp.result.value['APIERROR']}"></p><!-- APIエラー文言を出力 -->
<th:block th:switch="${cp.result.value['limit']}"><!-- PHPの実行結果を取得 -->
<p th:case="0">定員に達しました。</p>
<p th:case="1">残席わずかです。</p>
<p th:case="2">受付中です。</p>
</th:block>
<!-- 残席がある場合、参加申込みページへ遷移 -->
<form th:unless="${cp.result.value['limit']==0}" method="post" th:action="${pages['p02598'].path}">
<input type="hidden" name="semi_id" th:value="${record['f016']}">
<input type="submit" value="申込み">
</form>
</div>
<div th:if="${!cp.result.isSuccess}">
<p th:text="${cp.result.errorMessage}">error message</p>
</div>
</div>
</div>
</div>
<div class="sp-record-item-container" th:if="${record == null}">
<div class="sp-record-item-no-item">
データが見つかりません
</div>
</div>
