Search code examples
sitecoresitecore8glass-mapper

Glass Mapper - Set Buttons and Frame Title for expirence editor


I would like setup a title for frame and my custom buttons with BeginEditFrame, but I can't set it up in last method,

public GlassEditFrame BeginEditFrame();
public GlassEditFrame BeginEditFrame(string dataSource);
public GlassEditFrame BeginEditFrame(string buttons, string dataSource);
public GlassEditFrame BeginEditFrame<T>(T model, string title = null, params Expression<Func<T, object>>[] fields) where T : class;

Is it any other way to set edit frame title ?


Solution

  • I ran into this same situation and ended up creating a derived EditFrame and custom Extension to support titles.

    public static class HtmlHelperExtensions
    {
        /// <summary>
        /// An extra extensions because the default ones are bugged or do not expose title
        /// </summary>
        /// <typeparam name="TModel"></typeparam>
        /// <param name="htmlHelper"></param>
        /// <param name="model"></param>
        /// <param name="buttons"></param>
        /// <param name="title"></param>
        /// <returns></returns>
        public static GlassEditFrame BeginEditFrame<TModel>(this HtmlHelper htmlHelper, TModel model, string buttons, string title = "") where TModel : BaseCommon
        {
            var output = new HtmlTextWriter(htmlHelper.ViewContext.Writer);
            var editFrame = new EditFrame()
            {
                DataSource = model.Id.ToString(),
                Buttons = buttons,
                Title = title
            };
            editFrame.RenderFirstPart(output);
            return new CustomGlassEditFrame(editFrame, htmlHelper.ViewContext.Writer);
        }
    }
    
    /// <summary>
    /// Added this fix because were unable to set the Title otherwise..
    /// </summary>
    public class CustomGlassEditFrame : GlassEditFrame
    {
        public CustomGlassEditFrame(string buttons, TextWriter writer, string dataSource = "") : base(buttons, writer, dataSource)
        {
        }
    
        public CustomGlassEditFrame(EditFrame frame) : base(frame)
        {
        }
    
        /// <summary>
        /// Using HtmlHelperExtensions.BeginEditFrame(EditFrame) you will miss the writer in the RenderLastPart, this extra constructor passes the writer
        /// </summary>
        /// <param name="frame"></param>
        /// <param name="writer"></param>
        public CustomGlassEditFrame(EditFrame frame, TextWriter writer)
            : base(frame.Buttons, writer, frame.DataSource)
        {
    
        }
    }