Extending the HyperLink with custom field
[EditorDescriptorRegistration(TargetType = typeof (string), UIHint = "HyperLink",
EditorDescriptorBehavior = EditorDescriptorBehavior.OverrideDefault)]
public class LinkEditorDescriptor : EditorDescriptor
{
private readonly LocalizationService _localizationService;
public LinkEditorDescriptor() : this(LocalizationService.Current)
{
}
public LinkEditorDescriptor(LocalizationService localizationService)
{
_localizationService = localizationService;
}
public override void ModifyMetadata(ExtendedMetadata metadata, IEnumerable<Attribute> attributes)
{
base.ModifyMetadata(metadata, attributes);
IEnumerable<IContentRepositoryDescriptor> allInstances =
ServiceLocator.Current.GetAllInstances<IContentRepositoryDescriptor>();
List<HyperLinkModel> list = (
from r in allInstances
orderby r.SortOrder
where r.LinkableTypes != null && r.LinkableTypes.Count() > 0
select new HyperLinkModel
{
Name = r.CustomSelectTitle ?? r.Name,
Roots = r.Roots,
WidgetType = "epi-cms/widget/ContentSelector",
LinkableTypes = r.LinkableTypes,
SearchArea = r.SearchArea
}).ToList<HyperLinkModel>();
list.InsertRange(list.Count, new[]
{
new HyperLinkModel
{
Name = "Email",
Title = _localizationService.GetString("/episerver/cms/widget/editlink/emailtooltip"),
DisplayName = _localizationService.GetString("/episerver/cms/widget/editlink/email"),
WidgetType = "epi-cms/form/EmailValidationTextBox"
},
new HyperLinkModel
{
Name = "ExternalLink",
Title = _localizationService.GetString("/episerver/cms/widget/editlink/externallinktooltip"),
DisplayName = _localizationService.GetString("/episerver/cms/widget/editlink/externallink"),
WidgetType = "epi-cms/form/UrlValidationTextBox"
},
new HyperLinkModel
{
Name = "FreeTextLink",
Title = "Other links",
DisplayName = "Other",
WidgetType = "alloy/TextBoxMustHaveValue"
},
new HyperLinkModel
{
Name = "Anchor",
Title = _localizationService.GetString("/episerver/cms/widget/editlink/anchortooltip"),
DisplayName = _localizationService.GetString("/episerver/cms/widget/editlink/anchor"),
WidgetType = "epi-cms/form/AnchorSelectionEditor",
Invisible = true
}
});
metadata.EditorConfiguration["providers"] = list;
metadata.GroupName = "Href";
metadata.GroupSettings = new GroupSettings
{
Name = metadata.GroupName,
ClientLayoutClass = "epi.shell.layout.LayoutContainer",
DisplayUI = true
};
metadata.ClientEditingClass = "epi-cms/widget/HyperLinkSelector";
}
}
internal class HyperLinkModel
{
public string Name { get; set; }
public string DisplayName { get; set; }
public string Title { get; set; }
public IEnumerable<ContentReference> Roots { get; set; }
public string WidgetType { get; set; }
public IEnumerable<Type> LinkableTypes { get; set; }
public bool Invisible { get; set; }
public string SearchArea { get; set; }
}
}
I needed to create my own HyperLinkModel since its internal
Then I needed to create a dojo class like this
define("alloy/TextBoxMustHaveValue", [
"dojo/_base/declare",
"dojo/_base/lang",
"dojox/validate/web",
"dijit/form/ValidationTextBox",
// Resources
"epi/i18n!epi/cms/nls/episerver.cms.form.emailvalidation"
], function (
declare,
lang,
validator,
ValidationTextBox,
// Resources
resources
) {
return declare([ValidationTextBox], {
// summary:
// Represents the email input textbox.
// tags:
// internal
validator: function (value, constraints) {
// summary:
// Validate the text input with email address validation.
// tags:
// overrided
return (!this.required && this._isEmpty(value)) || (!this._isEmpty(value));
},
invalidMessage: resources.invalidmessage
});
});
And then register the path in modules.config
<dojo>
<!-- Add a mapping from alloy to ~/ClientResources/Scripts to the dojo loader configuration -->
<paths>
<add name="alloy" path="Scripts" />
</paths>
</dojo>
And then the result
Comments