Innehållstyper
Innehållstyper är tillsammans med text de grundläggande byggstenarna i de sidor som redaktörerna arbetar med. Dynamix tillåter att innehållstyper kombineras helt fritt och det är också enkelt att definiera egna utökningar.
Klasser och definitioner
En innehållstyp består av tre delar; definition, information och presentation. Dessa tre delar implementeras som tre klasser som ska ärvas från:
Dynamix.ContentType - definition
Detta är definitionen av innehållstypen mot redaktören och systemet. Varje innehållstyp har en unik instans av ett sådant objekt i databasen (unikt UID krävs, sätts i konstruktorn). Här definieras egenskaper som visas i gränssnittet (namn, visningsikon mm). Objektet är ansvarigt för att skapa klassen som används för att lagra information om enskilda innehåll i sidor, samt för att skapa kontrollen som renderas i sidan.
Exempel:
- C#
using System;
using System.Web.UI;
using Dynamix;
using Dynamix.Content;
using System.Runtime.Serialization;
namespace MySite.ContentTypes
{
[Serializable]
[Dynamix.Definitions.ContentType]
public class NewsListContentType : Dynamix.ContentType
{
// Serialization and database constructors - required by Dynamix
protected NewsListContentType ( ObjectID id ) : base( id ) {}
protected NewsListContentType (
SerializationInfo info, StreamingContext context ) :
base( info, context ) {}
public NewsListContentType () : base() {}
public override string IconUrl
{
get { return Dynamix.Util.Icon16( "news" ); }
}
public override string Name
{
get { return "Nyhetslista"; }
}
// Returns the object that contains Information
public override ContentComponent CreateContentComponent()
{
return new NewsListComponent();
}
// Returns the control for Presentation
public override ContentControl CreateContentControl( ContentComponent cc )
{
return new NewsListControl();
}
// Instance method for easy access from code
public static NewsListContentType Instance
{
get
{
return (NewsListContentType)GetInstance( typeof( NewsListContentType ) );
}
}
}
}
notera attributet [Dynamix.Definitions.ContentType] som gör att Dynamix kan upptäcka och installera innehållstyper. Läs mer om definitionsattribut här.
ContentComponent - Information
Objekt av denna klass lagrar information om de innehåll som ligger i själva sidorna. Normalt lagras sådana egenskaper som redaktörerna kan påverka. Det kan vara till exempel kopplingar till bilder, textfält, länkar eller kategoriurval. Utvecklaren lägger fritt till egenskaper.
Exempel:
- C#
using System;
using System.Web.UI;
using Dynamix;
using System.Runtime.Serialization;
namespace MySite.ContentTypes
{
[Serializable]
[Descriptors.UI.EditObjectDialogDescriptor( typeof( Dynamix.UI.Dialogs.GeneralEditContentComponent.UIEditObjectDialogDescriptor ) )]
public class NewsListComponent : Dynamix.ContentComponent
{
public static readonly ObjectListProperty p_Categories =
new ObjectListProperty( "Categories", typeof( Dynamix.Category ) );
public static readonly IntProperty p_MaxCount =
new IntProperty( "MaxCount", -1 );
// Serialization and database constructors - Required by Dynamix
protected NewsListComponent( ObjectID id ) : base( id ) {}
protected NewsListComponent(
SerializationInfo info, StreamingContext context ) :
base( info, context ) {}
public NewsListComponent() : base() {}
public ObjectList Categories
{
get { return GetPropertyList( p_Categories ); }
}
public int MaxCount
{
get { return GetPropertyValue( p_MaxCount ); }
set { SetPropertyValue( p_MaxCount, value ); }
}
public ObjectList GetItems()
{
...
}
}
}
ContentControl - Presentation
Denna klass ska ärvas från Dynamix.Content.ContentControl (som ärver från WebControl). Det går alltså att överlagra CreateChildControls, Render m fl. Tillgång till informationsobjektet ges via egenskapen ContentComponent och till sidan via egenskapen DynamixContentPage.
Exempel:
- C#
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using Dynamix;
using System.Runtime.Serialization;
namespace MySite.ContentTypes
{
public class NewsListControl : Dynamix.Content.ContentControl
{
public NewsListControl()
{
}
protected override void CreateChildControls()
{
NewsListComponent info = (NewsListComponent)ContentComponent;
ObjectList items = info.GetItems();
if( items.Count == 0 && InEditMode )
{
Controls.Add( new LiteralControl( "[Nyhetslista]" ) );
}
else
{
Table t = new Table();
foreach( NewsItem item in items )
{
TableRow tr = new TableRow();
TableCell tdDate = new TableCell();
tdDate.Text = item.Date;
TableCell tdHeadline = new TableCell();
tdHeadline.Text = item.Headline;
tr.Cells.Add( tdDate );
tr.Cells.Add( tdHeadline );
t.Rows.Add( tr );
}
Controls.Add( t );
}
}
}
}
Att skapa egna innehållstyper
Vanligtvis skapas de tre ovanstående klasserna i samma fil. Innehållstypen kan sedan installeras från verktyget "Innehållstyper" eller via ContentType.DB_Install()