ver.2サポートサイト

HOMEAPIサンプルプログラムPHP残席状況表示

残席状況表示

セミナーなどの定員数や枠数に対して、申込み数の合計から、残り数を算出し、レコードアイテムブロックにて、自動的に「残席わずか」と表示したり、申込ボタンの表示を変えるサンプルプログラムです。

レコードアイテムブロックを設定したページの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>