Power AppsのポータルではJavaScriptを使用してバリデーションをかけることができる。
そのバリデーションのかけ方が少し複雑だったので、その方法をメモ。
ポータルのバリデーション
Power Appsポータルのバリデーション処理(JavaScript)は
- エンティティフォーム(基本フォーム)全体
 - Webフォーム(詳細フォーム)全体
 - 列単位(エンティティフォーム、Webフォーム共通)
 
に対して設定することができる。
さらに、エンティティフォームとWebフォームはそれぞれJavaScriptを書ける場所が複数あって、
- エンティティフォームを載せるWebページ
 - エンティティフォーム自体
 
- Webフォームを載せるWebページ
 - Webフォームの各ステップ
 
に書くことができる。
この時点で少しややこしいけど、さらにエンティティフォームとWebフォームでは、使用するJavaScriptの機能が異なっていてさらにややこしい。。。
※Webフォーム(詳細フォーム)についてはこちら
https://docs.microsoft.com/ja-jp/powerapps/maker/portals/configure/web-form-steps
エンティティフォーム(基本フォーム)のバリデーション
まずはエンティティフォーム全体のバリデーションについて。
エンティティフォームのバリデーションには「entityFormClientValidate」を使用する。
コードはこんな感じ。
 if (window.jQuery) {  
   (function ($) {  
     if (typeof (entityFormClientValidate) != 'undefined') {  
       var originalValidationFunction = entityFormClientValidate;  
       if (originalValidationFunction && typeof (originalValidationFunction) == "function") {  
         entityFormClientValidate = function ()   
          {  
             // ここでバリデーション処理
             if(...){
                 return true;
             }else{
                 return false;
             } 
         };  
       }  
     }  
   }(window.jQuery));  
 }  
これを「エンティティフォームを載せるWebページ」または「エンティティフォーム自体」に設定する。
Webページに設定する場合


※Webページに設定する場合、
「Information -> 詳細設定」じゃだめで、「Content Page -> 詳細設定」に設定する必要がある。
たぶん日本語でポータルを作っているから、ローカライズされたページの方に設定しなきゃいけないんだと思われ。
エンティティフォームに設定する場合
続いてエンティティフォーム自体に設定する場合。

Webフォーム(詳細フォーム)のバリデーション
Webフォーム全体のバリデーションには「webFormClientValidate」を使用する。
コードはこんな感じ。
if (window.jQuery) {
   (function ($) {
        webFormClientValidate = function() {
             // ここでバリデーション処理
             if(...){
                 return true;
             }else{
                 return false;
             } 
        };
   }(window.jQuery));
}
これを「Webフォームを載せるWebページ」または「Webフォームの各ステップ」に設定する。
Webページに設定する場合
Webページに設定する場合はエンティティフォームと同じ場所にJavaScriptを書く。

ステップごとに設定する場合
続いてWebフォームの各ステップごとに設定する場合。


こっちで設定すると、そのステップだけでバリデーションが適用される。
列ごとのバリデーション
最後はフォームの列ごとにバリデーションを追加したい場合。



※内部のalertはデバッグのために入れただけなので不要。
エラーメッセージが必要
今回紹介した方法だと、「列ごとのバリデーション」のサンプル以外はエラーメッセージが表示されない。
どの項目がエラーか?をユーザーに示すためには、別途エラーメッセージの実装が必要。
おまけ:Webフォームのバリデーションの公式の情報について
公式にあるWebフォームのバリデーション処理がこれなんだけど、
if (window.jQuery) {
   (function ($) {
      if (typeof (webFormClientValidate) != 'undefined') {
         var originalValidationFunction = webFormClientValidate;
         if (originalValidationFunction && typeof (originalValidationFunction) == "function") {
            webFormClientValidate = function() {
               originalValidationFunction.apply(this, arguments);
               // do your custom validation here
               // return false; // to prevent the form submit you need to return false
               // end custom validation.
               return true;
            };
         }
      }
   }(window.jQuery));
}
どうもこれが動かない。。。



コメント