# 連携ルール

## はじめに

NocoBaseにおける連携ルールは、フロントエンドのUI要素のインタラクティブな動作を制御するための仕組みです。これにより、ユーザーはさまざまな条件に基づいて、UI内のブロック、フィールド、およびアクションの表示や動作ロジックを調整し、柔軟でローコードなインタラクティブ体験を実現できます。この機能は、継続的に改善・最適化されています。

連携ルールを設定することで、以下のようなことが実現できます。

- 現在のユーザーロールに基づいて特定のブロックを非表示/表示する。例えば、管理者は完全な情報を含むブロックを表示し、一般ユーザーは基本的な情報ブロックのみを表示するなど、ロールによって表示されるデータの範囲が異なるブロックを設定できます。
- フォームで特定のオプションが選択されたときに、他のフィールド値を自動入力またはリセットする。
- フォームで特定のオプションが選択されたときに、特定の入力項目を無効にする。
- フォームで特定のオプションが選択されたときに、特定の入力項目を必須にする。
- 特定の条件でアクションボタンの表示/非表示やクリック可否を制御する。

## 条件設定

![20251029114532](https://static-docs.nocobase.com/20251029114532.png)

### 左側の変数

条件の左側の変数は、連携ルールにおける「判断の対象」を定義するために使用されます。この変数の値に基づいて条件が評価され、連携アクションをトリガーするかどうかが決定されます。

選択可能な変数には、以下が含まれます。

- 「現在のフォーム/xxx」、「現在のレコード/xxx」、「現在のポップアップレコード/xxx」などのコンテキスト内のフィールド。
- 「現在のユーザー」、「現在のロール」などのシステムグローバル変数。これらは、ユーザーのIDや権限などの情報に基づいて動的に制御する場合に適しています。
  > ✅ 左側の変数で選択できる項目は、ブロックが配置されているコンテキストによって決まります。ビジネス要件に応じて、左側の変数を適切に使用してください。
  >
  > - 「現在のユーザー」は、現在ログインしているユーザーの情報を表します。
  > - 「現在のフォーム」は、フォームにリアルタイムで入力されている値を表します。
  > - 「現在のレコード」は、テーブルの行レコードなど、保存されているレコード値を表します。

### 演算子

演算子は、条件判断のロジック、つまり左側の変数と右側の値をどのように比較するかを設定するために使用されます。左側の変数のタイプによってサポートされる演算子は異なり、一般的な演算子は以下のとおりです。

- **テキストタイプ**：`$includes`、`$eq`、`$ne`、`$empty`、`$notEmpty`など
- **数値タイプ**：`$eq`、`$gt`、`$lt`、`$gte`、`$lte`など
- **ブールタイプ**：`$isTruly`、`$isFalsy`
- **配列タイプ**：`$match`、`$anyOf`、`$empty`、`$notEmpty`など

> ✅ システムは、左側の変数のタイプに基づいて利用可能な演算子のリストを自動的に推奨し、設定ロジックが適切であることを保証します。

### 右側の値

左側の変数と比較するために使用され、条件が満たされているかどうかを判断するための参照値となります。

サポートされる内容には、以下が含まれます。

- 定数値：固定の数値、テキスト、日付などを入力します。
- コンテキスト変数：現在のフォームの他のフィールド、現在のレコードなど。
- システム変数：現在のユーザー、現在時刻、現在のロールなど。

> ✅ システムは、左側の変数のタイプに基づいて、右側の入力方法を自動的に調整します。例えば、
>
> - 左側が「選択フィールド」の場合、対応するオプションセレクターが表示されます。
> - 左側が「日付フィールド」の場合、日付ピッカーが表示されます。
> - 左側が「テキストフィールド」の場合、テキスト入力ボックスが表示されます。

> 💡 右側の値（特に動的変数）を柔軟に活用することで、現在のユーザー、現在のデータ状態、コンテキスト環境に基づいた連携ロジックを構築し、より強力なインタラクティブ体験を実現できます。

## ルール実行ロジック

### 条件トリガー

ルール内の条件が満たされた場合（任意）、その下のプロパティ変更アクションが自動的に実行されます。条件が設定されていない場合は、ルールは常に満たされていると見なされ、プロパティ変更アクションが自動的に実行されます。

### 複数のルール

1つのフォームに複数の連携ルールを設定できます。複数のルール条件が同時に満たされた場合、システムはルールの設定順序に従って結果を前から順に実行し、最後の結果が最終的な実行基準となります。
例：ルール1がフィールドを「無効」に設定し、ルール2がフィールドを「編集可能」に設定している場合、両方のルールの条件が満たされると、フィールドは「編集可能」状態になります。

> 複数のルールの実行順序は非常に重要です。ルールを設計する際は、優先順位と相互関係を明確にし、ルールの競合を避けるようにしてください。

## ルール管理

各ルールに対して、以下の操作を実行できます。

- カスタム命名：管理と識別のために、ルールに分かりやすい名前を設定します。
- 並べ替え：ルール実行の優先順位に基づいて順序を調整し、システムが正しい順序でルールを処理するようにします。
- 削除：不要になったルールを削除します。
- 有効化/無効化：ルールを削除せずに一時的に無効にします。これは、特定の状況で一時的にルールを停止する必要がある場合に適しています。
- ルールの複製：既存のルールをコピーして新しいルールを作成し、重複する設定を避けます。

## 変数について

フィールドへの値の割り当てや条件設定では、定数だけでなく変数もサポートされています。変数リストはブロックの配置場所によって異なります。変数を適切に選択して使用することで、ビジネス要件をより柔軟に満たすことができます。変数に関する詳細については、[変数](/interface-builder/variables)を参照してください。

## ブロック連携ルール

ブロック連携ルールを使用すると、システム変数（現在のユーザー、ロールなど）やコンテキスト変数（現在のポップアップレコードなど）に基づいて、ブロックの表示を動的に制御できます。例えば、管理者は完全な注文情報を表示できますが、カスタマーサービスロールは特定の注文データのみを表示できます。ブロック連携ルールを通じて、ロールに基づいて対応するブロックを設定し、そのブロック内で異なるフィールド、アクションボタン、データ範囲を設定できます。ログインしているロールが対象ロールである場合、システムは対応するブロックを表示します。ブロックはデフォルトで表示されるため、通常はブロックを非表示にするロジックを定義する必要があることに注意してください。

👉 詳細はこちら：[ブロック/ブロック連携ルール](/interface-builder/blocks/block-settings/block-linkage-rule)

## フィールド連携ルール

フィールド連携ルールは、ユーザー操作に基づいてフォームまたは詳細ブロック内のフィールドの状態を動的に調整するために使用され、主に以下が含まれます。

- フィールドの **表示/非表示** の制御
- フィールドを **必須** にするかどうかの設定
- **値の割り当て**
- カスタムビジネスロジックを処理するためのJavaScriptの実行

👉 詳細はこちら：[ブロック/フィールド連携ルール](/interface-builder/blocks/block-settings/field-linkage-rule)

## アクション連携ルール

アクション連携ルールは現在、現在のレコード値や現在のフォームなどのコンテキスト変数、およびグローバル変数に基づいて、非表示/無効化などのアクション動作を制御することをサポートしています。

👉 詳細はこちら：[アクション/連携ルール](/interface-builder/actions/action-settings/linkage-rule)