Is there an event that fires when a File Summary is edited?

Vote:
 

Does anyone know of an event that can be hooked when the user edits a File Summary?

I know you can hook the addition or the change of a file.  But if someone right-clicks on a file and selects "Edit File Summary," they are not affecting the underlying file, so no event applies.

I suspect there is no such event or way of hooking this moment, but before I go do anything drastic, I thought I'd check if anyone else knows of some way to gracefully handle this.

#40169
Jun 10, 2010 16:04
Vote:
 

If I remember correctly there is no such event in EPiServer 5.  I also checked the SDK for version 6, could't find it there either.

#40170
Jun 10, 2010 19:45
Vote:
 

Thats correct. There exists now such event.

You can make you own by creating a page adaptor and attach yourself to the save button

 

#40172
Jun 10, 2010 21:29
Vote:
 

Following up on Anders suggestion I found that you can use a control adapter on controlType EPiServer.UI.Hosting.VirtualPathControl

I'd originally had a page adapter on ~/secure/CMS/admin/FileManagement.aspx but that doesn't work when you want to catch the save from both the Admin and Edit modes.

 

 

#41706
Jul 21, 2010 23:17
Vote:
 

Hi Deane,

Did you find a way to acheive this? I need to detect when the file summary has been edited.

Thanks,

Mark

#54800
Nov 03, 2011 13:21
Vote:
 

I think we did the control adapter route.  I'll check with the dev here that did it and we'll get you the code.

#54805
Nov 03, 2011 14:26
Vote:
 

To do this we made a control adapter for the EPiServer.UI.Hosting.VirtualPathControl control.  And then spun the collection of controls to find the save event, and added our own function to that save events click handler.

I've uploaded both the AdapterMapping and the Control adapter to : https://github.com/blendinteractive/EPiServer-Examples/tree/master/EditFileSummaryEvent

 

Just change SaveClicked to call whatever function you require.  There is code to give you the current filename so you know which file is being edited.

There may be a more granular control to choose, but this worked fine for our needs.  If you run into any issues let me know.

 

namespace Blend.PageAdapters
{
    /// <summary>
    /// This PageAdapter is being made to piggyback the EPiServer FileManagement page.
    /// This specific adapter is looking for the Save button on the EditFileSummary 
    /// portion of the page.
    /// </summary>
    public class EditFileSummary : ControlAdapter
    {
        /// <summary>
        /// Overloads the OnLoad event of the page this PageAdapter is piggybacking.
        /// This allows us to add methods to the eventhandlers on the actual page.
        /// </summary>
        /// <param name="e">Event Args.</param>
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            var saveButton = FindControl<ToolButton>(Page, null);
            if (saveButton == null)
            {
                return; // Error checking to make sure you bind to a TemplateButton
            }

            // Ensure we've bound to the save button
            if (saveButton.Text == "Save" && saveButton.ToolTip == "Save")
            {
                saveButton.Click += this.SaveClicked; // Attach our method to the save button's Click event handler
            }
        }
        
        /// <summary>
        /// A simple generic way to find controls on the page.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="control">The parent control.</param>
        /// <param name="id">The id of the control being looked for.</param>
        /// <returns></returns>
        private static T FindControl<T>(Control control, string id) where T : Control
        {
            T controlTest = control as T;
            if (controlTest != null && (id == null || controlTest.ID.Equals(id)))
            {
                return controlTest;
            }

            foreach (Control c in control.Controls)
            {
                controlTest = FindControl<T>(c, id);
                if (controlTest != null)
                {
                    return controlTest;
                }
            }

            return null;
        }

        /// <summary>
        /// Displays every control on the page and its ID.  Added for troubleshooting purposes in situations
        /// where you are trying to find a control on the page and the source is not readily available.  Call this function and 
        /// browse through the IDs then feed that ID into FindControl() to attempt to bind to it in this pageadapter.
        /// </summary>
        /// <param name="parent">Parent is the control whole children will be recursed.</param>
        /// <param name="depth">Tracks how deep the function is for display purposes.</param>
        private static void WriteControlValues(Control parent, int depth)
        {
            foreach (Control child in parent.Controls)
            {
                HttpContext.Current.Response.Write(new string('-', depth) + '>' + child + " - <b>" + child.ID + "</b><br />");
                WriteControlValues(child, depth++);
            }
        }

        /// <summary>
        /// This function is the method we tie to the button click event on the save button.
        /// </summary>
        /// <param name="sender">The object which created the event.</param>
        /// <param name="e">The arguements passed in the event.</param>
        private void SaveClicked(object sender, EventArgs e)
        {  
            var fileName = FindControl<HiddenField>(Page, "curFile");
            var decoded = HttpContext.Current.Server.UrlDecode(fileName.Value);
            if (String.IsNullOrEmpty(decoded))
            {
                return;
            }
            MetaIndexer.IndexFile(decoded);
        }
    }
}

    

#54809
Edited, Nov 03, 2011 15:15
Vote:
 

Hi Deane/Seth,

That looks like it should do the trick nicely, many thanks for providing this.

Mark

#54810
Nov 03, 2011 15:36