---
title: "事前コミットトリガーを持つアクションスクリプト"
slug: "action-script-with-a-pre-commit-trigger"
abstract: "ファイル名とファイル形式に基づいて資産を保存する前に検証・分類する事前コミットトリガーを持つウェブスクリプトの例。"
---
# 事前コミットトリガーを持つアクションスクリプト

この例は、エンティティデータを保存する前に自動的に検証または修正する方法を示しており、必要なすべてのフィールドが完全でビジネスルールに準拠していることを保証します。ウェブスクリプトはプリ *コミット* トリガーに接続されており、適用された変更がシステムに保存される前に実行されます。これは、画像やウェブに適したファイルタイプを、大量アップロード時に手動で介入せずに適切に分類するのに役立つのに役立ちます。

> !注**始める前に**
> 
> -   スクリプトで参照されているアセットがContent Hubスキーマに存在していることを確認してください。
>     
> -   スクリプトロジックで使用されるTitleやDescriptionなどの必要なプロパティを定義します。
>     
> -   スクリプトを実行するユーザーやロールが参照対象エンティティを作成または変更する必要な権限を持っているか確認してください。
>     

## 文字

using System.Linq;

var webExtensions = new { ".jpg", ".jpeg", ".png", ".gif" };

var entity = Context.Target as IEntity;

// Make sure that the following members are loaded
await entity.LoadMembersAsync(new PropertyLoadOption("FileName"), new RelationLoadOption("AssetTypeToAsset"));

var filename = entity.GetPropertyValue<string>("FileName");
if (string.IsNullOrEmpty(filename)) return; // No filename, nothing to do.

var extension = GetExtension(filename)?.ToLowerInvariant();

if (string.IsNullOrEmpty(extension)) return;
if (!webExtensions.Contains(extension)) return;

var query = Query.CreateQuery(entities =>
 from e in entities
 where e.Identifier == "M.AssetType.Web"
 select e);

var webTypeId = await MClient.Querying.SingleIdAsync(query);
if (!webTypeId.HasValue) return;

var relation = entity.GetRelation<IChildToOneParentRelation>("AssetTypeToAsset");
if (relation == null) return;

relation.Parent = webTypeId;

string GetExtension(string path)
{
 var tokens = path.Split('.');
 if (tokens.Length > 1)
 {
 return "." + tokenstokens.Length - 1;
 }
 return null;
}

## 脚本の説明

このセクションでは、スクリプトを実行順に順に進め、各パートについて説明します。番号付きの項目はシーケンスを記述しており、実行命令ではありません。

1.  スクリプトで使用するライブラリを含めてください。どのライブラリを含めるべきかを理解するには、「 [コンテキストプロパティ](https://doc.sitecore.com/ch/ja/developers/cloud-dev/script-properties.html "Script properties") (プロパティタイプ)」を参照してください。
    
    using System.Linq;
    
2.  ウェブ互換のファイル拡張子のリストを定義し、どのファイルがウェブアセットと認められるかを判断します。
    
    var webExtensions = new { ".jpg", ".jpeg", ".png", ".gif" };
    
3.  ファイル名プロパティとアセットタイプの関係が読み込まれていることを確認してください。もし読み込まれていなければ、怠惰に読み込まれます。
    
    // Make sure that the following members are loaded
    await entity.LoadMembersAsync(new PropertyLoadOption("FileName"), new RelationLoadOption("AssetTypeToAsset"));
    
4.  コンテキスト(Context.Target)からターゲットエンティティを取得し、必要なメンバーを読み込みます。これにはFileNameプロパティとAssetTypeToAsset関係が含まれます。エンティティが無効またはファイル名が空の場合、スクリプトは終了します。
    
    var entity = Context.Target as IEntity;
    
    // Make sure that the following members are loaded
    await entity.LoadMembersAsync(new PropertyLoadOption("FileName"), new RelationLoadOption("AssetTypeToAsset"));
    
    var filename = entity.GetPropertyValue<string>("FileName");
    if (string.IsNullOrEmpty(filename)) return;
    
    > !警告Targetオブジェクトタイプはトリガーの目的(例えばエンティティ、エンティティ定義、ポリシー)に依存します。この場合、トリガーの目的は*Entity creation*と*Entity modification*です。したがって、IEntityにTargetをキャストする必要があります。
    
5.  GetExtensionヘルパーメソッドを使ってファイル名から拡張子を抽出します。拡張子がウェブ互換拡張子のリストに存在しない場合、スクリプトは終了します。
    
    var extension = GetExtension(filename)?.ToLowerInvariant();
    
    if (string.IsNullOrEmpty(extension)) return;
    if (!webExtensions.Contains(extension)) return;
    
6.  M.AssetType.Webエンティティを見つけるクエリを作成します。エンティティが見つからなければ、スクリプトは終了します。
    
    var query = Query.CreateQuery(entities =>
     from e in entities
     where e.Identifier == "M.AssetType.Web"
     select e);
    
    var webTypeId = await MClient.Querying.SingleIdAsync(query);
    if (!webTypeId.HasValue) return;
    
    > !注[MClientオブジェクト](https://doc.sitecore.com/ch/ja/developers/cloud-dev/overview.html "Overview")は常に利用可能で、すべてのスクリプトタイプで使用できます。
    
7.  アセットからAssetTypeToAssetリレーションを取得します。リレーションが存在する場合、そのリレーションの親をM.AssetType.Webエンティティに設定し、アセットをウェブアセットタイプにリンクさせます。リレーションがなければスクリプトは終了します。
    
    var relation = entity.GetRelation<IChildToOneParentRelation>("AssetTypeToAsset");
    if (relation == null) return;
    
    relation.Parent = webTypeId;
    
8.  ヘルパーメソッドGetExtensionファイル名から拡張子を抽出し、関連するファイルタイプのみが処理されるようにします。
    
    string GetExtension(string path)
    {
     var tokens = path.Split('.');
     if (tokens.Length > 1)
     {
     return "." + tokenstokens.Length - 1;
     }
     return null;
    }
    

> !注IDだけを回収するにはContext.TargetIdを使えますが、エンティティ全体を取り戻したい場合はContext.Targetを使うことをお勧めします。

## セットアップ

1.  **タクソノミー**ページで、*識別子M.AssetType.Web*の*Web*名の[アセットタイプを作成します](https://doc.sitecore.com/ch/en/users/content-hub/add-values-to-a-taxonomy.html)。
2.  [上記のスクリプトを作成](https://doc.sitecore.com/ch/ja/developers/cloud-dev/work-with-scripts.html "Work with scripts")*Action*
3.  *Action script*[のアクションを作成し、スクリプトにリンクします。](https://doc.sitecore.com/ch/ja/developers/cloud-dev/create-an-action.html "Create an action")
4.  [新しいトリガーを作成し](https://doc.sitecore.com/ch/ja/developers/cloud-dev/create-a-trigger.html "Create a trigger") 、そのトリガーの目標を *Entity creation* と *Entity modification*に設定します。
    -   トリガー条件でエンティティの定義を追加 *Asset* 「 *Filename has changed」*という条件を追加します。
    -   トリガーアクションで新しいアクションを **事前コミット**アクションに追加します。
5.  トリガーをセーブして有効化してください。