I am trying to warn the user when deleting a page that is referenced as dynamic content by another page. Much like the ID reference already works.
Hello Ola
You should look into EPiServer content events. These allow you to interact with specific events for your content. Its normally best to use an EPiServer Initialisation module for this: http://jondjones.com/how-to-hook-into-the-episerver-cms-events-pipeline/. The event you should be using is DeletingContent: http://world.episerver.com/documentation/class-library/?documentId=cms/7/fe4ab4ca-7733-9d0c-ff96-e56bb77eaef6
It should be noted that you can only stop the event, not warn users.
If you wanted to warn users then you could think implementing a IValidator which will allow you to show some validation messages to the user such as "Warning: Reference by content XXX, if you delete there could be issues". This message would however be shown each time a user looked at the content not just when attempting to delete, which is probably not the right experience: http://www.david-tec.com/2012/06/EPiServer-7-Preview---IValidator-interface/
David
I am using episerver 6 so I'm hooking up to events via the Datafactory. But the DeletingPage event does not trigger when clicking the delete button in the context menu in the tree. It triggers when deleting, as it should. That's not what I need. I need the step before. I need to hook up to the event triggered when clicking delete on the context menu. That way I want to set up the deletepage with additional infromation, to inform user that the page you are about to delete is referenced as dynamic content by another page.
Apologies, I didn't notice it was a 6 R2 thread. You actually have some choices in that case. Its possible to modify the EPiServer UI with your own implementation. See my previous blog on how to achieve this:
http://www.david-tec.com/2010/05/Customising-the-EPiServer-UI/
The page you need to override is /<EPIServer url>/CMS/edit/DeletePage.aspx
David
Great thanks! The guide was really helpful. Works fine.
I have a follow up question though.
How do I check if a page is referenced as dynamic content by another page? When deleting a page I need to know if some other page is referencing the page and rendering it.
Hello Ola
Something like this will allow you to look for links on a page (psedo code below). Note this code is inspired from my post: http://www.david-tec.com/2010/04/Automatically-convert-external-links-to-the-current-site-into-internal-links/ (kind of a reverse logic to what you want to do).
private string containsInternalLinks(PageData yourCurrentPage) { // Loop properties on the page looking for those that can contain links foreach (var property in yourCurrentPage.Property) { if (property.Value != null) { //URL to page/external address if (typeof(PropertyUrl) == property.GetType()) { if (this.containsLink((PropertyUrl)property)) { return "Contains link to page"; } } //XHTML string (>255) else if (typeof(PropertyXhtmlString) == property.GetType()) { if (this.containsLink(property.Value.ToString())) { return "Contains link to page"; } } //Link Collection else if (typeof(PropertyLinkCollection) == property.GetType()) { foreach (var link in ((PropertyLinkCollection)property).Links) { string convertedUrl = string.Empty; if (this.convertLink(link.Href, out convertedUrl) == false) return "Contains link to page"; } } } } } private bool containsLink(PropertyUrl urlProperty) { string returnUrl = urlProperty.Value.ToString(); try { //Inspect the contents and replace with an internal link if necessary if (urlProperty.Value != null && urlProperty.ReferencedPermanentLinkIds.Count > 0) { return true; } } catch { } return false; } private bool containsLink(string SourceXhtml) { string returnXhtml = SourceXhtml; try { string RegexPattern = @"<a.*?href=[""'](?<url>.*?)[""'].*?>(?<name>.*?)</a>"; // Find URL matches MatchCollection matches = Regex.Matches(returnXhtml, RegexPattern, RegexOptions.IgnoreCase); foreach (Match m in matches) { //Inspect the href part of each link found string originalUrl = m.Groups["url"].Value; string convertedUrl; if (this.convertLink(originalUrl, out convertedUrl) == false) { return true; } } } catch { } return false; } private bool convertLink(string originalUrl, out string convertedUrl) { bool returnVal = false; UrlBuilder covertedUrlBuilder = new UrlBuilder(originalUrl); convertedUrl = originalUrl; //Only attempt to convert to an internal URL if the site host is the same and the url starts with http if (originalUrl.StartsWith("http") && covertedUrlBuilder.Host == EPiServer.Configuration.Settings.Instance.SiteUrl.Host) { returnVal = Global.UrlRewriteProvider.ConvertToInternal(covertedUrlBuilder); if (returnVal) convertedUrl = covertedUrlBuilder.ToString(); } return returnVal; }
I am fairly new to EpiServer, but...
...does anybody know if there is a way to hook up to the event that is triggered when clicking the delete button in the page tree's context menu? (Right clicking the context and choosing delete)
What I am trying to accomplish, is to send some additional data to the delete page. Need to notify user with this additional data before deleteing the page.