---
title: フォーム送信によりメンバー登録されるユーザーのメンバー情報にフォームの回答内容を設定する
description: このチュートリアルでは、カスタム処理を利用することで、自動で登録されるユーザーのメンバー情報にフォームの回答データを追加で設定する方法を紹介します。
---

## 概要  
フォーム基本設定で自動ユーザ登録にチェックを入れると、フォームの回答を送付したメールアドレスを自動でユーザー登録できます。  
このチュートリアルでは、カスタム処理を利用することで、自動で登録されるユーザーのメンバー情報にフォームの回答データを追加で設定する方法を紹介します。

### 学べること
以下の手順で機能の設定をする流れを学びます。

- [カスタム処理で利用するAPIを設定する](#カスタム処理で利用するapiを設定する)
- [カスタム処理を作成する](#カスタム処理を作成する)
- [APIのポストプロセスに作成したカスタム処理を設定](#apiのポストプロセスに作成したカスタム処理を設定)
- [Swaggerを利用して動作確認を行う](#swaggerを利用して動作確認を行う)

### 前提条件
このチュートリアルでは、下記のチュートリアルを参考にフォーム送信と同時にメンバー情報を登録する機能が設定されていることを前提とします。  

- [フォームの回答を送付したユーザー向けに配信メッセージを送付する](/ja/docs/tutorials/sending-notification-messages-to-users-who-submitted-form-responses/)

## カスタム処理で利用するAPIを設定する
次に、カスタム処理で利用する下記のAPIを設定します。

### 内部処理用のAPI設定
Kuroco内部でのみ利用するエンドポイントはAPIを分けておくことをお勧めします。  
そこで、まずは内部利用のためのAPIを新規で作成します。  
既に追加済みの場合は次のステップに進んで構いません。  

#### APIの作成
Kuroco管理画面のAPIより「追加」をクリックします。

![Image from Gyazo](https://t.gyazo.com/teams/diverta/22c37e75a8244f384deb5b706d4979da.png)

API作成画面が表示されるので、下記入力し「追加する」をクリックします。  

![Image from Gyazo](https://t.gyazo.com/teams/diverta/44c341acced8d685e67ec1da1e85abac.png)

|項目|設定内容|
| :--- | :--- |
|タイトル|Internal|
|版|1.0|
|ディスクリプション|内部処理用のAPI|

APIが作成されました。

![Image from Gyazo](https://t.gyazo.com/teams/diverta/3c04c600fc74102913e9e668ae5cca0e.png)

#### セキュリティの設定
次にセキュリティの設定をします。[セキュリティ] をクリックします。  

![Image from Gyazo](https://t.gyazo.com/teams/diverta/6bc5cb1beb28c74ede6aeca89715a647.png)

セキュリティを[動的アクセストークン]に設定して、[保存する]をクリックします。  

![Image from Gyazo](https://t.gyazo.com/teams/diverta/62aaa225db5d12ee84ccc6d5a52411fe.png)

セキュリティを[動的アクセストークン]に設定後、`Login::token`のエンドポイントが無い場合、利用をお勧めされますが、内部利用のみの場合は無視して構いません。  

![Image from Gyazo](https://t.gyazo.com/teams/diverta/0bb1efe099bdae8f1c0481037416a5d9.png)

#### CORSの設定
次にCORSの設定をします。[CORSを設定する] をクリックします。

![Image from Gyazo](https://t.gyazo.com/teams/diverta/74cd7a36fd926dbc20b04812553072c7.png)

CORS_ALLOW_ORIGINSの [Add Origin] をクリックし、下記を追加します。

- 管理画面URL

CORS_ALLOW_METHODSの [Add Method] をクリックし、下記を追加します。

- GET  
- POST
- OPTIONS

CORS_ALLOW_CREDENTIALSの[Allow Credentials]にチェックが入っていることを確認します。  

![Image from Gyazo](https://t.gyazo.com/teams/diverta/f2bc3744fe6a2ab042456fa8c635195c.png)

問題なければ [保存する] をクリックします。  

### 内部処理用のAPIエンドポイントの作成
作成したAPIの設定に実際に利用するAPIのエンドポイントを追加します。
このチュートリアルでは下記の2つのエンドポイントの設定をします。
- フォーム回答情報 詳細取得API
- メンバー更新API

#### フォーム回答情報 詳細取得APIの作成
[新しいエンドポイントの追加]をクリックします。

![Image from Gyazo](https://t.gyazo.com/teams/diverta/c4ecb0650afb6e2abce191a26bb06194.png)

以下のエンドポイントを作成します。

|項目|設定内容|
| :--- | :--- |
|パス|inquiry_details|
|カテゴリー|フォーム|
|モデル|InaquiryMessage|
|オペレーション|details|
|GroupAuth|管理者<br/>内部処理用のAPIグループにしているのでフロントから呼ばれることはありませんが、念のためアクセス制限を付けておきます。|
|inquiry_id|「事前準備」で作成したフォームのIDを指定します。|

![Image from Gyazo](https://t.gyazo.com/teams/diverta/cb2130ab2b8efb4d43ca6300a6e8cae8.png)

設定ができたら[追加する]をクリックしてエンドポイントを追加します。

#### メンバー更新APIの作成
[新しいエンドポイントの追加]をクリックします。

![Image from Gyazo](https://t.gyazo.com/teams/diverta/c4ecb0650afb6e2abce191a26bb06194.png)

以下のエンドポイントを作成します。

|項目|設定内容|
| :--- | :--- |
|パス|self-member-update|
|カテゴリー|メンバー|
|モデル|Member|
|オペレーション|update|
|self_only|チェック|

※あくまでも最低限の設定です、実際のサイトに合わせて`allowed_group_ids`、`use_columns`などを設定してください。

![Image from Gyazo](https://t.gyazo.com/teams/diverta/57474f2480e86321ca01949d8c7fbb6f.png)

設定ができたら[追加する]をクリックしてエンドポイントを追加します。

## カスタム処理を作成する
それではカスタム処理を作成します。

### 1. カスタム処理の一覧画面を表示する  
メニューの[オペレーション] -> [カスタム処理] をクリックします。 
![Image from Gyazo](https://t.gyazo.com/teams/diverta/5a1004b72758bacc6481434dc2645ec6.png)

### 2. カスタム処理の編集画面を表示する 
カスタム処理一覧画面の右上の [追加] をクリックします。

![Image from Gyazo](https://t.gyazo.com/teams/diverta/53e29eae5f0cd2604103b10eff66583d.png)
すると、カスタム処理編集画面が表示されます。

![Image from Gyazo](https://t.gyazo.com/teams/diverta/389245a9b05ffacb0c1cb2065b969463.jpg)

### 3. タイトル・識別子を記入する
それではカスタム処理を作成していきます。  
まずはタイトルと識別子に記入します。今回は下記のように記入します。

- タイトル：お問い合わせ時メンバー登録データ連係
- 識別子：member-register-when-inquiry-send

:::tip
タイトル・識別子は他のカスタム処理と重複できません。
実装対象のエンドポイント名など、他と重複しない内容で記入してください。
:::

![Image from Gyazo](https://t.gyazo.com/teams/diverta/6e369af2ac8c160ef2cc182f57abb3c8.png)

#### カスタム処理
フォームメッセージの内容を元に登録されたメンバー情報を更新する処理を下記のように記入します。  

```smarty
{assign var=update_member_flg value=1}

{*新規メンバー登録のデータを対象にしたいので未ログインの場合にのみ処理を行う(ログイン済みの場合は既にメンバー登録されている)*}
{if $smarty.session.member_id}
    {assign var=update_member_flg value=0}
{/if}

{*既に登録済みメンバーが存在した場合はプリプロセスに判定処理を追加し以下の部分のコメントアウトを解除して下さい*}
{*}
{assign_session var=exist_member_flg key='exist_member_flg'}
{if $exist_member_flg}
    {assign var=update_member_flg value=0}
{/if}
{*}

{if $update_member_flg}
    {*お問い合わせデータからメンバーID取得*}
    {assign var=inquiry_bn_id value=$json.id}
    {api_internal endpoint='/rcms-api/2/inquiry_details/'|cat:$inquiry_bn_id member_id=1 method='GET' var=inquiry_response status_var=status}
    {if $status==1}
        {assign var=member_id value=$inquiry_response.details.member_id}
        {if $member_id}
            {*問い合わせ情報取得*}
            {assign var=tel value=$inquiry_response.details.ext_01}
            {assign var=address value=$inquiry_response.details.ext_03}
            {assign var=sex value=$inquiry_response.details.ext_04.key}{*選択形式の場合はkeyを連携する*}
            {assign var=birth value=$inquiry_response.details.ext_05}

            {*メンバー情報更新*}
            {assign_array var=queries values=''}
            {assign var=queries.tel value=$tel}
            {assign var=queries.address1 value=$address}
            {assign var=queries.ex_sex value=$sex}
            {assign var=queries.ex_date value=$birth}
            {api_internal endpoint='/rcms-api/2/self-member-update' method='POST' member_id=$member_id queries=$queries var=member_response status_var=status}
            {if $status==1}
                {*処理成功*}
            {else}
                {*エラー処理*}
                {logger msg1='member-register-when-inquiry-send' msg2='Cannot set member ext data' msg3=$queries msg4=$member_response}
            {/if}
        {else}
            {*エラー処理、標準処理でメンバー登録に失敗しているケース*}
            {logger msg1='member-register-when-inquiry-send' msg2='Cannot get member_id from inquiry details' msg3=$inquiry_response}
        {/if}
    {else}
        {*エラー処理*}
        {logger msg1='member-register-when-inquiry-send' msg2='Cannot get inquiry details' msg3=$inquiry_response}
    {/if}
{/if}
{$json|@json_encode}
```

**メンバー項目に設定されるフォーム項目の内容**  
上記のカスタム処理では下記のフォーム設定 / メンバー設定を対応させています。

それぞれの設定は「[フォーム項目設定](/ja/docs/management/form-field-settings/)」、「[メンバーの拡張項目設定](/ja/docs/management/extra-information/)」で実施してください。  

| フォーム項目 | フォームキー名 | メンバー項目 | メンバーキー名 | 型 | 備考 | 
| --- | --- | --- | --- | --- | --- |
| name | name | 姓<br/>名 | name1<br/>name2 | テキスト | 標準のメンバー登録処理で設定されるので連携時には設定しない |
| email | email | メールアドレス | email | テキスト | 標準のメンバー登録処理で設定されるので連携時には設定しない |
| tel | ext_01 | 電話番号 | tel | テキスト | |
| address | ext_03 | 住所1 | address1 | テキスト | |
| sex | ext_04 | 拡張-性別 | ex_sex | 選択項目 | 選択肢はフォーム・メンバー共通で下記を設定<br/>1::male<br/>2::female<br/>3::other |
| birth | ext_05 | 拡張-生年月日 | ex_date | 日付フォーマット | |

#### フォーム項目設定
![Image from Gyazo](https://t.gyazo.com/teams/diverta/4e0025dd210c95ccef7c8f37b209a5b1.png)

#### メンバー項目設定
![Image from Gyazo](https://t.gyazo.com/teams/diverta/2b43c6f352ef5fe924f230142b213165.png)


### 4. カスタム処理を保存する 
処理の記述が完了したら、[追加する] ボタンをクリックして保存します。  

![Image from Gyazo](https://t.gyazo.com/teams/diverta/2b3b74abddfc8775f8ab73958631a975.png)
### 5. 新規登録時のみフォームデータとメンバー項目の連係を行いたい場合
フォーム送信処理でメンバーを新規登録する処理は、既存メンバーにEmailアドレスが存在しない場合のみ行っています。

その為、もし既に登録済みのメンバーがいる場合にはフォームの内容で連携処理を行いたくない場合は下記の処理をプリプロセスで行い、ポストプロセスに記載している下記のコメント処理を行って下さい。

#### ポストプロセスの該当コメント
```smarty
{*既に登録済みメンバーが存在した場合はプリプロセスに判定処理を追加し以下の部分のコメントアウトを解除して下さい*}
{*}
{assign_session var=exist_member_flg key='exist_member_flg'}
{if $exist_member_flg}
    {assign var=update_member_flg value=0}
{/if}
{*}
```

#### プリプロセスで既に登録済みメンバーが存在するかチェックする為のオリジナル処理
```smarty
{assign_session key='exist_member_flg' value=0}
{if $smarty.request.email}
    {*emailでメンバー情報をfilter*}
    {assign var=email value=$smarty.request.email}

    {assign_array var=method_params values=''}
    {assign var=method_params.filter value='email='|cat:$email}
    {api_method var=list model="Member" method="list" method_params=$method_params}
    {if $list.list|@count > 0}
        {*存在する場合は新規登録しないので更新処理も行わない*}
        {assign_session key='exist_member_flg' value=1}
    {/if}
{/if}
```


以上でカスタム処理の完成です。

## APIのポストプロセスに作成したカスタム処理を設定
APIの一覧画面から「事前準備」で作成したフォーム送信のエンドポイントにポストプロセスを設定する。
![Image from Gyazo](https://t.gyazo.com/teams/diverta/a87610be9e87a96ec8f877864a359a25.png)

## Swaggerを利用して動作確認を行う
1. Swaggerから下記のサンプルデータでInquiryMessage:sendのAPIを呼び出す
2. 追加されたメンバー情報に送信したものと同じ内容のデータが入っていることを確認する

#### サンプルデータ
```json
{
  "name": "test user",
  "email": "email@example.com",
  "ext_01": "09022223333",
  "ext_03": "東京都世田谷区",
  "ext_04": "1",
  "ext_05": "1980-10-21",
  "body": "Example Message",
  "inquiry_category_id": 8
}
```
※`inquiry_category_id`は環境によって値の変更、もしくは送信しないで問題ありません。

#### 登録後メンバー情報
![Image from Gyazo](https://t.gyazo.com/teams/diverta/ee9e69768786f5821ddd970057a4155b.png)


以上です。

## 関連ドキュメント
- [フォームの回答を送付したユーザー向けに配信メッセージを送付する](/ja/docs/tutorials/how-to-implement-original-function-into-the-member-info-when-form-send-with-member-regist/)
- [カスタム処理からKurocoのAPIを呼び出せますか？](/ja/docs/faq/how-to-request-kuroco-api-from-smarty-function/)
- [Smartyプラグイン](/ja/docs/reference/smarty-plugin/)
