我正在研究这个有很多不同网站的Tridion实现,但是一些内容(如新闻)是通过蓝图的基本Tridion原则共享的。网站都使用相同的语言,因此我们只处理品牌差异。
当前情况:有一个名为Global content的出版物,其中创建了此全局内容。在架构中有一些复选框,可以选择显示此内容的子出版物。当组件被保存时,事件系统启动并创建包含组件的页面,发布它等等...组件的删除不会发生,只有未选中所有复选框的重新保存最终将通过批处理删除页面
经纪人情况:我想开始使用经纪人。更重要的是,因为在未来的情况下,网站也将开始向外部网站分享更多内容,我将通过RSS源或基本API进行更多内容,这些内容最适合来自经纪人的内容。
方案:
我最初想到的是第一种情况,但我可以看到主要的缺点是混合本地(新闻)新闻和全球新闻项目会变得更加困难。
第二种情况似乎是第二好的机会。任何人都有这样的实现经验吗?
答案 0 :(得分:6)
关于我目前正在开发的实现,我们使用的是第二种解决方案。我将网站主要出版物(我们在其中创建所有页面)添加到我们用于所有网站的出版目标,以便我们可以使用发布到那里的所有子出版物。如果它适合您的模型,我更喜欢这个选项,因为它继续通过本地化在子出版物中控制项目。
因为我们不想在网站主要出版物上呈现内容(因为这不会在任何地方出现,只会浪费我的发布者处理器时间,然后在部署时浪费代理存储),我们创建了一个ChildOnlyPublicationResolver(SDL Tridion 2011)。在这个解析器中,我们循环遍历所有已解析的项目,如果该项目来自网站主要出版物,我们将其从列表中删除。
结果是您将看到网站主要出版物出现在发布队列中,但由于无法在其中呈现任何内容,因此它将几乎立即设置为成功。因此,它不会从出版商那里获得任何表现,也不会进行部署,但是您可以保留子出版物的好处,并且可以轻松地一次性发布它们。
如果有兴趣,这里是解析器代码的示例:
using System.Collections.Generic;
using Tridion.ContentManager;
using Tridion.ContentManager.Publishing;
using Tridion.ContentManager.Publishing.Resolving;
namespace SDL.Example.Resolvers
{
public class ChildOnlyPublicationResolver : IResolver
{
/// <summary>
/// Master Publication TCMURI
/// </summary>
private const string MasterPublicationTcmUri = "tcm:0-2-1";
/// <summary>
/// For publish and unpublish, remove all items from the master publication from the list.
/// </summary>
/// <param name="item">Item to be resolved (e.g. a page, structure group, template)</param>
/// <param name="instruction">Resolve instruction</param>
/// <param name="context">Publish context</param>
/// <param name="resolvedItems">List of items that are currently to be rendered and published (added by previous resolvers in the chain)</param>
public void Resolve(IdentifiableObject item, ResolveInstruction instruction, PublishContext context, Tridion.Collections.ISet<ResolvedItem> resolvedItems)
{
List<ResolvedItem> itemsToRemove = new List<ResolvedItem>();
TcmUri masterPublicationUri = new TcmUri(MasterPublicationTcmUri);
// check for items from master publication (these do not need to be published or unpublished)
foreach (ResolvedItem resolvedItem in resolvedItems)
{
// mark all items from website structure publication for removal
if (resolvedItem.Item.Id.PublicationId == masterPublicationUri.ItemId)
{
itemsToRemove.Add(resolvedItem);
}
}
// remove all items that we need to discard
foreach (ResolvedItem itemToRemove in itemsToRemove)
{
resolvedItems.Remove(itemToRemove);
}
}
}
}
答案 1 :(得分:2)
在传统的Tridion架构中,您最好的选择可能是通过BluePrint继承。这意味着在所有出版物中的所有代理中都可以获得内容,并确定要从元数据中显示哪些项目。
正如Bart所说,这个设计有一些浪费的方面,所以你可能宁愿考虑从一个网站“联合”全球内容。这就是Content Delivery Web服务的用途。如果你使用的是Tridion 2011,你可以有效地选择你的选项3,但是拥有比以前更多的开箱即用支持,所以你不必构建API,只需使用它。