How do I check if a property value has changed when saving in API?
Hello all.
I am currently working on a V4 event to stop certain umbraco user roles from changing the value of a property of a particular document type.
Here is the code I currently have so far
[code]
void Document_BeforeSave(Document sender, SaveEventArgs e)
{
//GET the current user logged into umbraco
User currentUser = umbraco.helper.GetCurrentUmbracoUser();
if (currentUser.UserType.Alias == "protoEditor")
{
//WE ARE THE protoEditor type
//Check IF the groupName property's value has been changed
if(sender.getProperty("groupName").VersionId != ..?..)
{
//Lets set the value back to it's original value
sender.getProperty("groupName").Value = "";
}
}
}
[/code]
I need some help with the IF and how to set the value back to it's original value.
Doing that Richard would cancel the save of the enitre document. I have other properties on the document that I want that type of umbraco user to edit.
//GET the current user logged into umbraco
User currentUser = umbraco.helper.GetCurrentUmbracoUser();
if (currentUser.UserType.Alias == "protoEditor")
{
//WE ARE THE protoEditor type
//IF the node we are editing is of docType = Network
if (sender.ContentType.Alias == "Network")
{
//GET the node as XML in the umbraco XML Cache doc
XPathNodeIterator networkXMLNode = umbraco.library.GetXmlNodeById(Convert.ToString(sender.Id));
//This while example from PeterD - I don't understand it personally ?!?
while (networkXMLNode.MoveNext())
{
if (networkXMLNode.Current.NodeType != System.Xml.XPath.XPathNodeType.Root)
{
XmlNode n = ((IHasXmlNode)networkXMLNode.Current).GetNode();
try
{
//SETUP a string to get our value doing an xPath select for the property value
previousGroupNameValue = n.SelectSingleNode("data [@alias='groupName']").InnerText;
}
catch
{
}
}
}
//Check IF the groupName property's value has been changed
if (Convert.ToString(sender.getProperty("groupName").Value) != previousGroupNameValue)
{
//Lets set the value back to it's original value
sender.getProperty("groupName").Value = previousGroupNameValue;
}
}
}
}
[/code]
I could do with some help to get a message bubble to appear to notify the user that the value has been changed back.
I stumble on this old post while looking for how to check if a field's value changed by getting old value and comparing to new (saving) value.
Im using 7.5.9 and wondering if there are more clear and neat way of doing this check (old value before save and new value while saving).
Did you figure out a better way of doing this check?
The bubble notification would be great as well since in my use case I would like to initiate an email when the checkbox field changed from ON to OFF or vice versa - and give the editor the indication an email notification is dispatched.
I was trying to figure out a way to comapre property values of a Member to check if a given property had been changed. I tried multiple ways, not including the one above because I thought that traversing xml nodes had to be my last resort.
The way I managed to comapre values was by hooking into the MemberServcie.Saving event.
When the event was fired I found that I had access to both the current Member state (args.SavedEntities) and the 'previous Member state (via the MemberService).
MembershipHelper memberHelper = new MembershipHelper(UmbracoContext.Current);
foreach(var member in args.SavedEntities)
{
bool currSubState = member.GetValue<bool>("<the_property_alias_to_compare>");
var prevMemberState = memberHelper.GetByEmail(member.Email);
LogHelper.Info(typeof(MemberEventHandler), "no prev member state? " + (prevMemberState == null));
LogHelper.Info(typeof(MemberEventHandler), String.Format("Previous Subscription State: {0}", prevMemberState != null && prevMemberState.GetPropertyValue<bool>("<the_property_alias_to_compare>")));
LogHelper.Info(typeof(MemberEventHandler), String.Format("New Subscription State: {0}", currSubState));
}
We must be careful because if we do not do a null check or check if the member is new ( ((IRememberBeingDirty)member).IsDirty() ), we will get a null reference exception when accessing the 'prevMemberState' as it does not exist!
How do I check if a property value has changed when saving in API?
Hello all.
I am currently working on a V4 event to stop certain umbraco user roles from changing the value of a property of a particular document type.
Here is the code I currently have so far
[code]
void Document_BeforeSave(Document sender, SaveEventArgs e)
{
//GET the current user logged into umbraco
User currentUser = umbraco.helper.GetCurrentUmbracoUser();
if (currentUser.UserType.Alias == "protoEditor")
{
//WE ARE THE protoEditor type
//Check IF the groupName property's value has been changed
if(sender.getProperty("groupName").VersionId != ..?..)
{
//Lets set the value back to it's original value
sender.getProperty("groupName").Value = "";
}
}
}
[/code]
I need some help with the IF and how to set the value back to it's original value.
Thanks,
Warren
Hi Warren
Can't you just Cancel the event? [code]e.Cancel = true[/code]
Then the document doesn't get saved at all and the editor get some sort of error message that something was wrong.
Cheers,
Richard
Doing that Richard would cancel the save of the enitre document. I have other properties on the document that I want that type of umbraco user to edit.
Cheers,
Warren
This is my current solution that is working that PeterD helped me out with.
[code]
void Document_BeforeSave(Document sender, SaveEventArgs e)
{
//SETUP string
string previousGroupNameValue = string.Empty;
//GET the current user logged into umbraco
User currentUser = umbraco.helper.GetCurrentUmbracoUser();
if (currentUser.UserType.Alias == "protoEditor")
{
//WE ARE THE protoEditor type
//IF the node we are editing is of docType = Network
if (sender.ContentType.Alias == "Network")
{
//GET the node as XML in the umbraco XML Cache doc
XPathNodeIterator networkXMLNode = umbraco.library.GetXmlNodeById(Convert.ToString(sender.Id));
//This while example from PeterD - I don't understand it personally ?!?
while (networkXMLNode.MoveNext())
{
if (networkXMLNode.Current.NodeType != System.Xml.XPath.XPathNodeType.Root)
{
XmlNode n = ((IHasXmlNode)networkXMLNode.Current).GetNode();
try
{
//SETUP a string to get our value doing an xPath select for the property value
previousGroupNameValue = n.SelectSingleNode("data [@alias='groupName']").InnerText;
}
catch
{
}
}
}
//Check IF the groupName property's value has been changed
if (Convert.ToString(sender.getProperty("groupName").Value) != previousGroupNameValue)
{
//Lets set the value back to it's original value
sender.getProperty("groupName").Value = previousGroupNameValue;
}
}
}
}
[/code]
I could do with some help to get a message bubble to appear to notify the user that the value has been changed back.
Warren
Hi Warren
I stumble on this old post while looking for how to check if a field's value changed by getting old value and comparing to new (saving) value.
Im using 7.5.9 and wondering if there are more clear and neat way of doing this check (old value before save and new value while saving).
Did you figure out a better way of doing this check?
The bubble notification would be great as well since in my use case I would like to initiate an email when the checkbox field changed from ON to OFF or vice versa - and give the editor the indication an email notification is dispatched.
Would greatly appreciate your input!
Hello,
I was trying to figure out a way to comapre property values of a Member to check if a given property had been changed. I tried multiple ways, not including the one above because I thought that traversing xml nodes had to be my last resort.
The way I managed to comapre values was by hooking into the MemberServcie.Saving event.
When the event was fired I found that I had access to both the current Member state (args.SavedEntities) and the 'previous Member state (via the MemberService).
We must be careful because if we do not do a null check or check if the member is new ( ((IRememberBeingDirty)member).IsDirty() ), we will get a null reference exception when accessing the 'prevMemberState' as it does not exist!
is working on a reply...