如果组件在页面中作为组件表示,那么为什么不直接使用组件链接来查找它呢?将组件的 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 - 确保不是这种情况......我可以在代码中正确处理,但我认为我应该不要做所有的功课。