2016-04-01 24 views
0

私は、ユーザーがサイトのそのセクションにアクセスするための適切なアクセス許可を持っている場合、使用のアクセス許可レベルとグループメンバシップを確認し、ダイアログボックスを起動するためのコードを用意しています。それが最後に到達したときの対話は、ユーザーごとに自動的に起動しますのでJavaScriptで複数変数間でグローバル変数を使用するにはどうすればよいですか?

function bindSettingsButton() { 
      $("#mt-ngw-personalsettings").on("click", function() { 
       RequestNewSite(); 
      }); 
     } 

     function RequestNewSite() { 
      var HasPermission = false; 
      var isGroupMember = false; 
      CheckCurrentUserMembership(); 
      CheckUserHasEditPermissions(); 
      CheckUserPermissions(); 
     } 

     function CheckCurrentUserMembership() { 
      var clientContext = new SP.ClientContext.get_current(); 
      this.currentUser = clientContext.get_web().get_currentUser(); 
      clientContext.load(this.currentUser); 

      this.userGroups = this.currentUser.get_groups(); 
      clientContext.load(this.userGroups); 
      clientContext.executeQueryAsync(OnQuerySucceeded, OnQueryFailed); 
     } 

     function OnQuerySucceeded() { 
      var isMember = false; 
      var groupsEnumerator = userGroups.getEnumerator(); 
      while (groupsEnumerator.moveNext()) { 
       var group = groupsEnumerator.get_current(); 
       if(group.get_title() == "Create Site OptOut") { 
       isMember = true; 
       this.isGroupMember = true; 
       break; 
       } 
      } 
     } 

     function OnQueryFailed() 
     { 
      alert("Couldn't check user group membership. Please contact to resolve this issue."); 
     } 

     function CheckUserHasEditPermissions() { 
      context = new SP.ClientContext.get_current(); 
      web = context.get_web(); 
      this._currentUser = web.get_currentUser(); 
      this._theList = web.get_lists().getByTitle('siterequests'); 
      context.load(this._currentUser); 
      context.load(this._theList, 'EffectiveBasePermissions') 
      context.executeQueryAsync(Function.createDelegate(this, this.onPermissionsSuccessMethod), Function.createDelegate(this, this.onPermissionsFailureMethod)); 
     } 

     function onPermissionsSuccessMethod(sender, args) { 
      if (this._theList.get_effectiveBasePermissions().has(SP.PermissionKind.editListItems)) 
      { 
       this.HasPermission = true; 
      } 
      else 
      { 
       this.HasPermission = false; 
      } 
     } 

     function onPermissionsFailureMethod() 
      { 
       alert("Couldn't check permissions. Please contact to resolve this issue."); 
      } 

     function CheckUserPermissions() { 
      if(this.isGroupMember == true) 
      { 
       alert("You do not have permission to create sites. If you believe you should have access to this functionality, please contact ."); 
      } 
      else if(this.HasPermission == false) 
      { 
       alert("You do not have permission to create sites. If you believe you should have access to this functionality, please contact ."); 
      } 
      else 
      { 
       showDialogue(); 
       document.getElementById("next-stage").focus(); 
      } 
     } 

は、残念ながら、このセクションでは、変数HasPermissionとisGroupMemberはまだ定義されていません。 私はこのキーワードを悪用したと感じていますが、これはスコープのエラーですが、私はJSの中で確かに知っている、または修正できるほど専門家ではありません。誰かが私が間違ってやったことを正確に教えてもらえますか?

+0

便利なヒント:オブジェクト/ javascriptデザインパターン – GottZ

+1

あなたはJavaScriptを操作できることを認識しています。クライアント側で行うチェックはバイパスできますか?したがって、ユーザーが制御権を持っていないときにもサーバー上で実行する必要があります。 – Richard

+0

残念ながら、この環境ではサーバサイドコードはオプションではありません。このセキュリティの弱点は経営陣に指摘され、容認されたものとみなされています。 – JonS

答えて

1

を、可能にします完了していない。 onPermissionsSuccessMethodの後にCheckUserPermissionsに電話をかけ、OnQuerySucceededの機能が完了している必要があります。

HasPermissionisGroupMemberの変数は、RequestNewSite関数のローカル変数です。つまり、変数がCheckUserPermissions関数の範囲外です。

var HasPermission = false; 
    var isGroupMember = false; 
    var CompletedCallbacks = 0; 
    function bindSettingsButton() { 
     $("#mt-ngw-personalsettings").on("click", function() { 
      RequestNewSite(); 
     }); 
    } 

    function RequestNewSite() { 
     CheckCurrentUserMembership(); 
     CheckUserHasEditPermissions(); 
    } 

    function CheckCurrentUserMembership() { 
     var clientContext = new SP.ClientContext.get_current(); 
     this.currentUser = clientContext.get_web().get_currentUser(); 
     clientContext.load(this.currentUser); 

     this.userGroups = this.currentUser.get_groups(); 
     clientContext.load(this.userGroups); 
     clientContext.executeQueryAsync(OnQuerySucceeded, OnQueryFailed); 
    } 

    function OnQuerySucceeded() { 
     var isMember = false; 
     var groupsEnumerator = userGroups.getEnumerator(); 
     while (groupsEnumerator.moveNext()) { 
      var group = groupsEnumerator.get_current(); 
      if(group.get_title() == "Create Site OptOut") { 
      isMember = true; 
      isGroupMember = true; 
      break; 
      } 
     } 
     CompletedCallbacks++; 
     CheckUserPermissions(); 
    } 

    function OnQueryFailed() 
    { 
     alert("Couldn't check user group membership. Please contact [email protected] to resolve this issue."); 
    } 

    function CheckUserHasEditPermissions() { 
     context = new SP.ClientContext.get_current(); 
     web = context.get_web(); 
     this._currentUser = web.get_currentUser(); 
     this._theList = web.get_lists().getByTitle('siterequests'); 
     context.load(this._currentUser); 
     context.load(this._theList, 'EffectiveBasePermissions') 
     context.executeQueryAsync(Function.createDelegate(this, this.onPermissionsSuccessMethod), Function.createDelegate(this, this.onPermissionsFailureMethod)); 
    } 

    function onPermissionsSuccessMethod(sender, args) { 
     if (this._theList.get_effectiveBasePermissions().has(SP.PermissionKind.editListItems)) 
     { 
      HasPermission = true; 
     } 
     else 
     { 
      HasPermission = false; 
     } 
     CompletedCallbacks++; 
     CheckUserPermissions(); 
    } 

    function onPermissionsFailureMethod() 
     { 
      alert("Couldn't check permissions. Please contact [email protected] to resolve this issue."); 
     } 

    function CheckUserPermissions() { 
     if(CompletedCallbacks != 2) return; 
     if(isGroupMember == true) 
     { 
      alert("You do not have permission to create sites. If you believe you should have access to this functionality, please contact [email protected]"); 
     } 
     else if(HasPermission == false) 
     { 
      alert("You do not have permission to create sites. If you believe you should have access to this functionality, please contact [email protected]"); 
     } 
     else 
     { 
      showDialogue(); 
      document.getElementById("next-stage").focus(); 
     } 
    } 

このコードは有効です。

1
$("#mt-ngw-personalsettings").on("click", function() { 
    RequestNewSite(); 
}); 

あなたはコンストラクタとしてRequestNewSite使用することを期待している場合、あなたはそれを割り当てるためにnewを使用する必要があります。関数として呼び出すと、オブジェクトは生成されません(したがって状態も生成されます)。

さらに、タイプのすべてのメンバーをthisに明示的に作成する必要があります。

だから

function RequestNewSite() { 
    var HasPermission = false; 
    var isGroupMember = false; 
    CheckCurrentUserMembership(); 
    CheckUserHasEditPermissions(); 
    [...] 

ニーズものは、あなたが最初に開始しているにもかかわらず実行し続けます、コードの残りの部分を意味しますが、非同期機能を実行している

function RequestNewSite() { 
    this.HasPermission = false; 
    this.isGroupMember = false; 
    this.CheckCurrentUserMembership(); 
    this.CheckUserHasEditPermissions(); 
    [...] 
関連する問題