7

我正在研究这个 Tridion 实现,它有一堆非常不同的网站,但是一些内容(如新闻)是通过蓝图的基本 Tridion 原则共享的。网站都使用相同的语言,所以我们只处理品牌差异。

当前情况:有一个名为 Global content 的出版物,其中创建了此全局内容。在架构中,有一些复选框可以选择应该出现此内容的子出版物。当组件被保存时,事件系统启动并创建带有组件的页面,发布它等等......不会删除组件,只有未选中所有复选框的重新保存最终将通过批处理删除页面.

经纪人情况:我想开始使用经纪人。更重要的是,因为在未来的情况下,网站也将开始与外部网站共享更多内容,我打算通过 RSS 提要或基本 API 来完成,这最适合来自 Broker 的内容。

场景:

  1. 允许此全局内容发布发布动态内容,并在其他站点上直接从代理中提取该内容(使用全局内容发布 ID?)
  2. 在全球内容中制作一个虚假的空目标,以便他们可以说“发布/取消发布到所有子出版物?” (您仍然可以使用复选框来允许它在某些出版物中发布)
  3. 使用全球内容网站发布动态内容并创建 API/RSS 提要供内部和外部网站使用?
  4. 还有什么?

我最初的想法是针对第一种情况,但我可以看到主要缺点是混合本地(化)新闻项目和全球新闻项目变得更加困难。

第二种情况似乎是第二好的机会。任何人都有这样的实现经验吗?

4

2 回答 2

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);
            }
        }
    }
}
于 2012-03-22T10:37:00.510 回答
2

在传统的 Tridion 架构中,您最好的选择可能是通过 BluePrint 进行继承。这意味着在所有出版物中的所有代理中都有可用的内容,并确定从元数据中显示哪些项目。

正如 Bart 所建议的那样,这种设计存在一些浪费的方面,因此您可能宁愿从单个网站“联合”全球内容的角度来考虑。这就是 Content Delivery Web 服务的用途。如果您使用 Tridion 2011,您可以有效地选择您的选项 3,但具有比以往更多的开箱即用支持,因此您不必构建 API,只需使用它即可。

于 2012-03-23T07:47:33.023 回答