ComponentLink作为发布级别的元数据,找到使用相应组件的页面

时间:2012-06-13 09:51:36

标签: c# tridion

在TBB中,我试图使用Criterias和Query来查找一个页面,它正在使用具有特定TcmUri的Component。

我在sdllive上搜索了一个例子,但我找不到。

有人能举例说明我该怎么办?

完整的方案是:

我将ComponentLink设置为发布上的元数据字段。此ComponentLink是一个登录组件。使用Component的页面提供了网站的登录功能。现在,我在发布站点管理员时从发布中读取元数据,获取用作ComponentLink的组件的tcmId(我已经这样做了)并找到使用组件(登录页面)的页面以获取路径此登录页面并将其写入web.config。

4 个答案:

答案 0 :(得分:2)

如果组件在页面中作为组件演示文稿,那么为什么不使用组件链接来查找它?将组件的URI存储在Web.Config中,如果这对您来说最简单,那么请使用以下内容:

const string currentPageId = "tcm:6-123-64";
TcmUri itemUri = new TcmUri(ConfigurationManager.AppSettings["MyLoginComponent"]);
ComponentLink componentLink = new ComponentLink(itemUri.PublicationId);

string loginUrl =
    componentLink.GetLink(currentPageId, itemUri.ToString(), "tcm:0-0-0", "", "",
                          false, false).Url;

如果您希望在发布时使用TBB找到此信息:

RepositoryLocalObject context = null;
if (package.GetByName(Package.ComponentName) == null)
    context = (RepositoryLocalObject)engine.GetObject(
               package.GetByName(Package.ComponentName));
else
    context = (RepositoryLocalObject)engine.GetObject(
               package.GetByName(Package.ComponentName));

Repository contextPublication = context.ContextRepository;
if (contextPublication.Metadata == null) return;
ItemFields metadata = 
     new ItemFields(contextPublication.Metadata, contextPublication.MetadataSchema);
if (!metadata.Contains("MyLoginComponentField")) return;

ComponentLinkField myLoginComponentField = (ComponentLinkField)metadata["MyLoginComponentField"];
Component loginTarget = myLoginComponentField.Value;

UsingItemsFilter filter = new UsingItemsFilter(engine.GetSession())
                                {
                                    InRepository = contextPublication, 
                                    ItemTypes = new[] {ItemType.Page}
                                };

foreach (Page page in component.GetUsingItems(filter))
{
    string url = page.PublishLocationUrl;
}

如果组件在多个页面中使用,那么这将包含列表中最后一页的URL - 确保不是这种情况......我可以在代码中正确处理,但我想我不应该做你所有的功课。

答案 1 :(得分:0)

Nuno是对的 - Tridion的动态组件链接功能将完全满足您的需求。 Nuno的示例使用应用程序配置数据,但您可以像在问题中建议的那样轻松地使用发布数据来引用您的登录组件。

有时您没有明显的组件可链接到页面上。例如,主页或子站点主页通常实际上不具有内容。如果是这样,那么你可以通过在页面上放置一个虚拟组件来做同样的事情,这个组件就是你的链接目标,并使用一个不会产生任何额外输出的模板来渲染它。

答案 2 :(得分:0)

我接受了Nuno建议的方法,我现在拥有以下内容:

        StringBuilder url = new StringBuilder();
        RepositoryLocalObject context = null;
        if (package.GetByName(Package.ComponentName) == null)
            context = (RepositoryLocalObject)engine.GetObject(
                       package.GetByName(Package.PageName));
        else
            context = (RepositoryLocalObject)engine.GetObject(
                       package.GetByName(Package.ComponentName));

        Repository contextPublication = context.ContextRepository;

        _log.Debug("Starting checking the metadata");
        if (contextPublication.Metadata != null)
        {
            ItemFields metadata =
             new ItemFields(contextPublication.Metadata, contextPublication.MetadataSchema);
            if (metadata.Contains("LoginPage"))
            {
                _log.Debug("LoginPage metadata field found in " + metadata.ToXml().OuterXml);
                ComponentLinkField myLoginComponentField = (ComponentLinkField)metadata["LoginPage"];
                Component loginTarget = myLoginComponentField.Value;

                UsingItemsFilter filter = new UsingItemsFilter(engine.GetSession())
                {

                   // InRepository = contextPublication,
                    ItemTypes = new[] { ItemType.Page }

                };

                foreach (comm.Page page in loginTarget.GetUsingItems(filter))
                {
                    if(PublishEngine.IsPublished(page))
                    {
                        url.Append(" url: ").Append(page.PublishLocationUrl);
                    }
                }
            }
        }
        return url.ToString();

现在我只是将所有页面路径读作单个字符串。

答案 3 :(得分:0)

我设法通过实施此方法来过滤版本:

public static bool IsPageLastVersion(Page page)
    {
        bool isLastVersion = false;
        if (page != null)
        {
            List<VersionedItem> pageVersions = page.GetVersions().ToList();
            pageVersions.Sort((v1, v2) => v1.Version.CompareTo(v2.Version));
            int lastVersion = pageVersions.Last().Version;
            isLastVersion = lastVersion == page.Version;
        }
        return isLastVersion;
    }