---
title: カスタム処理を利用して、コンテンツ定義に独自のバリデーションを実装する
description: カスタム処理とTriggerを使用して、コンテンツ追加または編集に独自のバリデーション処理を実装する方法を解説します。この機能を利用すると、標準機能のみでは実現できない複雑な入力チェックを追加できます。
---

## 概要
カスタム処理とTriggerを使用して、コンテンツ追加または編集に独自のバリデーション処理を実装する方法を解説します。
この機能を利用すると、標準機能のみでは実現できない複雑な入力チェックを追加できます。

今回は、POSTされたメールアドレスが特定のドメインと一致しなければエラーを返すバリデーション処理を実装します。

### 学べること
以下の手順でコンテンツの追加・編集に独自のバリデーション処理を実装します。
- [事前準備](#事前準備)
- [カスタム処理を作成する](#カスタム処理を作成する)
- [バリデーション処理を記述する](#バリデーション処理を記述する)
- [カスタム処理にコンテンツ定義を関連付ける](#カスタム処理にコンテンツ定義を関連付ける)
- [バリデーションの動作を確認する](#バリデーションの動作を確認する)

## 事前準備
### バリデーションを適用するコンテンツ定義を作成する
まず、バリデーションを適用するコンテンツ定義を作成します。  

Kuroco管理画面のサイドメニューから[コンテンツ定義]をクリックします。  
![Image from Gyazo](https://t.gyazo.com/teams/diverta/6907f819b40433ca64ed43afdc2aeda1.png)

画面右上の[追加]をクリックします。  
![Image from Gyazo](https://t.gyazo.com/teams/diverta/0f1613d2588759c77fb778177724d83e.png)

以下の通り入力します。
- 名前：カスタムバリデーション実装対象コンテンツ
- フィールド：以下の通り

![Image from Gyazo](https://t.gyazo.com/teams/diverta/9a4e7cbe7c6502790a26d6ace73506ff.png)
![Image from Gyazo](https://t.gyazo.com/teams/diverta/778e746a8d1b4f766b3bf00561e7e5c3.png)

設定後、[追加]をクリックしてコンテンツ定義を追加します。  
![Image from Gyazo](https://t.gyazo.com/teams/diverta/1d9bd575721553e565407c224b5a9e15.png)

## カスタム処理を作成する
バリデーション処理を記述するためのカスタム処理を用意します。

メニューの[オペレーション] -> [カスタム処理] をクリックします。

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

カスタム処理一覧画面の右上の [追加] をクリックします。

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

### タイトル・カテゴリ等を入力する
カスタム処理のタイトル、カテゴリ、識別子とこれを使ったコンポーネントを入力します。 

今回は下記のように入力しました。
- タイトル：email_domain_validation
- 識別子：email_domain_validation

:::tip
同一カテゴリ内にタイトルが重複する処理を作成できないため、他と重複しないタイトルを命名してください。
:::

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

### バリデーション処理を記述する
次に、以下の手順でバリデーション処理を記述します。

#### エラー変数を初期化する
バリデーション結果を格納するための$errors変数を初期化します。  

| 変数名 | 型 | 説明|
| :--- | :--- | :--- |
|$errors |array |テキスト配列|

エディタに下記記入します。

```smarty
{* $errors = [] *}
{assign_array var="errors" values=""}
```

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

#### バリデーション処理を実装する
ユーザーの入力値をチェックし、errors変数に結果を代入します。  
入力値を参照するためには、下記のいずれかの変数を利用します。

| 変数名 | 説明 |
| :--- | :--- |
|$smarty.post | 画面から入力されたフォームデータ |

```smarty
{assign_array var="errors" values=""}

{* [例] POSTされたメールアドレスが特定のドメインと一致しなければエラーを返す *}
{if $smarty.post.ext_1|strpos:'@example.com' === false}
  {* $errors = ["メールアドレスが不正です。"] *}
  {assign var="errors." value="メールアドレスが不正です。"}
{/if}
```

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


#### 保存する
処理の記述が完了したら、[追加] ボタンをクリックし保存してください。
![Image from Gyazo](https://t.gyazo.com/teams/diverta/98ffd9dd3fb6393dbd09df39f739838e.png)


## カスタム処理にコンテンツ定義を関連付ける
次にコンテンツ定義をカスタム処理に関連付けます。  

### コンテンツ定義リスト画面で、関連付けるコンテンツ定義のIDを確認する
[コンテンツ定義] をクリックします。  

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

事前準備で作成したコンテンツ定義のIDを確認します。
![Image from Gyazo](https://t.gyazo.com/teams/diverta/c03e167af024f2f676e2a32d37c2f7e9.png)

### コンテンツ定義IDカスタム処理に関連付ける

コンテンツ定義IDを作成したカスタム処理に関連付けます。

- これを使ったコンポーネント：コンテンツのバリデーション前
- 値：カスタム処理を適用するコンテンツ定義ID
![Image from Gyazo](https://t.gyazo.com/teams/diverta/4fcc294ba59df7971d0d937f99891819.png)

#### 保存する
コンテンツ定義IDの入力が完了したら、[更新する] ボタンをクリックし保存してください。

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

## バリデーションの動作を確認する
コンテンツ編集画面からリクエストを行い、バリデーション処理の動作を確認します。

### コンテンツ編集を表示する
事前準備で作成したコンテンツの一覧画面で[追加]をクリックします。  
![Image from Gyazo](https://t.gyazo.com/teams/diverta/9e2b7cd3ab4554079587acfde0767728.png)

### エラーが出力される値を入力する
下記の通り、エラーが出力される値を[email]に入力します。　  
入力が完了したら、[追加する] ボタンをクリックします。

![Image from Gyazo](https://t.gyazo.com/teams/diverta/4b042472cb3b76bb1dd80d4f521d40fe.png)
![Image from Gyazo](https://t.gyazo.com/teams/diverta/2e5f71ba2fa8ff61e809738187db2305.png)

### エラー内容を確認する
想定通りのエラーが出力されることを確認します。

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

以上でカスタム処理とコンテンツ定義の関連付けが完了です。  

## バリデーションエラーが発生しない場合の確認ポイント
入力チェックが想定通りに行われない場合は、下記のポイントを確認してください。
- 関連付いているカスタム処理が正しいか
- 変数名(errors)が正しいか
- チェック対象の項目名が正しいか
- バリデーション処理のロジックが正しいか

## コード例の紹介
カスタム処理に利用できるコード例を紹介します。

| 変数名 | 説明 |
| :--- | :--- |
|$smarty.get | クエリパラメータ |
|$smarty.post | 画面から入力されたフォームデータ |
|$smarty.request | クエリパラメータ & 画面から入力されたフォームデータ |


### 特定の文字列を含むかどうかをチェックする

```smarty
{if $smarty.post.column_name|strpos:"期待する文字列" === false}
  {assign var="errors." value="column_nameが不正です。"}
{/if}
```

### 数値かどうかをチェックする

```smarty
{if !$smarty.post.parameter_name|is_numeric}
  {assign var="errors." value="parameter_nameは数値で入力してください。"}
{/if}
```

### 特定の項目に依存した入力チェックを行う

```smarty
{*
    [例] ext_1に1が入力された場合のみ、ext_2を必須項目とする
    ext_1: セレクト項目 ('', '1', '2')
    ext_2: テキスト項目
*}
{if $smarty.post.ext_1 === '1' || (
  !$smarty.post.ext_1|@empty &&
  $smarty.post.ext_1.key === '1'
)}
  {if !isset($smarty.post.ext_2) || $smarty.post.ext_2 === ''}
    {assign var="errors." value="テキスト項目は必須項目です。"}
  {/if}
{/if}
```

### 特定のグループに所属するメンバーにのみ入力チェックを適用する

```smarty
{*
  member_group_id=1は管理者権限グループになります。
*}
{assign var="member_group_id" value="1"}
{if $member_group_id|rcms_in_array:$smarty.session.arrGroup_id}
  {if !isset($smarty.post.ext_1)}
    {assign var="errors." value="ext_1は必須項目です。"}
  {/if}
{/if}
```

:::tip
CSVアップロード時にバリデーションをかける場合は`$smarty.post`の代わりに`$uploaded_row`の変数で行データを参照してください。
:::

## 関連ドキュメント
- [カスタム処理に利用できる変数一覧](/ja/docs/reference/trigger-variables/)
