SlideShare a Scribd company logo
1 of 25
N2CMS - Lettvekt og kodevennlig CMS 
Svein Fidjestøl 
Fagkveld 4. juli 2013
Utgangspunkt 
•Ny website for kunden 
•www.example.com 
•ASP.NET MVC 
•I første omgang 
•Kun på norsk 
•Uten CMS (Content Management System) 
•Statisk content 
•Content sjekkes inn i kildekontroll av webdesiger (HTML) 
•Innlogget funksjonalitet («Min konto»)
Deretter behov for CMS 
•Multispråk 
•Først: norsk, svensk 
•Etter hvert: engelsk, dansk, finsk, etc. 
•Mye content er felles på tvers av språk 
•Maler 
•Partnersider 
•Tilbudsider 
•Tidsstyrt innhold 
•Fortsatt «raw» HTML
Generelt om CMS 
•Mange alternativer 
•Ofte tunge og ressurskrevende 
•Mye konfigurering man må sette seg inn i 
•Mye arbeid å komme i gang 
•Ofte dyre i innkjøp 
•Produkter vs. Rammeverk 
•Teknologi 
•Mange .NET-baserte CMSer basert på Web Forms, ikke MVC 
•CMS integrert i resten av løsningen, eller standalone?
Våre krav til CMS 
•.NET-basert 
•Multi-språk 
•Rollestyring 
•Støtte ASP.NET MVC 
•Ikke «intrusive» 
•Open Source en fordel 
•Filhåndtering og bildeskalering 
•Lastbalansering 
Alternativer vi vurderte 
•Umbraco versjon 5 [RIP] 
•Orchard 
•Kooboo 
•N2CMS
N2CMS - «It’s so .NET!» 
•Open Source 
•Lettvekt og kodevennlig 
•Convention over configuration 
•Kan legges til på en eksisterende website 
•ASP.NET MVC routing - routes.MapContentRoute("Content", engine) 
•Intuitivt og kraftig API 
public void DoSomeStuffWithSomeItems(DateTime minDate, DateTime maxDate) 
{ 
IList<ContentItem> items = N2.Find.Items 
.Where.Created.Between(minDate, maxDate) 
.And.SavedBy.Eq("admin") 
.OrderBy.Published.Desc 
.Select(); 
foreach (ContentItem item in items) 
DoSomethingWith(item); 
}
N2CMS - Teknologi 
•.NET 4 - ASP.NET MVC webapplikasjon 
•Standard ASP.NET membership/role provider 
•TinyMCE (HTML WYSIWYG editor) 
•NHibernate 
•Lucene (søk) 
•Castle Windsor 
•jQuery 
•Caching 
•Standard ASP.NET Output Caching 
•Database object caching 
•Provider-basert filsystem (for bilder osv.) 
•Finnes provider for bl.a. Amazon S3
N2CMS – Hvordan komme i gang? 
•NuGet-pakker 
•N2 CMS 
•N2 CMS Management 
•N2 CMS Razor Support 
•Dinamico Templates for N2 CMS 
•N2 CMS SQLite config 
•N2 CMS - Castle Windsor 3 support 
•Noen tredjeparts-plugins 
•N2.S3Filesystem 
•N2CMS.RoleEditor 
•N2CMS.UserEditor 
•Github (alternativt)
Fordeler med N2 
•Contentdefinisjoner som Model i ASP.NET MVC 
•Contentdefinisjoner i standard .NET-klasser og attributer 
•Trenger ikke konfigurere med GUI eller annet verktøy 
•Contentdefinisjoner er dermed en del av kildekoden 
•Sjekkes inn i kildekontrollsystemet 
•Slipper å ha dette i DB, separat fra kildekoden 
•SEO-vennlige URLer 
•Eks: http://demo.n2cms.com/features/faq istedenfor 
http://msdn.microsoft.com/en-us/library/aa354509.aspx 
•Versjonering med ubegrenset rollback 
•«Track relations» ved omorganisering av websiten 
•Internlenker oppdateres automatisk (inkludert raw HTML) 
•Kan sette opp redirects fra gamle URLer
Andre kommentarer 
•Litt «røff» i kantene 
•Eks. trykkfeil i LoginForm.cshtml som ligger i NuGet-pakken som 
man må rette opp før man får brukt Edit Mode… 
•Mangler cache invalidation i forbindelse med lastbalansering 
•Kan sannsynligvis ordne dette selv med f.eks. SqlCacheDependency 
•Dokumentasjon og organisering 
•Litt rotete 
•http://n2cms.com (gammel website) 
•http://n2cms.codeplex.com (litt nyere, gammel kildekode ligger også her…) 
•http://n2cmsdocs.atlassian.net/wiki/display/N2CMS/ (dokumentasjon) 
•http://github.com/n2cms (her ligger kildekoden nå) 
•Hva er utdatert og hva er current..?
Eksempel 
•Lage site map 
[ContentOutputCache] 
public ActionResult SiteMap() 
{ 
var start = this.Content.Traverse.StartPage; 
string content = Tree.From(start) 
.Filters(N2.Content.Is.Accessible()) 
.ExcludeRoot(true).ToString(); 
return Content("<ul>" 
+ "<li>" + Link.To(start) + "</li>" 
+ content + "</ul>"); 
}
Eksempel 
•Hente alle partnersider 
allPartnersPage 
.GetChildren(new TypeFilter(typeof(PartnerPage)), new NavigationFilter()) 
.Cast<PartnerPage>() 
.Where<PartnerPage>(p => !string.IsNullOrEmpty(p.PartnerLogo)) 
.OrderBy(p => p.SortOrder);
Definere controller med content fra N2 
[WithEditableTitle, WithEditableName] 
public abstract class AbstractPage : ContentItem 
{ 
public string PreviewUrl 
{ 
get { return Url; } 
} 
} 
[Controls(typeof(AbstractPage))] 
public class ContentController : N2BaseController<AbstractPage> 
{ 
} 
public class N2BaseController<T> : 
N2.Web.Mvc.ContentController<T> 
where T : N2.ContentItem 
{ 
}
Definere en Page (Type) 
[Definition("Content Page", Installer = global::N2.Installation.InstallerHint.PreferredStartPage)] 
[TabContainer("content", "Content", 10)] 
[TabContainer("meta", "Metainfo", 20)] 
[TabContainer("advanced", "Avansert", 30)] 
public class ContentPage : AbstractPage 
{ 
[EditableFreeTextArea("WYSIWYG content", 100, ContainerName = "content")] 
public virtual string Text { get; set; } 
[EditableTextBox("Description meta tag. Important for SEO", 140, ContainerName = "meta", 
TextMode = TextBoxMode.MultiLine, Rows = 10, Columns = 200)] 
public virtual string Description { get; set; } 
[EditableTextBox("Plaintext content, allows all html", 150, ContainerName = "advanced", 
TextMode = TextBoxMode.MultiLine, Rows = 50, Columns = 200)] 
public virtual string PlainText { get; set; } 
[EditableTextBox("CSS placed in html element head", 300, ContainerName = "advanced", 
TextMode = TextBoxMode.MultiLine, Rows = 50, Columns = 200)] 
public virtual string HeadCSS { get; set; } 
}
Definere en Page (Type) 
[Definition("Partner Page")] 
public class PartnerPage : ContentPage 
{ 
[FileAttachment, EditableImageUpload("Partner banner", 1200)] 
public virtual string PartnerBanner { get; set; } 
[FileAttachment, EditableImageUpload("Partner Logo. Shows up 
in bottom menu", 1250)] 
public virtual string PartnerLogo { get; set; } 
[EditableFreeTextArea("Innhold i Earn-boksen", 1300)] 
public virtual string EarnText { get; set; } 
(...) 
[EditableTextBox("Markedsbudskap eller tilbud fra partner", 
1700, Rows=50, Columns = 100, TextMode = TextBoxMode.MultiLine)] 
public virtual string SalesText { get; set; } 
}
Mer informasjon 
•Dinamico Templates Pack 
•Komplett multispråk website 
•Content, søk, multispråk fungerer “out-of-the-box”
Fag#
Fag#
Fag#
Fag#
Fag#
Fag#
Fag#
Aktivitet på Github 
•http://github.com/n2cms
Spørsmål?

More Related Content

Similar to N2CMS presentation 2013-07-04

The Client Strikes Back
The Client Strikes BackThe Client Strikes Back
The Client Strikes BackMagnus Green
 
Dell Cloud Client Computing
Dell Cloud Client ComputingDell Cloud Client Computing
Dell Cloud Client ComputingKenneth de Brucq
 
Objektorientering og design av kode
Objektorientering og design av kodeObjektorientering og design av kode
Objektorientering og design av kodeRune Sundling
 
Progressive web applications i praksis
Progressive web applications i praksisProgressive web applications i praksis
Progressive web applications i praksisHåvard Wigtil
 
Core trek presentasjon 2014
Core trek presentasjon 2014Core trek presentasjon 2014
Core trek presentasjon 2014CoreTrek
 
HTML5 - en int teori
HTML5 - en int teoriHTML5 - en int teori
HTML5 - en int teoriDag Tjemsland
 
The Desk: Digitalmagasinenes nye forsidebygger
The Desk: Digitalmagasinenes nye forsidebyggerThe Desk: Digitalmagasinenes nye forsidebygger
The Desk: Digitalmagasinenes nye forsidebyggerFrontkom
 
Presentasjon CoreTrek 2013
Presentasjon CoreTrek 2013Presentasjon CoreTrek 2013
Presentasjon CoreTrek 2013CoreTrek
 
Windows Virtual Desktop
Windows Virtual DesktopWindows Virtual Desktop
Windows Virtual DesktopMarius Sandbu
 
Javascript tar hevn
Javascript tar hevnJavascript tar hevn
Javascript tar hevnfossmo
 
Firefox os og web som mobil plattform
Firefox os og web som mobil plattformFirefox os og web som mobil plattform
Firefox os og web som mobil plattformHåvard Wigtil
 
Firefox os og web som mobil plattform
Firefox os og web som mobil plattformFirefox os og web som mobil plattform
Firefox os og web som mobil plattformHåvard Wigtil
 
Firefox OS - og web som mobil plattform
Firefox OS - og web som mobil plattformFirefox OS - og web som mobil plattform
Firefox OS - og web som mobil plattformHåvard Wigtil
 
Introduksjon til Spring Boot
Introduksjon til Spring BootIntroduksjon til Spring Boot
Introduksjon til Spring BootHenrik Schwarz
 
Core trek 2013
Core trek 2013Core trek 2013
Core trek 2013CoreTrek
 
HTML for nettredaktører
HTML for nettredaktørerHTML for nettredaktører
HTML for nettredaktørerKenneth Eriksen
 
Beste praksis for å implementere ArcGIS i din virksomhet - BK2016
Beste praksis for å implementere ArcGIS i din virksomhet - BK2016Beste praksis for å implementere ArcGIS i din virksomhet - BK2016
Beste praksis for å implementere ArcGIS i din virksomhet - BK2016Geodata AS
 

Similar to N2CMS presentation 2013-07-04 (20)

Webteknologi
WebteknologiWebteknologi
Webteknologi
 
The Client Strikes Back
The Client Strikes BackThe Client Strikes Back
The Client Strikes Back
 
Dell Cloud Client Computing
Dell Cloud Client ComputingDell Cloud Client Computing
Dell Cloud Client Computing
 
Objektorientering og design av kode
Objektorientering og design av kodeObjektorientering og design av kode
Objektorientering og design av kode
 
Progressive web applications i praksis
Progressive web applications i praksisProgressive web applications i praksis
Progressive web applications i praksis
 
Core trek presentasjon 2014
Core trek presentasjon 2014Core trek presentasjon 2014
Core trek presentasjon 2014
 
HTML5 - en int teori
HTML5 - en int teoriHTML5 - en int teori
HTML5 - en int teori
 
The Desk: Digitalmagasinenes nye forsidebygger
The Desk: Digitalmagasinenes nye forsidebyggerThe Desk: Digitalmagasinenes nye forsidebygger
The Desk: Digitalmagasinenes nye forsidebygger
 
Presentasjon CoreTrek 2013
Presentasjon CoreTrek 2013Presentasjon CoreTrek 2013
Presentasjon CoreTrek 2013
 
Windows Virtual Desktop
Windows Virtual DesktopWindows Virtual Desktop
Windows Virtual Desktop
 
Javascript tar hevn
Javascript tar hevnJavascript tar hevn
Javascript tar hevn
 
Firefox os og web som mobil plattform
Firefox os og web som mobil plattformFirefox os og web som mobil plattform
Firefox os og web som mobil plattform
 
Firefox os og web som mobil plattform
Firefox os og web som mobil plattformFirefox os og web som mobil plattform
Firefox os og web som mobil plattform
 
Firefox OS - og web som mobil plattform
Firefox OS - og web som mobil plattformFirefox OS - og web som mobil plattform
Firefox OS - og web som mobil plattform
 
Introduksjon til Spring Boot
Introduksjon til Spring BootIntroduksjon til Spring Boot
Introduksjon til Spring Boot
 
Core trek 2013
Core trek 2013Core trek 2013
Core trek 2013
 
HTML for nettredaktører
HTML for nettredaktørerHTML for nettredaktører
HTML for nettredaktører
 
Innføring i CraftCMS
Innføring i CraftCMSInnføring i CraftCMS
Innføring i CraftCMS
 
NTNUs bruk av Feide.
NTNUs bruk av Feide. NTNUs bruk av Feide.
NTNUs bruk av Feide.
 
Beste praksis for å implementere ArcGIS i din virksomhet - BK2016
Beste praksis for å implementere ArcGIS i din virksomhet - BK2016Beste praksis for å implementere ArcGIS i din virksomhet - BK2016
Beste praksis for å implementere ArcGIS i din virksomhet - BK2016
 

N2CMS presentation 2013-07-04

  • 1. N2CMS - Lettvekt og kodevennlig CMS Svein Fidjestøl Fagkveld 4. juli 2013
  • 2. Utgangspunkt •Ny website for kunden •www.example.com •ASP.NET MVC •I første omgang •Kun på norsk •Uten CMS (Content Management System) •Statisk content •Content sjekkes inn i kildekontroll av webdesiger (HTML) •Innlogget funksjonalitet («Min konto»)
  • 3. Deretter behov for CMS •Multispråk •Først: norsk, svensk •Etter hvert: engelsk, dansk, finsk, etc. •Mye content er felles på tvers av språk •Maler •Partnersider •Tilbudsider •Tidsstyrt innhold •Fortsatt «raw» HTML
  • 4. Generelt om CMS •Mange alternativer •Ofte tunge og ressurskrevende •Mye konfigurering man må sette seg inn i •Mye arbeid å komme i gang •Ofte dyre i innkjøp •Produkter vs. Rammeverk •Teknologi •Mange .NET-baserte CMSer basert på Web Forms, ikke MVC •CMS integrert i resten av løsningen, eller standalone?
  • 5. Våre krav til CMS •.NET-basert •Multi-språk •Rollestyring •Støtte ASP.NET MVC •Ikke «intrusive» •Open Source en fordel •Filhåndtering og bildeskalering •Lastbalansering Alternativer vi vurderte •Umbraco versjon 5 [RIP] •Orchard •Kooboo •N2CMS
  • 6. N2CMS - «It’s so .NET!» •Open Source •Lettvekt og kodevennlig •Convention over configuration •Kan legges til på en eksisterende website •ASP.NET MVC routing - routes.MapContentRoute("Content", engine) •Intuitivt og kraftig API public void DoSomeStuffWithSomeItems(DateTime minDate, DateTime maxDate) { IList<ContentItem> items = N2.Find.Items .Where.Created.Between(minDate, maxDate) .And.SavedBy.Eq("admin") .OrderBy.Published.Desc .Select(); foreach (ContentItem item in items) DoSomethingWith(item); }
  • 7. N2CMS - Teknologi •.NET 4 - ASP.NET MVC webapplikasjon •Standard ASP.NET membership/role provider •TinyMCE (HTML WYSIWYG editor) •NHibernate •Lucene (søk) •Castle Windsor •jQuery •Caching •Standard ASP.NET Output Caching •Database object caching •Provider-basert filsystem (for bilder osv.) •Finnes provider for bl.a. Amazon S3
  • 8. N2CMS – Hvordan komme i gang? •NuGet-pakker •N2 CMS •N2 CMS Management •N2 CMS Razor Support •Dinamico Templates for N2 CMS •N2 CMS SQLite config •N2 CMS - Castle Windsor 3 support •Noen tredjeparts-plugins •N2.S3Filesystem •N2CMS.RoleEditor •N2CMS.UserEditor •Github (alternativt)
  • 9. Fordeler med N2 •Contentdefinisjoner som Model i ASP.NET MVC •Contentdefinisjoner i standard .NET-klasser og attributer •Trenger ikke konfigurere med GUI eller annet verktøy •Contentdefinisjoner er dermed en del av kildekoden •Sjekkes inn i kildekontrollsystemet •Slipper å ha dette i DB, separat fra kildekoden •SEO-vennlige URLer •Eks: http://demo.n2cms.com/features/faq istedenfor http://msdn.microsoft.com/en-us/library/aa354509.aspx •Versjonering med ubegrenset rollback •«Track relations» ved omorganisering av websiten •Internlenker oppdateres automatisk (inkludert raw HTML) •Kan sette opp redirects fra gamle URLer
  • 10. Andre kommentarer •Litt «røff» i kantene •Eks. trykkfeil i LoginForm.cshtml som ligger i NuGet-pakken som man må rette opp før man får brukt Edit Mode… •Mangler cache invalidation i forbindelse med lastbalansering •Kan sannsynligvis ordne dette selv med f.eks. SqlCacheDependency •Dokumentasjon og organisering •Litt rotete •http://n2cms.com (gammel website) •http://n2cms.codeplex.com (litt nyere, gammel kildekode ligger også her…) •http://n2cmsdocs.atlassian.net/wiki/display/N2CMS/ (dokumentasjon) •http://github.com/n2cms (her ligger kildekoden nå) •Hva er utdatert og hva er current..?
  • 11. Eksempel •Lage site map [ContentOutputCache] public ActionResult SiteMap() { var start = this.Content.Traverse.StartPage; string content = Tree.From(start) .Filters(N2.Content.Is.Accessible()) .ExcludeRoot(true).ToString(); return Content("<ul>" + "<li>" + Link.To(start) + "</li>" + content + "</ul>"); }
  • 12. Eksempel •Hente alle partnersider allPartnersPage .GetChildren(new TypeFilter(typeof(PartnerPage)), new NavigationFilter()) .Cast<PartnerPage>() .Where<PartnerPage>(p => !string.IsNullOrEmpty(p.PartnerLogo)) .OrderBy(p => p.SortOrder);
  • 13. Definere controller med content fra N2 [WithEditableTitle, WithEditableName] public abstract class AbstractPage : ContentItem { public string PreviewUrl { get { return Url; } } } [Controls(typeof(AbstractPage))] public class ContentController : N2BaseController<AbstractPage> { } public class N2BaseController<T> : N2.Web.Mvc.ContentController<T> where T : N2.ContentItem { }
  • 14. Definere en Page (Type) [Definition("Content Page", Installer = global::N2.Installation.InstallerHint.PreferredStartPage)] [TabContainer("content", "Content", 10)] [TabContainer("meta", "Metainfo", 20)] [TabContainer("advanced", "Avansert", 30)] public class ContentPage : AbstractPage { [EditableFreeTextArea("WYSIWYG content", 100, ContainerName = "content")] public virtual string Text { get; set; } [EditableTextBox("Description meta tag. Important for SEO", 140, ContainerName = "meta", TextMode = TextBoxMode.MultiLine, Rows = 10, Columns = 200)] public virtual string Description { get; set; } [EditableTextBox("Plaintext content, allows all html", 150, ContainerName = "advanced", TextMode = TextBoxMode.MultiLine, Rows = 50, Columns = 200)] public virtual string PlainText { get; set; } [EditableTextBox("CSS placed in html element head", 300, ContainerName = "advanced", TextMode = TextBoxMode.MultiLine, Rows = 50, Columns = 200)] public virtual string HeadCSS { get; set; } }
  • 15. Definere en Page (Type) [Definition("Partner Page")] public class PartnerPage : ContentPage { [FileAttachment, EditableImageUpload("Partner banner", 1200)] public virtual string PartnerBanner { get; set; } [FileAttachment, EditableImageUpload("Partner Logo. Shows up in bottom menu", 1250)] public virtual string PartnerLogo { get; set; } [EditableFreeTextArea("Innhold i Earn-boksen", 1300)] public virtual string EarnText { get; set; } (...) [EditableTextBox("Markedsbudskap eller tilbud fra partner", 1700, Rows=50, Columns = 100, TextMode = TextBoxMode.MultiLine)] public virtual string SalesText { get; set; } }
  • 16. Mer informasjon •Dinamico Templates Pack •Komplett multispråk website •Content, søk, multispråk fungerer “out-of-the-box”
  • 17. Fag#
  • 18. Fag#
  • 19. Fag#
  • 20. Fag#
  • 21. Fag#
  • 22. Fag#
  • 23. Fag#
  • 24. Aktivitet på Github •http://github.com/n2cms