本記事では、アンケートの回答を受け付けた後、
メールにてギフトコードが閲覧可能なURLを送信する方法について紹介します。
全体像
予めギフトコードDBにギフトコードを格納しておきます。
アンケート回答フォームよりアンケートを回答すると、ギフトコードDBのギフトコードに紐づき、
アンケートDBに登録され回答者に通知がされます。
アンケート回答DBの非同期アクションの登録トリガにPHPを設置し、
ギフトコードDBのレコードIDを取得します。
フォームの登録時に発行された、アンケート回答DBのレコードの参照フィールドを更新することで紐づけを行い、
その後更新トリガにて消し込みを行います。
DB設定
以下2つのDBを作成します。
アンケート回答DB
ギフトコードDB
| フィールド名 | フィールドタイトル | フィールドタイプ | 自動生成設定 |
|---|---|---|---|
| アンケート管理ID | enqueteId | 参照フィールド(ギフトコードDBのIDを参照設定) | 自動生成:使用しない |
| メールアドレス | メールアドレス | 自動生成:使用しない | |
| ギフトコード | giftCode | テキスト | 自動生成:使用しない |
ギフトコードDB
| フィールド名 | フィールドタイトル | フィールドタイプ | 自動生成設定 |
|---|---|---|---|
| ギフトコード | giftCode | テキスト | 自動生成:使用しない |
| 連携済みフラグ | connectFlg | セレクト(1:未連携、2:連携済み) | デフォルト値:1(未連携) |
| 連携日時 | connectDate | 日時 | - |
上記のフィールドは必須のフィールドになります。
その他のフィールドは、必要に応じて追加してください。
アンケートDBの非同期アクションの登録トリガにPHPを設置してください。
更新トリガには自DBと他DBの2つのアクションを作成し、
自DB更新アクションにはギフトコードを参照先DBのギフトコードフィールドにマッピングしてください。
他DB更新アクションには連携済みフラグを参照先DBの、
連携済みフラグフィールドに「2:連携済み」をマッピングしてください。
また連携日時フィールドには、自DBの最終更新日時をマッピングしてください。
非同期アクションの設定
登録トリガのPHPは以下のようになります。
PHP
<?php
define("API_URL", "https://api.spiral-platform.com/v1");
define("API_KEY", "");
define("APP_ROLE", ""); // 任意
define("APP_ID", "");
define("GIFT_DB_ID", "");
define("ENQUETE_DB_ID", "");
$commonBase = CommonBase::getInstance();
// ギフトコードDBからIDの小さい順に5件取得
$params = "?sort=_id:asc&limit=5";
$giftList = $commonBase->apiCurlAction("GET", "/apps/" . APP_ID . "/dbs/" . GIFT_DB_ID . "/records" . $params);
// ここで更新対象のレコードID(アンケートDB側)を設定
$record = $SPIRAL->getRecord();
$targetRecordId = $record["item"]["_id"];
foreach ($giftList["items"] as $gift) {
// アンケートDBの特定レコードを更新
$updateData = [
"enqueteId" => $gift["_id"],
];
$result = $commonBase->apiCurlAction("PATCH", "/apps/" . APP_ID . "/dbs/" . ENQUETE_DB_ID . "/records/" . $targetRecordId, $updateData);
// エラーが存在するか確認
if (isset($result["status"]) && $result["status"] === 400 && isset($result["errors"])) {
// エラー配列をチェックして「value is duplicated」があるか調べる
$isDuplicate = false;
foreach ($result["errors"] as $error) {
if (
isset($error["message"]) &&
strpos($error["message"], "duplicated") !== false &&
isset($error["location"]) &&
$error["location"] === "/enqueteId"
) {
$isDuplicate = true;
break;
}
}
if ($isDuplicate) {
// 重複なら次のギフトコードへ
continue;
} else {
echo "更新エラー: " . json_encode($result["errors"]) . "\n";
continue;
}
}
// 成功した場合
echo "更新成功: " . json_encode($result) . "\n";
break; // 成功したらループ終了
}
//------------------------------
// 共通クラス
//------------------------------
class CommonBase {
protected static $singleton;
public function __construct() {
if (self::$singleton) throw new Exception('must be singleton');
self::$singleton = $this;
}
public static function getInstance() {
return self::$singleton ?: new CommonBase();
}
function apiCurlAction($method, $addUrlPass, $data = null, $multiPart = null, $jsonDecode = false) {
$header = [
"Authorization: Bearer " . API_KEY,
"X-Spiral-Api-Version: 1.1",
];
$header[] = $multiPart ?: "Content-Type: application/json";
if (APP_ROLE) $header[] = "X-Spiral-App-Role: " . APP_ROLE;
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_URL, API_URL . $addUrlPass);
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
if (in_array($method, ["POST", "PATCH", "DELETE"])) {
curl_setopt($curl, CURLOPT_POSTFIELDS, $multiPart ? $data : json_encode($data));
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
}
$response = curl_exec($curl);
if (curl_errno($curl)) echo curl_error($curl);
curl_close($curl);
return $jsonDecode ? $response : json_decode($response, true);
}
}
アンケート回答フォームブロック設定
クリックログインを有効にし、ログイン後ページにギフトコードの差し替えを出力してください。
メールアクションの設定を行い、上記認証エリアに対するクリックログインURLを記載して
フォームの設定は以上になります。