Tutorial 2 - Creating a simple content public page

In this tutorial we will create a simple public page with a title and rich text field.
The content page item only contains three fields:


First we need to create the model that will represent our content page item:

 using DevPartner.Nop.Plugin.Core.Attributes;
 using DevPartner.Nop.Plugin.Core.Models.CMS;
 using DevPartner.Nop.Plugin.Core.Models;
 
 namespace DevPartner.Nop.Plugin.Misc.StartedKit.Models
 {
     [SystemName("ContentPage")]
     [PublicPage("ContentPage", isSEO: true)]
     [AdminMenu("DevCommerce/Content")]
     [Parent("Content Management")]
     [Icon("fa-book")]
     [Localazible]
     [IsSearchable]
     public class ContentPageModel : DPPublicNavigationPageModel, IDPModel
     {
         [DPParent]
         public ContentPageModel Parent { get; set; }
     }
 }
 
You can see that this class doesn't include Title and Description. It’s default attributes. Now that we have our data model we can turn our attention to the ContentPage view.
@using Nop.Web.Framework.UI;
 @using DevPartner.Nop.Plugin.Core.Models.CMS;
 
 @model  DPPublicNavigationPageModel
 @{
     Layout = "~/Views/Shared/_ColumnsTwo.cshtml";
 
     Html.AddTitleParts((string)Model.Name);
 }
 
 @{
     if (!string.IsNullOrEmpty((string)Model.MetaTitle))
     {
         Html.AddHeadCustomParts("<meta name=\"title\" content=\"" + (string)Model.MetaTitle + "\" />");
     }
     else
     {
         Html.AddHeadCustomParts("<meta name=\"title\" content=\"" + (string)Model.Name + "\" />");
     }
     Html.AppendMetaKeywordParts((string)Model.MetaKeywords);
     Html.AppendMetaDescriptionParts((string)Model.MetaDescription);
     Html.AddHeadCustomParts("<meta name=\"date\" content=\"" + DateTime.Now.ToString(" yyyy-MM-dd") + "\" scheme=\"YYYY-MM-DD\"  />");
     
 }
 
 @section Breadcrumb
 {
     @Html.Action("Breadcrumb", "DevPartnerCommon", new { entityId = Model.Id, includeFolderEntities = false })
 }
 
 
 @section left
 {
     @Html.Widget("left_side_column_before")
     @Html.Action("ChildEntitiesNavigation", "DPPublicPage", new { entityId = Model.Id })
     @Html.Widget("left_side_column_after_category_navigation")
     @Html.Action("ManufacturerNavigation", "Catalog")
     @Html.Action("VendorNavigation", "Catalog")
     @Html.Action("RecentlyViewedProductsBlock", "Product", new { productThumbPictureSize = 64 })
     @Html.Action("PopularProductTags", "Catalog")
     @Html.Action("PollBlock", "Poll", new { systemKeyword = "LeftColumnPoll" })
     @Html.Widget("left_side_column_after")
 }
 
 <div class="content-page">
     <div class="content-wrapper">
 
         <div class="content-head">
             <div class="content-title">
                 <h1>@Model.Name</h1>
             </div>
         </div>
         <div class="text-body">
             @Html.Raw(Model.Text as string)
         </div>
     </div>
 </div>
 
The last step will be connecting our model with our public view. We can do it by replacing Install method in our plug-in file with the following snipet

         public override void Install()
         {
             var pageContentPage = new PublicPageModel { Name = "ContentPage", Path= "DP_ContentPage" };
             _entityModelService.SaveEntity(pageContentPage, EntityTypes.PublicPage.Id);
             
 
             //save new cms entities
             _installBaseItemsService.SaveCmsEntitiesAndModels();
 
             base.Install();
         }
 
Very quickly and without any special admin code we have been able to create new content type with public page view based our strongly data model.