I enabled the Rating Scale on a list and it works well on list view. But, is there a way to add it in custom DispForm.aspx while enabling user to rate it dynamically when DispForm is opened? It shows on default DispForm.aspx but not when I create a custom one.
I also read this post but need to research more about PnP and how I could use the solution posted.
Edit 4/11/19
I found this post but could not figure out how to modify the following within my scenario. My list name is Training where I enabled the rating system. Below is what I have so far, the GetRating()
works but I still can't get the SetRating()
to work.
The code is in txt file and linked in a CEWP located below the main DispForm.aspx contents.
I started with
$(document).ready(function () {
ExecuteOrDelayUntilScriptLoaded(GetRating, "sp.js");
});
Modified GetRating
function:
function GetRating() {
var listUri = _spPageContextInfo.webServerRelativeUrl;
var itemID = GetUrlKeyValue("ID", false, location.href);
var spCtx = new SP.ClientContext(listUri);
var list = spCtx.get_web().get_lists().getByTitle("Training");
if(itemID > 0 ) {
this.itemRating= list.getItemById(itemID);
spCtx.load(itemRating);
spCtx.executeQueryAsync (
Function.createDelegate(this, this.onQuerySucceeded),
Function.createDelegate(this, this.onQueryFailed)
);
}
}
Modified SetRating
function that does not work. It doesn't give any error messages.
function SetRating(rValue) {
var listUri = _spPageContextInfo.webServerRelativeUrl;
var itemID = GetUrlKeyValue("ID", false, location.href);
var listGUIDURL = listUri +"/_api/web/lists/getByTitle('Training')?&select=Id";
//var listGUID = "";
var listGUID = _spPageContextInfo.pageListId;
$.ajax({
url: listGUIDURL,
method: "GET",
headers: { "Accept": "application/json; odata=verbose" },
success: function (data) {
if (data.d.Id != "") {
//listGUID = data.d.Id;
var spCtx = new SP.ClientContext(listUri);
EnsureScriptFunc('reputation.js', 'Microsoft.Office.Server.ReputationModel.Reputation', function () {
Microsoft.Office.Server.ReputationModel.Reputation.setRating(spCtx, listGUID, itemID, rValue);
spCtx.executeQueryAsync(
function() {
SP.UI.Notify.addNotification("Thank you for rating.", false);
GetRating();
}, function() {
SP.UI.Notify.addNotification("There was an error saving.", false);
});
});
}
},
error: function (data) { console.log("Failed to set rating"); }
});
}
When using the original code (without EnsureScriptFunc
line, it gives an error message Uncaught TypeError: Cannot read property 'Server' of undefined
. Using this reference, I added EnsureScriptFunc...
which no longer gives an error message but it doesn't do anything.
I also added the following in my master HTML:
<!--SPM:<SharePoint:ScriptLink ID="ScriptLink6" name="SP.js" runat="server" ondemand="false" localizable="false" loadafterui="true" />-->
<!--SPM:<SharePoint:ScriptLink ID="ScriptLink8" name="SP.Core.js" runat="server" ondemand="false" localizable="false" loadafterui="true" />-->
<!--SPM:<SharePoint:ScriptLink ID="ScriptLink9" name="Reputation.js" runat="server" ondemand="false" localizable="false" loadafterui="true" />-->