Programmatisk tillgång till sidinnehåll
Dynamix tillåter redaktören att fritt infoga text och andra innehåll genom det inbyggda redigeringsgränssnittet. I många fall kan det dock vara intressant att hjälpa redaktören på traven genom att i förväg skapa innehåll i sidor. Det kan handla om att importera innehåll från en annan webbplats vid t ex migrering. Det kan också vara att hämta rubriker och bilder från ett rss-flöde eller kanske från ett nyhetsobjekt som kan redigeras i ett Dynamix-verktyg.
Objektmodellen
Låt oss först ta en titt på hur Dynamix lagrar sidinnehåll. De flesta Dynamix-utvecklare har arbetat med objekt av typen NavigationItem – för navigationer och länkar eller kanske för att programmatiskt bygga upp en struktur under utvecklingen. Dessa poster kallar man ofta för sidor. I den här artikeln är vi dock mer intresserade av den lite lägre nivån där själva innehållet – texter och bilder – lagras. Detta görs i objekt av typen Dynamix.Page. För tydlighets skull kallar vi nedan sådana objekt för innehållssidor.
På toppnivån i innehållssidorna ligger objekt av typen Dynamix.Content5.PageComponent. De skapas automatiskt utifrån motsvarande Dynamix. TemplateComponent objekt i den mall som används. Det finns ett antal typer av PageComponents för hantering av t ex formulär och det är också möjligt att bygga egna för valfria sidinställningar. I denna artikel kommer vi dock att koncentrera oss på innehållskomponenten ContentPageComponent.
Inuti en innehållskomponent finns egenskapen Element. Även denna kan vara av flera olika typer men i exemplen här utgår vi från att den är av typen FlowLayoutContentElement som är en generell behållare för texter, bilder och alla andra typer av innehåll.
Elementflödet
En FlowLayoutContentElement har egenskapen Elements. I denna lista ligger det innehåll som ritas ut i sidan. Det kan vara vilken typ av innehåll som helst som ärver från ContentElement – t ex bilder (ImageElement), sökträffar (SearchMatchesElement), html (HtmlElement) eller textfält (TextBoxElement). Det kan givetvis också vara en helt egenutvecklad klass.
Låt oss prova med att skriva in ett html-innehåll i en sida.
Det första steget är att få tag i ett lämpligt Page-objekt. Vi utgår från att vi känner till vår NavigationItem och går via versionhanteraren till den just nu publika versionen.
- C#
NavigationItem item;
var page = (Page)item.VersionManager.PublicVersion.Object;
Vi använder sedan det namn vi har använt på mallkomponenten för att hitta den
- C#
var ctc = (Dynamix.Content5.ContentTemplateComponent)item.Template.GetComponent( "Main" );
Mallkomponenten använder vi för att hitta vår innehållskomponent
- C#
var cpc = (ContentPageComponent)ctc.GetPageComponent( p );
Slutligen har vi nu tillgång till innehållselementet, som vi antar är en FlowLayout
- C#
var f = (FlowLayoutContentElement)cpc.Element;
Nästa steg är då att sätta flödesbehållaren i redigeringsläge och skriva dit ett html-innehåll. Sedan sparar vi den igen:
- C#
f = f.GetEditableCopy();
var htmlElt = new HtmlElement { Html = "<div style=\"background-color:red\">Test</div>" };
f.Elements.Add( htmlElt );
f.DB_Save();
Om vi kombinerar detta till en återanvändbar funktion får vi:
- C#
private static void AddContent( NavigationItem item, string sectionName, IEnumerable<ContentElement> elements )
{
var p = (Page)item.VersionManager.PublicVersion.Object;
var ctc = (Dynamix.Content5.ContentTemplateComponent)item.Template.GetComponent( sectionName );
var cpc = (ContentPageComponent)ctc.GetPageComponent( p );
var f = (FlowLayoutContentElement)cpc.Element.GetEditableCopy();
foreach( var contentElement in elements )
{
f.Elements.Add( contentElement );
}
f.DB_Save();
}
Funktionen kan då anropas med t ex:
- C#
private static void AddSearchContent( NavigationItem searchItem, string componentName, TreeObject rootItem )
{
var s = SearchContentType.Instance.CreateElement();
var searchMatchesElement = SearchMatchesContentType.Instance.CreateElement();
searchMatchesElement.Root = rootItem;
AddContent( searchItem, componentName, new ContentElement[] { s, searchMatchesElement } );
}
Textinnehåll
Mellan de specialiserade elementen i elementflödet ligger s.k. textfragment (TextFragmentElement). Dessa innehåller i sin tur textstycken och punktlistor, länkar och formateringar.
För att lägga in text programmatiskt behöver vi alltså först skapa ett textfragment:
- C#
var textFrag = new TextFragmentContentElement();
I egenskapen Nodes lägger vi sedan till ett textstycke (Paragraph). Egenskapen Style fylls i till att peka på en tidigare definierad textstil. Inuti textstycket lägger vi en textnod med själva texten.
- C#
var para = new Paragraph { Style = MyHeadline1TextStyle.Instance };
textFrag.Nodes.Add( para );
var text = new TextParagraphNode( "En exempeltext" );
para.Nodes.Add( text );
Vill vi ha fler stycken lägger vi bara till dessa i Nodes-listan. Vi kan sedan anropa AddContent-metoden med textfragment i elements-listan:
- C#
private static void AddSearchContent( NavigationItem searchItem, string componentName, TreeObject rootItem )
{
var headline = new TextFragmentContentElement();
var headlinePara = new Paragraph { Style = MyHeadline1TextStyle.Instance };
headline.Nodes.Add( headlinePara );
headlinePara.Nodes.Add( new TextParagraphNode( "Sök med hjälp av fältet nedan") );
var s = SearchContentType.Instance.CreateElement();
var searchMatchesElement = SearchMatchesContentType.Instance.CreateElement();
searchMatchesElement.Root = rootItem;
AddContent( searchItem, componentName, new ContentElement[] { headline, s, searchMatchesElement } );
}
Lägg inte flera textfragment i rad i Elements-listan då det kan leda till felaktigt uppträdande när redaktören redigerar i sidan. Använd istället flera Paragraph-noder för att skapa flera stycken med text.
Formaterad text
För att formatera enskilda delar av texten lägger vi in noder av typen FormattedParagraphNode inuti stycken. Egenskapen Format knyts till önskat format
- C#
para.Nodes.Add( new TextParagraphNode( "Ett " ) );
var boldText = new FormattedParagraphNode { Format = BoldParagraphNodeFormat.Instance };
boldText.Nodes.Add( new TextParagraphNode( "viktigt" ) );
para.Nodes.Add( boldText );
para.Nodes.Add( new TextParagraphNode( " meddelande." ) );
De format som finns att välja mellan är:
Fetstil – BoldParagraphNodeFormat
Kursiv/Emfas – ItalicsParagraphNodeFormat
Understrykning – UnderlineParagraphNodeFormat
Nedsänkt – SubscriptParagaphNodeFormat
Upphöjd – SuperscriptParagraphNodeFormat
Genomstruken – StrikeThroughParagaphNodeFormat
Citat – QuoteParagraphNodeFormat
Format-noder kan nästlas i varandra.
Länkar
Länkar i texten skapas genom nodtypen LinkParagraphNode. Egenskapen Link används för att koppla till önskad länk. Inuti länknoden placeras textnoder för själva länktexten.
- C#
para.Nodes.Add( new TextParagraphNode( "För mer information: " ) );
var link = new LinkParagraphNode
{
Link = new NavigationItemLink() { NavigationItem = myNavItem }
};
link.Nodes.Add( new TextParagraphNode( "klicka här" ) );
para.Nodes.Add( link );