It seems like this use case keeps coming back time and time again. The requirement: when a new Component is in workflow, part of the approval workflow on the Component should be an automatic Page generation (where the Component is placed on the Page) and possibly publishing of the Page for the purpose of previewing the new Component in a Page context. All this while Component is in workflow, so approver can actually see how the Component looks like before approving/rejecting it.
The only issue, as described in the previous post, is that it is not possible to add a v0.x Component to a Page, when the Page is in a child Publication. The solution is to do all this programmatically.
In the following example, I use the Core Service to create a new Page (with values taken from a Folder metadata, for example) and place the v0.x Component on it.
The Page is first created, then published (as described in my earlier posts about "How to Publish Stuff Programmatically"). The CoreServiceSession method CreatePage is the following:
The only issue, as described in the previous post, is that it is not possible to add a v0.x Component to a Page, when the Page is in a child Publication. The solution is to do all this programmatically.
In the following example, I use the Core Service to create a new Page (with values taken from a Folder metadata, for example) and place the v0.x Component on it.
using (CoreServiceSession
coreService = new CoreServiceSession())
{
if (component.Version < 1)
{
TcmUri pageTcmUri = coreService.CreatePage(title,
fileName, sgTcmUri, ptTcmUri, localComponentTcmUri, ctTcmUri);
PublisherHelper publisherHelper = new PublisherHelper();
publisherHelper.Publish(pageTcmUri,
targetTcmUri, true);
}
}
public TcmUri
CreatePage(String title, String fileName, TcmUri
sgTcmUri, TcmUri ptTcmUri, TcmUri componentTcmUri, TcmUri
ctTcmUri)
{
PageData pageData = new
PageData();
pageData.Id
= TcmUri.UriNull.ToString();
pageData.Title
= title;
pageData.FileName
= fileName;
LinkToPageTemplateData linkToPageTemplateData = new LinkToPageTemplateData();
linkToPageTemplateData.IdRef
= ptTcmUri.ToString();
pageData.PageTemplate
= linkToPageTemplateData;
pageData.IsPageTemplateInherited
= false;
LinkToOrganizationalItemData
linkToOrganizationalItemData = new LinkToOrganizationalItemData();
linkToOrganizationalItemData.IdRef
= sgTcmUri.ToString();
LocationInfo locationInfo = new LocationInfo();
locationInfo.OrganizationalItem
= linkToOrganizationalItemData;
pageData.LocationInfo
= locationInfo;
ComponentPresentationData[] cps = new ComponentPresentationData[1];
cps[0]
= new ComponentPresentationData();
LinkToComponentData linkToComponentData = new LinkToComponentData();
linkToComponentData.IdRef
= componentTcmUri.ToString();
cps[0].Component
= linkToComponentData;
LinkToComponentTemplateData
linkToComponentTemplateData = new LinkToComponentTemplateData();
linkToComponentTemplateData.IdRef
= ctTcmUri.ToString();
cps[0].ComponentTemplate
= linkToComponentTemplateData;
pageData.ComponentPresentations
= cps;
IdentifiableObjectData objectData =
_coreServiceClient.Create(pageData, ReadOptions);
return new TcmUri(objectData.Id);
}
Comments
Nice naming conventions and clean code, too (no hard-coded ids!). Are the LinkTo...Data objects your own--are they helping manage IDs?