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; }
}