残席状況表示
セミナーなどの定員数や枠数に対して、申込み数の合計から、残り数を算出し、レコードアイテムブロックにて、自動的に「残席わずか」と表示したり、申込ボタンの表示を変えるサンプルプログラムです。
レコードアイテムブロックを設定したページの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 . "{app}/dbs/{db}/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 . "{app}/dbs/{db}/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>