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需要向 repo 端 Web 服务发出Alfresco.util.Ajax.request,该服务检查所选用户名的可用性。所以基本上,当响应出现时,我原来的 validateUsername 方法已经完成,返回 false(可能)。

到目前为止,我的进展是禁用提交按钮(这就是我将“”传递给验证处理程序的原因),如果用户名很好,则启用成功/失败回调。

制作同步验证器的好方法是什么?

一个附带的问题是,是否有更好的方法将验证处理程序的范围设置为“ this ”,而不是通过(这个也可以,这只是为了确保我不会错过更好的方法)。

4

2 回答 2

1

这是创建站点表单的一个片段。它做同样的事情并检查短名称是否已经存在,如果被采用则显示错误。

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
            }
         });

所以这是客户端 JavaScript 文件 create-site.js,它在提交之前执行 ajax 调用。

于 2013-01-16T19:00:12.287 回答
1

我的解决方法是这样的:

  1. 向表单添加自定义验证,并将“var me = this”传递给验证器函数以获取范围。

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

  2. 添加一个验证处理函数,它将 a. 禁用提交按钮并将“检查” 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. 编写一个后端 webscript username-available.get,只有当用户名是免费的(并且有效,即使我有另一个验证器)时才会返回成功。

  4. onUsernameAvailable会将提交按钮设置为再次启用并再次运行验证(因为其他字段)并将 CSS 类更改为“有效”。

  5. onUsernameTaken将 CSS 类设置为“taken”。

这就是我最终这样做的方式。

于 2013-01-17T12:10:27.827 回答