2014-07-18 51 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

相关问题