Is this one time deal for all blocks?Yes, the data type creation would give you the data layer and editing UI and the function created would enable you to insert any shared content in just about any place you want (in a page, in the content of another shared content, in a layout template etc.)
To get a 'show on all pages' feature into this you would add a boolean field like "Include in template" which a user can check when editing the shared content. Then you would create a new rendering functions which takes no parameters, but instead contains code like this:
using System;
using System.Collections.Generic;
using Composite.Data;
using Composite.Core.Xml;
namespace Content
{
public static class InlineMethodFunction
{
public static IEnumerable<XhtmlDocument> RenderSharedContentForTemplate()
{
using ( var connection = new DataConnection() )
{
var contentStrings = connection.Get<Content.Shared>().Where( f=>f.ShowInTemplate == true).Select( f=>f.Content);
foreach( string contentString in contentStrings)
{
yield return XhtmlDocument.Parse(contentString);
}
}
}
}
}
(this code was written directly in here, so it may have syntax errors. Also note this expect a new field ShowInTemplate on your data type)