Alfresco共享客户端同步表单验证

时间:2013-01-12 15:05:42

标签: javascript forms share alfresco validation

我在注册方案中有一个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 需要将 Alfresco.util.Ajax.request 发送到回购方网络服务,该服务会检查所选用户名的可用性。所以基本上,当响应在这里时,我的原始validateUsername方法是long-finished,返回false(可能)。

我到目前为止的进展是禁用提交按钮(这就是为什么我将“ me ”传递给验证处理程序),并且如果用户名正常,则成功/失败回调会启用它。

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

一个侧面的问题是,如果有更好的方法将验证处理程序的范围设置为“ this ”,而不是传递(这个工作原理)这也只是为了确保我没有错过更好的方法。)

2 个答案:

答案 0 :(得分: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调用。

答案 1 :(得分:1)

我的解决方案是:

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

    this.widgets.saveForm.addValidation(Dom.get(this.id +“ - username”), this.validateUsername me ,“blur”,this的.msg( “验证-hint.username-截取”));

  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类设置为“已拍摄”。

  6. 这就是我最终做到这一点的方式。