n2cms presentation 2013-07-04

25
N2CMS - Lettvekt og kodevennlig CMS Svein Fidjestøl Fagkveld 4. juli 2013

Upload: svein-fidjestol

Post on 18-Jul-2015

49 views

Category:

Software


0 download

TRANSCRIPT

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 APIpublic 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

[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>");

}

•Lage site map

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

[Controls(typeof(AbstractPage))]

public class ContentController : N2BaseController<AbstractPage>

{

}

[WithEditableTitle, WithEditableName]

public abstract class AbstractPage : ContentItem

{

public string PreviewUrl

{

get { return Url; }

}

}

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?