2014-07-18 47 views
3

我試圖找出最好的 - 或者真正的任何工作方式 - 將鍵/值對存儲在SharePoint託管的應用程序中。這些配對需要:SharePoint託管的應用程序的商店屬​​性

  • 如果設置存在,啓動時加載,否則使用默認值。
  • 按需創建 - 即。用戶可以在UI中添加新設置,然後在代碼中的其他位置使用該設置進行更改。例如,使用自定義的文本字符串作爲列表名稱,而不是應用程序的默認設置。

我試過使用PropertyBag,但嘗試寫入時遇到Access Denied錯誤。

我也試過使用一個列表,但有問題讓技術正常工作。

有沒有人有一個好方法的建議,以及如何做。如果這些是最好的方法,我很樂意重溫我已經嘗試過的技術。

請記住,這個問題應該限制在SharePoint託管的應用程序中。這意味着C#和服務器端代碼都沒有了。

回答

1

下面是我最終使用的解決方案 - 將設置存儲在應用程序主機網站的列表中。

它由以下幾個函數組成。

CreateSettingsList:

使創建與領域標題和價值,這是我用它來存儲設定名稱和值將與它相關的普通列表。這在文檔就緒函數中被調用,以確保已經創建了一個列表,並且如果已經有了,它會繼續並嘗試讀取它。如果列表之前不存在,我調用一個函數來初始化列表中的默認變量值。

//___________________________________Create settings list________________________________________  
function createSettingsList() 
{ 
    // Create a SharePoint list with the name that the user specifies. 
    var hostUrl = decodeURIComponent(getQueryStringParameter("SPHostUrl")); 
    var hostContext = new SP.AppContextSite(currentContext, hostUrl); 
    var hostweb = hostContext.get_web(); 

    var listCreationInfo = new SP.ListCreationInformation(); 

    //title the list 
    listCreationInfo.set_title("PTOAppSettings"); 

    //set the base type of the list 
    listCreationInfo.set_templateType(100); //generic list 
    listCreationInfo.set_description("A list for custom app settings. If you have uninstalled the Paid Time Off App with no intention of reinstalling, this list can be safely deleted."); 

    var lists = hostweb.get_lists(); 
    //use the creation info to create the list 
    var newList = lists.add(listCreationInfo); 

    var fieldCollection = newList.get_fields(); 

    //add extra fields (columns) to the list & any other info needed. 
    fieldCollection.addFieldAsXml('<Field Type="Text" DisplayName="Value" Name="Value" />', true, SP.AddFieldOptions.AddToDefaultContentType); 
    newList.update(); 

    currentContext.load(fieldCollection); 
    currentContext.load(newList); 
    currentContext.executeQueryAsync(onSettingsListCreationSuccess, onSettingsListCreationFail);  
} 

function onSettingsListCreationSuccess(){ 
    //All is well. 
    initializeSettings(); 

} 

function onSettingsListCreationFail(sender, args) { 
    //alert("We didn't create the list. Here's why: " + args.get_message()); 

    //If a list already exists, we expect the creation to fail, and instead try to read from the existing one. 
    getSetting("VAR_CCEmail"); 
} 

初始化:

初始化會爲我將來可能會被存儲變量新的列表項目。我將它們的值設置爲「」或者如果它們沒有被使用,則爲null。

//___________________________________Initialize setting(s)________________________________________ 
function initializeSettings() 
{ 
    //Get info to access host web 
    var hostUrl = decodeURIComponent(getQueryStringParameter("SPHostUrl")); 
    var hostContext = new SP.AppContextSite(currentContext, hostUrl); 
    var hostweb = hostContext.get_web(); 

    //Get list in host web 
    var lstObject = hostweb.get_lists().getByTitle("PTOAppSettings"); 

    //Prepare an object to add a new list item. 
    var listItemCreationInfo = new SP.ListItemCreationInformation(); 
    var newItem = lstObject.addItem(listItemCreationInfo); 

    //Create item. You should repeat this for all the settings you want to track. 
    newItem.set_item('Title', "VAR_CCEmail"); 
    newItem.set_item('Value', ""); 

    //Write this new item to the list 
    newItem.update(); 

    currentContext.executeQueryAsync(onListItemSuccess, onListItemFailure); 

    function onListItemSuccess() { 

     //Load customizations, if any exist 
     getSetting("VAR_CCEmail"); 
    } 

    function onListItemFailure(sender, args) { 
     bootbox.dialog({ 
      title: "Something went wrong!", 
      message: "We were unable to initialize the app settings! Here's what we know about the problem: " + args.get_message() + '\n' + args.get_stackTrace(), 
      buttons: { 
       success:{ 
        label: "Ok" 
       } 
      }  
     }); 
    } 
} 

集:

集是接受設置名稱和值,並允許您更新存儲在一個給定的變量的值相當簡單的功能。

//___________________________________Set setting________________________________________ 
function setSetting(setting, value){ 

    //Get info to access host web 
    var hostUrl = decodeURIComponent(getQueryStringParameter("SPHostUrl")); 
    var hostContext = new SP.AppContextSite(currentContext, hostUrl); 
    var hostweb = hostContext.get_web(); 

    //Get list in host web 
    var list = hostweb.get_lists().getByTitle("PTOAppSettings"); 

    //A caml query get the appropriate setting 
    var queryXml = "<View><Query><Where><Eq><FieldRef Name='Title' /><Value Type='Text'>" + setting + "</Value></Eq></Where></Query></View>" 
    var query = new SP.CamlQuery(); 
    query.set_viewXml(queryXml); 

    var items = list.getItems(query); 

    currentContext.load(items); 
    currentContext.executeQueryAsync(onListItemSuccess, onListItemFailure); 
    function onListItemSuccess() {  
     //looking up a specific setting should only return one item in the array. 
     var item = items.getItemAtIndex(0); 
     //update the value for the item. 
     item.set_item("Value", value); 

     item.update(); 
    } 

    function onListItemFailure(sender, args) { 
     bootbox.dialog({ 
      title: "Something went wrong!", 
      message: "We were unable to set app settings! Here's what we know about the problem: " + args.get_message() + '\n' + args.get_stackTrace(), 
      buttons: { 
       success:{ 
        label: "Ok" 
       } 
      }  
     }); 
    } 
} 

得到:

獲取讀取列表中,找到您指定的設置,然後確定是否與設置「」或空相關聯的值或者如果它是一個實際的價值。如果它是一個實際值,我將該值寫入該程序用來處理該設置的全局變量。

//___________________________________Get setting________________________________________ 
function getSetting(setting) { 
var hostUrl = decodeURIComponent(getQueryStringParameter("SPHostUrl")); 
var hostContext = new SP.AppContextSite(currentContext, hostUrl); 
var hostweb = hostContext.get_web(); 
var list = hostweb.get_lists().getByTitle("PTOAppSettings"); 

//A caml query to get manager name for the record where user is equal to current user. 
var queryXml = "<View><Query><Where><Eq><FieldRef Name='Title' /><Value Type='Text'>" + setting + "</Value></Eq></Where></Query></View>" 
var query = new SP.CamlQuery(); 
query.set_viewXml(queryXml); 

var items = list.getItems(query); 

currentContext.load(items); 
currentContext.executeQueryAsync(
function() //on success. 
{ 
    //get first (and only) item. 
    var item = items.getItemAtIndex(0);  
    var value = item.get_item("Value"); 

    //If the property is empty it hasn't been set. 
    if (value === "" || value === null){ 
     //Return null to the appropriate global variable. Not all of the settings in this switch are implemented in the program yet, but may be later. 
     switch(setting) { 
      case "VAR_PaidTimeOff": 
       paidTimeOffListName = ""; 
       break; 
      case "VAR_Contacts": 
       contactsListName = ""; 
       break; 
      case "VAR_CCEmail": 
       carbonCopyEmail = ""; 
       break; 
     } 
    } 
    else 
    { 
     //Return the value. Not all of the settings in this switch are implemented in the program yet, but may be later. 
     switch(setting) { 
      case "VAR_PaidTimeOff": 
       paidTimeOffListName = value; 
       break; 
      case "VAR_Contacts": 
       contactsListName = value; 
       break; 
      case "VAR_CCEmail": 
       carbonCopyEmail = value; 
       break; 
     } 
    } 

}, 
function(sender,args){ 
    bootbox.dialog({ 
     title: "Something went wrong!", 
     message: "We were unable to get app settings! Here's what we know about the problem: " + args.get_message() + '\n' + args.get_stackTrace(), 
     buttons: { 
      success:{ 
       label: "Ok" 
      } 
     }  
    }); 
}); 
} 

這可以擴展到包括其他功能做其他特殊任務,例如,你可以做我提到的「createSetting」的功能,它會讓你在飛行中添加新設置(的要求之一我最初的問題)。在我的情況下,初始化一組設置滿足了我的需求,但其他設置可能需要編寫更多的方法。

+0

只是想說謝謝,我一直在尋找一個解決方案,爲我的SP託管應用程序與這個完全相同的問題,我發現所有我寫到web配置文件和代碼隱藏解決方案,但正如你所知;我們在SP-Hosted中最接近的就是JS。非常感謝,您的解決方案真的幫助我:-)。 – Haden693

相關問題