Upload
svein-fidjestol
View
49
Download
0
Embed Size (px)
Citation preview
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”