Learn More





DNN Community Blog

The Community Blog is a personal opinion of community members and by no means the official standpoint of DNN Corp or DNN Platform. This is a place to express personal thoughts about DNNPlatform, the community and its ecosystem. Do you have useful information that you would like to share with the DNN Community in a featured article or blog? If so, please contact .

The use of the Community Blog is covered by our Community Blog Guidelines - please read before commenting or posting.

Sharing Dynamic Content-Type Definitions Across Portals and Apps with Ghost Content-Types (400)

Dynamic Content-Types are extremely flexible. In advanced scenarios you want to share ONE type definition across multiple portals or apps - for example when many sub-portals have a similar setup. 2sxc has supported this since version 5 and in 8.1 there is finally a web-UI to do this.

Common Use Cases For Sharing Content-Type Definitions

  1. When you have have many portals which are very similar - like in a franchise - then each sub-portal may need a lot of freedom in managing the content, but you want to keep a central definition of content types
  2. When you create a News-App which exists in many portals and want to collect all news from all portals to show on the home-portal. In such cases you want to be really sure the content-type is always the same.
  3. When you have a complex, often-changing content-type - like Catalog-Item - and want to use it across multiple portals

In summary, sharing a content-type is when you have different data-items = entities across various systems, but they should all adhere to the same schema = content-type

Basics of Shared (Ghost) Content-Types

To share a content-type across any kind of system borders - so across Apps or even across Portals (aka Zones) you need:

  1. The original (master) content-type which you can create anywhere, but usually will create in a portal/app which you regard as the Master-System. 
  2. One or more Ghost-Content-Types inheriting the main definition - in other Apps and Portals

If you want to know more about Ghost Content-Types, check out this blog.

Setting it up

Creating the Master Content-Type

Basically you can do this wherever you want - and it doesn't require any extra steps. So create a content-type and you're ready. 

Note that Master-Types have implications on many aspects like export/import, because as soon as you share content-type definitions across system-part-borders, the system that uses the master will not work without it. So the master becomes very important (for example: you shouldn't delete it) and changing it will always have further consequences. Because of this I recommend treating master-types with reverence. For example, I recommend that the master-definition has no content-items. 

Recommended Setup (Best Practices)

  1. In most cases I recommend that you create a portal which contains only master-data, in this case master Content-Types. Give this portal a name like "Master Schema" or "Master Content-Types" just so people working on this will not make the mistake of changing things quickly. 
  2. I also recommend that the master definition does not contain content-items. So I would not create a master News App and put data in it, but create a Master News App with the content-type, but without data. This again will ensure that a future editor will realize that this is a special use case and not just fiddle around it with.

How to find the internal Static-Name of the Master

  1. Go to the master content-type, click on the edit-definition button
  2. In the definition, hit Ctrl+Click to see the Static-Name in the Advanced Mode
  3. The static name is usually a GUID - copy it into your clipboard, you'll need it.

This all will look a bit like this:

Creating the Slave (Ghost) Content-Type

Starting with 2sxc 8 this is easy to do in the UI. Here are the steps to do it.

  1. Go to the data-management of the target (where you need to inherit the original content-type)
  2. With Ctrl+Click anywhere, change into the Advanced Mode
  3. Now, click on the new Ghost button to create a ghost, paste the original static-name and click ok - like this:

Errors you may get

Sharing Content-Types is a very advanced functionality so 2sxc checks various things before it creates the ghost. Common errors are:

  1. If the master doesn't exist yet, it won't work.
  2. You have multiple master types with the same GUID. This can happen if your master is an App you installed in many portals - then the GUID of that content-type would be the same in many Apps. 2sxc protects you from this as it could cause trouble later on. So if this is your issue, then go to your one-and-only master and give it a new guid - you could generate one in the online GUID generator.
  3. If your current App contains the master-type, then 2sxc will not allow you to create the shadow/ghost in the same App. This is a "don't shoot yourself in the foot" kind of thing

To find out which error is the most likely, best look in the JavaScript console. 

Understanding Export / Import

Export-import of the master-app will behave just like always. 

Export/Import of a Slave-App which inherits the master content-definition works as follows:

  1. The exported App-package will contain a reference to the original Master-Type. It will referr to the Static-Name (usually the GUID) of the master.
  2. Because of this, you can create a "slave" App - for example a Franchise-News App - which shares definitions. The export will again contain a reference to the master, so re-importing it in another portal will work, and will also reference the master-type.

If an import would ever find multiple possible master-types (this shouldn't happen, but you could shoot yourself in the foot if you want to) then the import will reference the first = oldest undeleted content-type in the DB with this static name. So everything would work, but you could run into strange aspects in the future. 

Updating the Master Content-Type

This is very easy and works like any content-type definition change. There is one thing you'll have to know though: The slave Portals/Apps have cached the original definition and won't know about the change till the cache is re-loaded. This happens whenever data changes (in the slave App) or the entire DNN refreshes the cache. So in general we advise that you quickly refresh the entire DNN cache when you make changes to your master content-type.

Love from Switzerland,

Daniel Mettler grew up in the jungles of Indonesia and is founder and CEO of 2sic internet solutions in Switzerland and Liechtenstein, an 20-head web specialist with over 800 DNN projects since 1999. He is also chief architect of 2sxc (see forge), an open source module for creating attractive content and DNN Apps.

Read more posts by Daniel Mettler


There are currently no comments, be the first to post one.

Comment Form

Only registered users may post comments.


2sic Daniel Mettler (124)
Aderson Oliveira (15)
Alec Whittington (11)
Alex Shirley (10)
Andrew Nurse (30)
Anthony Glenwright (5)
Antonio Chagoury (28)
Ash Prasad (21)
Ben Schmidt (1)
Benjamin Hermann (25)
Benoit Sarton (9)
Beth Firebaugh (12)
Bill Walker (36)
Bob Kruger (5)
Brian Dukes (2)
Brice Snow (1)
Bruce Chapman (20)
Bryan Andrews (1)
cathal connolly (55)
Charles Nurse (163)
Chris Hammond (203)
Chris Paterra (55)
Clinton Patterson (28)
Cuong Dang (21)
Daniel Bartholomew (2)
Dave Buckner (2)
David Poindexter (3)
David Rodriguez (2)
Doug Howell (11)
Erik van Ballegoij (30)
Ernst Peter Tamminga (74)
Geoff Barlow (6)
Gifford Watkins (3)
Gilles Le Pigocher (3)
Ian Robinson (7)
Israel Martinez (17)
Jan Blomquist (2)
Jan Jonas (3)
Jaspreet Bhatia (1)
Jenni Merrifield (6)
Joe Brinkman (269)
John Mitchell (1)
Jon Henning (14)
Jonathan Sheely (4)
Jordan Coopersmith (1)
Joseph Craig (2)
Kan Ma (1)
Keivan Beigi (3)
Ken Grierson (10)
Kevin Schreiner (6)
Leigh Pointer (31)
Lorraine Young (60)
Malik Khan (1)
Matthias Schlomann (15)
Mauricio Márquez (5)
Michael Doxsey (7)
Michael Tobisch (3)
Michael Washington (202)
Mike Horton (19)
Mitchel Sellers (28)
Nathan Rover (3)
Navin V Nagiah (14)
Néstor Sánchez (31)
Nik Kalyani (14)
Peter Donker (52)
Philip Beadle (135)
Philipp Becker (4)
Richard Dumas (22)
Robert J Collins (5)
Roger Selwyn (8)
Ruben Lopez (1)
Ryan Martinez (1)
Salar Golestanian (4)
Sanjay Mehrotra (9)
Scott McCulloch (1)
Scott S (11)
Scott Wilkinson (3)
Scott Willhite (97)
Sebastian Leupold (80)
Shaun Walker (237)
Shawn Mehaffie (17)
Stefan Cullmann (12)
Stefan Kamphuis (12)
Steve Fabian (31)
Timo Breumelhof (24)
Tony Henrich (3)
Torsten Weggen (2)
Vicenç Masanas (27)
Vincent Nguyen (3)
Vitaly Kozadayev (6)
Will Morgenweck (37)
Will Strohl (163)
William Severance (5)
Try Evoq
For Free
Start Free Trial
a Demo
See Evoq Live
Need More Information?