2

登録シナリオで Alfresco Share クライアント側フォームがあり、選択したユーザー名が使用されているかどうかを検証したいと考えています。

Alfrescoフォームバリデーターを同期的に追加できますか?

これまでのところ、私のフォームは次のようになります。

this.widgets.saveForm = new Alfresco.forms.Form(this.id + "-form");
this.widgets.saveForm.addValidation(Dom.get(this.id + "-username"), this.validateUsername, me, "blur", this.msg("validation-hint.username-taken"));

ただし、this.validateUsernameは、選択したユーザー名の可用性をチェックするリポジトリ側の Web サービスに対してAlfresco.util.Ajax.requestを作成する必要があります。したがって、基本的に、応答がここに来るまでに、元の validateUsername メソッドは長い間終了しており、false を返します (おそらく)。

これまでの進捗状況は、送信ボタンを無効にすることです (そのため、「me」を検証ハンドラーに渡しています)。ユーザー名が問題ない場合は、成功/失敗のコールバックで有効にします。

同期バリデータを作成する適切な方法は何でしょうか?

副次的な質問は、私を渡すのではなく、検証ハンドラーのスコープを「 this 」に設定するより良い方法があるかどうかです(これも機能します。これは、より良い方法を見逃していないことを確認するためのものです)。

4

2 に答える 2

1

私の回避策はこれです:

  1. フォームにカスタム検証を追加し、バリデーター関数に「var me=this」を渡してスコープを取得します。

    this.widgets.saveForm.addValidation(Dom.get(this.id + "-username")、this.validateUsernameme、 "blur"、this.msg( "validation-hint.username-taken"));

  2. 検証ハンドラー関数を追加します。送信ボタンを無効にし、「チェック」CSSクラスをユーザーがフィードバックを受け取るための適切なフォームに設定します。コードスニップ:

    validateUsername: function Reg_validateUsername(el, me) {
    var val = this.fieldId.value;
    var username = trim(val);
    me.widgets.registerButton.set("disabled", true);
    Dom.addClass(me.id + "-username-img", "checking");
    Dom.removeClass(me.id + "-username-img", "hidden");
    Alfresco.util.Ajax.request({
        url: "/alfresco/service/slingshot/register/username-available?username=" + username
        , method: "GET"
        , successCallback: {
            fn: me.onUsernameAvailable
            , scope: me
        }
        , failureCallback: {
            fn: me.onUsernameTaken
            , scope: me
        }
    });
    
  3. ユーザー名が無料の場合にのみ成功を返すバックエンドwebscriptusername -available.getを記述します(そして、そのための別のバリデーターがありますが、有効です)。

  4. onUsernameAvailableは、送信ボタンを再度有効に設定し、(他のフィールドのために)検証を再度実行し、CSSクラスを「有効」に変更します。

  5. onUsernameTakenは、CSSクラスを「taken」に設定します。

それが私がこれをすることになった方法です。

于 2013-01-17T12:10:27.827 に答える
1

これは create-site フォームのスニペットです。同じことを行い、短い名前が既に存在するかどうかを確認し、使用されている場合はエラーを表示します。

createSiteForm.doBeforeFormSubmit =
         {
            fn: function()
            {
               var formEl = Dom.get(this.id + "-form");
               formEl.attributes.action.nodeValue = Alfresco.constants.URL_SERVICECONTEXT + "modules/create-site"; 

               this.widgets.okButton.set("disabled", true);
               this.widgets.cancelButton.set("disabled", true);

               // Site access
               var siteVisibility = "PUBLIC";
               if (this.widgets.isPublic.checked)
               {
                  if (this.widgets.isModerated.checked)
                  {
                     siteVisibility = "MODERATED";
                  }
               }
               else
               {
                  siteVisibility = "PRIVATE";
               }
               this.widgets.siteVisibility.value = siteVisibility;

               this.widgets.panel.hide();
               this.widgets.feedbackMessage = Alfresco.util.PopupManager.displayMessage(
               {
                  text: Alfresco.util.message("message.creating", this.name),
                  spanClass: "wait",
                  displayTime: 0
               });
            },
            obj: null,
            scope: this
         };

         // Submit as an ajax submit (not leave the page), in json format
         createSiteForm.setAJAXSubmit(true,
         {
            successCallback:
            {
               fn: this.onCreateSiteSuccess,
               scope: this               
            },
            failureCallback:
            {
               fn: this.onCreateSiteFailure,
               scope: this
            }
         });

これは、送信の直前に ajax 呼び出しを行うクライアント側の JavaScript ファイル create-site.js です。

于 2013-01-16T19:00:12.287 に答える