During the time I worked with CMS, I built up list of some cool stuff. I thought to share them with you. Maybe in future we can have a Episerver CMS/Commerce cheat sheet or knowledge based in Github so we can all use them. This is just beginning 🙂
==========================CUSTOM LINK ITEM COLLECTION RENDERING=====================================
@Html.PropertyFor(m => m.MainBody)
// FullRefreshPropertiesMetaData asks on-page edit to reload the page
// to run the following custom rendering again after the value has changed.
@Html.FullRefreshPropertiesMetaData(new []{ "RelatedContentLinks" })
// EditAttributes enables on page-edit when you have custom rendering.
<p @Html.EditAttributes(m => m.CurrentPage.RelatedContentLinks) >
@if (Model.CurrentPage.RelatedContentLinks != null)
{
<span>See also:</span>
foreach (LinkItem item in Model.CurrentPage.RelatedContentLinks)
{
<a href="@item.Href">@item.Text</a>
}
}
</p>
...
-------------------------------------------OR-------------------------------------------------------
...
@Html.PropertyFor(m => m.MainBody)
<h2>Releated Content</h2>
@Html.PropertyFor(m => m.CurrentPage.RelatedContentLinks, "SeeAlso")
...
----------------------------------------------------------------------------------------------------
-------------------------------------------OR-------------------------------------------------------
public class ArticlePage : PageData
{
...
[UIHint("SeeAlso")]
public virtual LinkItemCollection RelatedContentLinks { get; set; }
...
----------------------------------------------------------------------------------------------------
TIPS:
-----------
global folder for the media and block -> EPiServer.Core.SiteSettings.Current.GlobalBlocksRoot
site folder for the media and block EPiServer.Core.SiteSettings.Current.SiteBlocksRoot
-----------
Loaders:
IContentLoader (just readonly) vs IContentRepository (CRUD) vs DataFactory (legacy, backward compatibility)
-----------
- Attributes:
Content Types: [ContentType], [Access], [AvailableContentTypes], [ImageUrl]
Property: [Display(
Name = "Classification",
Description = "Genre or type of article.",
GroupName = "Details", Order = 2)]
Group:
[GroupDefinitions]
public static class GroupNames
{
[Display(GroupName="MyNews", Order=1)]
public const string News = "News";
[RequiredAccess(AccessLevel.Publish)]
public const string Contact= "Contact";
}
Version status
NotCreated. The version has not been saved yet.
CheckedOut. The currently edited version
AwaitingApproval. The editor is done and has marked the version as ready for approval
Rejected. The version did not pass the approval
CheckedIn. The version is approved and ready for publish
DelayedPublished. The version will be automatically published at a future date and time
Published. The version is published
PreviouslyPublished. The version has been published but is now replaced with a different version
Status transitions
Default/None. Saves a version maintaining the current status unless a new version is created. In this case the new version is created in a checked out state. (Default has replaced None in CMS 10)
Publish. Publishes a version.
Schedule. Schedule a version for automatic publishing at a later date. (New in CMS 10)
CheckOut. Checks out a version to indicate that it is being worked on. (New in CMS 10)
CheckIn. Checks in a version indicating that it is ready to be published
RequestApproval. Saves a version to a state indicating that it is ready to be approved
Reject. Rejects a version. This is normally done during an approval review.
Save. Save action which outcome will depend on the current status. Will in some cases maintain the status and in other cases check out the current version.
Optional parameter
ForceNewVersion. Specifies that the content saved should be created as a new version.
ForceCurrentVersion. Specifies that the save should update the existing version.
SkipValidation. Specifies that the content should be saved without performing the usual validation.
SkipSetCommonDraft. Specifies that the version should not be set as common draft (the version used by default in the CMS edit user interface)
DelayedPublish. Used in combination with SaveAction. CheckIn to specify that the version should be automatically published at a future date and time. (Deprecated in CMS 10)
----------------------
force to save/publish by anonymouse user (e.g. schedule job) contentRepository.Save(myPage, EPiServer.DataAccess.SaveAction.Publish, EPiServer.Security.AccessLevel.NoAccess);
custom icon for content type:
[UIDescriptorRegistration]
public class ContainerPageUIDescriptor : UIDescriptor<ContainerPage>
{
public ContainerPageUIDescriptor()
: base("epi-iconObjectPage")
{
}
}
change the default view
[UIDescriptorRegistration]
public class StartPageUIDescriptor : UIDescriptor
{
public StartPageUIDescriptor(): base(ContentTypeCssClassNames.Page)
{
DefaultView = CmsViewNames.AllPropertiesView;
EnableStickyView = false;
}
}
change the default icon of media
[UIDescriptorRegistration]
public class DocumentUIDescriptor : UIDescriptor<Document>
{
public DocumentUIDescriptor() : base("icon-document")
{
DefaultView = CmsViewNames.AllPropertiesView;
}
}
change editor descriptor
[EditorDescriptorRegistration(TargetType = typeof(string))]
public class StringEditorDescriptor : EditorDescriptor
{
public StringEditorDescriptor()
{
ClientEditingClass = "dijit.form.ValidationTextBox";
}
}
====================================================================================================
TemplateResolver
The EPiServer.Web.TemplateResolver.TemplateResolving event is raised. If an event handler selects a template, that template is used with no further handling.
All templates matching the desired content type are filtered according to the rendering mode: If t is a page, a suitable controller is selected; if it is partial rendering, a suitable partial controller or partial view is selected. For partial templates, the list is filtered according to main template.
If the template is requested with a specific tag, the list is filtered on that tag. If no template matching the tag exists, all templates from 2 are taken into account.
If any display channel is active, and there are template tags matching that channel, templates are filtered for DisplayChannel.
From remaining templates, the shortest inheritance chain to the TemplateModel marked as Default and not inherited, is selected.
If no match from 5, the shortest inheritance chain to TemplateModel that is marked as Default, is selected.
If no match from 6, the shortest inheritance chain to TemplateModel, is selected.
The EPiServer.Web.TemplateResolver.TemplateResolved event is raised, providing a chance to replace the selected template.
--------------------------custom root folder for block selector----------------------------
[UIHint("teaserblock")]
public virtual ContentReference TeaserBlockReference { get; set; }
[EditorDescriptorRegistration(TargetType = typeof(ContentReference), UIHint = "teaserblock")]
public class BlockReferenceEditorDescriptor : ContentReferenceEditorDescriptor<TeaserBlock>
{
public override IEnumerable<ContentReference> Roots
{
get
{
//Sample to override the default root for the repository.
//Take the reference from configuration or site initialization and do not hard-code it.
return new ContentReference[] { new ContentReference(90 ) };
}
}
}
-------------------------------------------------------------
PERMISSION:
- Protecting a controller via a permission
[AuthorizePermission("MyCustomPermissions", "EditSettings")]
public class EditSettingsController : Controller
{
public ActionResult Index()
{
return View();
}
}
-
[PermissionTypes]
public static class MyCustomPermissions
{
public const string GroupName = "MyCustomPermissions";
static MyCustomPermissions()
{
EditSettings = new PermissionType(GroupName, "EditSettings");
ViewSettings = new PermissionType(GroupName, "ViewSettings");
}
public static PermissionType EditSettings { get; private set; }
public static PermissionType ViewSettings { get; private set; }
}
--------------------------------------------------------------------------
Property settings:
[EPiServer.Core.PropertySettings.PropertySettings(typeof(CustomStringSettings), true)]
public class CustomPropertyString : PropertyString
{
}
[ModuleDependency(typeof(EPiServer.Web.InitializationModule))]
public class PlugInInitialization : IInitializableModule
{
public void Initialize(InitializationEngine context)
{
PropertyControlClassFactory.Instance.RegisterClass(typeof(PropertyString), typeof(CustomPropertyString));
PropertyControlClassFactory.Instance.RegisterClass(typeof(PropertyLongString), typeof(CustomPropertyString));
}
public void Uninitialize(InitializationEngine context)
{
}
}