0

TBBで、特定のTcmUriを持つコンポーネントを使用しているCriteriasandQueryを使用してページを見つけようとしています。

sdlliveで例を検索しましたが、見つかりませんでした。

誰かが私にこれを行う方法の例を教えてもらえますか?

完全なシナリオは次のとおりです。

パブリケーションのメタデータフィールドとしてComponentLinkを設定しています。このComponentLinkはログインコンポーネントです。コンポーネントが使用されているページは、Webサイトのログイン機能を提供します。ここで、サイトマスターを公開するときにパブリケーションからメタデータを読み取り、ComponentLinkとして使用されるコンポーネントのtcmIdを取得し(すでにこれを実行しました)、コンポーネントを使用しているページ(ログインページ)を見つけて、このログインページをweb.configに書き込みます。

4

4 に答える 4

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が含まれます-そうでないことを確認してください...コードで適切に処理できたはずですが、すべきではないと思いました宿題を全部やらないで。

于 2012-06-13T11:11:30.810 に答える
0

Nunoは正しいです-Tridionの動的コンポーネントリンク機能は、ニーズを正確に満たします。Nunoの例ではアプリケーション構成データを使用していますが、質問で提案したように、パブリケーションデータを使用してログインコンポーネントを参照することも簡単にできます。

ページ上にリンクする明確なコンポーネントがない場合があります。たとえば、ホームページやサブサイトのホームページには、実際にはコンテンツが含まれていないことがよくあります。その場合は、リンクターゲットであるページにダミーのコンポーネントを配置し、余分な出力をレンダリングしないテンプレートを使用してレンダリングすることで、同様に行うことができます。

于 2012-06-14T22:00:22.000 に答える
0

私はヌーノが提案したアプローチを取りました、そして私が今持っているものは次のとおりです:

        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();

今のところ、すべてのページパスを単一の文字列として読み取るだけです。

于 2012-06-15T08:39:03.757 に答える
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;
    }
于 2012-06-18T09:51:31.423 に答える